소스 정보
- 저장소
- JohnNuwan/EVA_CORE
- 최근 소스 활동
- 2026년 7월 18일 08:30
- 감지된 SKILL.md 언어
- 프랑스어
- 스타
- 0
- 포크
- 0
설치 방법
기본적으로 소스를 먼저 확인하는 Prompt가 선택됩니다. 직접 명령으로 전환하거나 로컬 사본을 다운로드할 수도 있습니다.
소스 파일 검토
설치 여부를 결정하기 전에 SKILL.md와 SkillsMP에 표시된 보조 파일을 읽어 보세요.
메뉴
기본적으로 소스를 먼저 확인하는 Prompt가 선택됩니다. 직접 명령으로 전환하거나 로컬 사본을 다운로드할 수도 있습니다.
설치 여부를 결정하기 전에 SKILL.md와 SkillsMP에 표시된 보조 파일을 읽어 보세요.
SOC 직업 분류 기준
Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
직접 명령은 검토 Prompt를 거치지 않습니다. 실행하기 전에 소스를 확인하세요.
npx skills add https://github.com/JohnNuwan/EVA_CORE --skill automation-linter명령은 한 줄로 유지됩니다. 복사하기 전에 가로로 스크롤해 전체 내용을 확인하세요.
로컬 사본을 원하시나요? SkillsMP에서 현재 제공할 수 있는 파일을 다운로드하세요.
SKILL.md 표시 중
Concevoir et maintenir un watchdog auto-correcteur pour services HTTP — checks de santé, auto-restart, état persistant, rapports et pièges bash.
Serveur de messagerie sécurisé auto-hébergé (Signal-like) avec Flask + WebSocket + AES-256-GCM + pont EVA
ADAM-SENTINEL — Veilleur technologique 24h/24h. Scanne 10 domaines, cree des rapports, met a jour les skills, alerte sur les CVE et breaking changes.
| name | automation-linter |
| description | Valider les fichiers AWL, L5X, ST et Siemens SCL. |
| version | 2.0.0 |
| author | EVA |
| license | Privée EVA St-Étienne |
| platforms | ["linux","macos","windows"] |
| metadata | {"EVA":{"tags":["industrial-automation","plc","siemens","rockwell","lint","quality","python","static-analysis","code-review","awl","scl","structured-text","l5x"],"related_skills":["siemens-audit","plc-diagnostic","omron-sysmac","plc-converter"]}} |
Cette compétence réalise l'analyse statique des fichiers sources d'automates industriels pour identifier les non-conformités par rapport aux standards de développement. Elle couvre quatre formats majeurs utilisés dans l'industrie manufacturière, chacun avec des règles métier spécifiques héritées des guides de bonnes pratiques des constructeurs (Siemens, Rockwell) et des normes CEI 61131-3.
L'objectif est de garantir la qualité, la maintenabilité et la sécurité du code automate avant son déploiement en production. Un rapport de linting systématique permet également de standardiser les livrables entre équipes de programmation industrielle.
| Format | Extension | Constructeur | Domaine d'application |
|---|---|---|---|
| AWL/STL | .awl | Siemens STEP7 | TIA Portal, SIMATIC S7-300/400/1200/1500 |
| L5X/XML | .l5x | Rockwell Automation | Studio 5000, ControlLogix, CompactLogix |
| Structured Text | .st | Multi-constructeur | CEI 61131-3, Codesys, TwinCAT, EcoStruxure |
| SCL | .scl | Siemens | TIA Portal (équivalent ST Siemens) |
Error (bloquant), Warning (non-conformité), Info (suggestion).À utiliser lorsque l'utilisateur demande :
.awl, .l5x, .st, .scl).M12.0, DB10.DBX0.0)..pbd, .l5k).Le linter étendu est écrit en Python natif et s'exécute à l'aide de l'outil système terminal.
python skills/industrial/automation/automation-linter/scripts/automation_linter.py <chemin_du_fichier>
python skills/industrial/automation/automation-linter/scripts/automation_linter.py <chemin_du_dossier> --recursive
python skills/industrial/automation/automation-linter/scripts/automation_linter.py <chemin> --json -o rapport.json
Le format JSON est conçu pour être exploité par des outils de CI/CD ou des tableaux de bord qualité :
{
"file": "Chemin/vers/FB_Moteur.awl",
"total_issues": 5,
"errors": 1,
"warnings": 3,
"infos": 1,
"issues": [
{
"rule": "AWL-HARDCODED-BIT",
"severity": "Warning",
"line": 142,
"message": "Accès mémoire absolu détecté : M12.0. Utiliser une variable symbolique."
}
]
}
python skills/industrial/automation/automation-linter/scripts/automation_linter.py <chemin> -o rapport.md
Le rapport Markdown est idéal pour les audits clients et les revues de code en équipe.
# Remonter uniquement les erreurs et warnings (ignorer les infos)
python skills/industrial/automation/automation-linter/scripts/automation_linter.py <chemin> --min-severity warning
.awl)Les fichiers AWL (Anweisungsliste / List of Instructions) sont le format texte des blocs Siemens. Les règles suivantes sont appliquées :
| Code règle | Sévérité | Description |
|---|---|---|
| AWL-NAMING-BLOCK | Warning | Avertit si les noms de blocs (FB/FC/DB) ne sont pas rédigés en UPPER_SNAKE_CASE. |
| AWL-MISSING-TITLE | Warning | Alerte si un réseau (NETWORK) ne comporte pas de titre (TITLE =). |
| AWL-SHORT-TITLE | Info | Signale un titre de réseau trop court (moins de 3 caractères). |
| AWL-MISSING-COMMENT | Info | Indique un réseau sans aucun commentaire (lignes commençant par //). |
| AWL-HARDCODED-BIT | Warning | Détecte l'usage de bits mémoires absolus (ex: M12.0, I0.1, Q4.3). |
| AWL-HARDCODED-WORD | Warning | Détecte l'usage de mots/double mots absolus (ex: MW100, MD4). |
| AWL-HARDCODED-IO | Warning | Détecte l'accès direct aux périphériques (ex: PIW256, PQD20). |
| AWL-HARDCODED-DB | Warning | Détecte l'accès absolu aux DBs (ex: DB10.DBX0.0, DB5.DBW12). |
Exemple de code conforme :
NETWORK
TITLE = GESTION_VANNE_ENTREE
// Séquences de démarrage de la vanne d'entrée
A "Vanne_Entree.Auto_Mode"
A "Vanne_Entree.Demande_Ouverture"
S "Vanne_Entree.Commande_Ouverture"
A "Vanne_Entree.Fin_Course_Ouverte"
R "Vanne_Entree.Commande_Ouverture"
.l5x)Les fichiers L5X sont le format XML d'export de projets Studio 5000 (ControlLogix / CompactLogix).
| Code règle | Sévérité | Description |
|---|---|---|
| L5X-TAG-LENGTH | Warning | Signale un nom de tag dépassant 40 caractères (limite recommandée Studio 5000). |
| L5X-TAG-INVALID-CHAR | Error | Signale des caractères interdits dans le nom du tag (espaces, caractères spéciaux). |
| L5X-TAG-NAMING | Info | Suggère d'adopter le format UPPER_SNAKE_CASE ou camelCase cohérent. |
| L5X-MISSING-DESC | Warning | Liste les tags manquant de description dans la déclaration XML. |
| L5X-RUNG-MISSING-COMMENT | Info | Liste les échelons de logique Ladder sans commentaire. |
| L5X-ALIAS-CHECK | Info | Vérifie que les alias ne créent pas de boucles de référence. |
Extrait de tag conforme :
<Tag Name="Convoyeur_01_Moteur_Vitesse" TagType="Base" DataType="REAL"
Dimension="0" Radix="Float" Description="Consigne vitesse convoyeur 01 (m/s)">
</Tag>
.st, .scl)Le Structured Text (ST) est le langage textuel de la norme CEI 61131-3. Le SCL est l'implémentation Siemens.
| Code règle | Sévérité | Description |
|---|---|---|
| ST-NAMING-INPUT | Warning | Valide que les variables d'entrée (VAR_INPUT) utilisent le préfixe i_ ou in_. |
| ST-NAMING-OUTPUT | Warning | Valide que les variables de sortie (VAR_OUTPUT) utilisent le préfixe q_ ou out_. |
| ST-NAMING-STATIC | Info | Valide que les variables statiques/internes (VAR) utilisent le préfixe stat_. |
| ST-NAMING-TEMP | Info | Valide que les variables temporaires (VAR_TEMP) utilisent le préfixe temp_. |
| ST-NAMING-CONST | Info | Valide que les constantes (VAR CONSTANT) utilisent UPPER_SNAKE_CASE. |
| Code règle | Sévérité | Description |
|---|---|---|
| ST-DIV-ZERO | Error | Détecte l'existence de divisions statiques par zéro (ex: / 0 ou / 0.0). |
| ST-INFINITE-LOOP | Error | Détecte les boucles WHILE TRUE sans mécanisme de garde-fou (EXIT, compteur max). |
| ST-UNCLOSED-IF | Error | Détecte les asymétries de fermeture IF (IF sans END_IF). |
| ST-UNCLOSED-CASE | Error | Détecte les asymétries de fermeture CASE (CASE sans END_CASE). |
| ST-UNCLOSED-FOR | Error | Détecte les asymétries de fermeture FOR (FOR sans END_FOR). |
| ST-UNCLOSED-WHILE | Error | Détecte les asymétries de fermeture WHILE (WHILE sans END_WHILE). |
| ST-RANGE-OVERFLOW | Warning | Détecte les affectations hors limites (ex: DINT > 2147483647). |
Exemple de code conforme en ST :
FUNCTION_BLOCK FB_GestionCuve
VAR_INPUT
in_Niveau_Cuve : REAL; // Niveau actuel de la cuve en mètres
in_Seuil_Haut : REAL := 2.5; // Seuil haut de déclenchement
END_VAR
VAR_OUTPUT
out_Vanne_Alimentation : BOOL; // Commande d'ouverture vanne
END_VAR
// Logique métier : régulation de niveau
IF in_Niveau_Cuve > in_Seuil_Haut THEN
out_Vanne_Alimentation := TRUE;
ELSE
out_Vanne_Alimentation := FALSE;
END_IF;
Le script automation_linter.py est structuré en modules distincts pour chaque constructeur :
scripts/
automation_linter.py # Point d'entrée, parsing des arguments, orchestration
rules/
__init__.py
rule_awl.py # Règles Siemens AWL
rule_l5x.py # Règles Rockwell L5X
rule_st.py # Règles Structured Text / SCL
rule_base.py # Classe de base pour les règles
reporters/
reporter_console.py # Sortie terminal
reporter_json.py # Export JSON
reporter_markdown.py # Export Markdown
Le linter peut également être utilisé comme bibliothèque Python :
from skills.automation_linter.scripts.automation_linter import lint_file
results = lint_file("path/to/FB_Moteur.awl", format="awl")
print(f"Nombre d'erreurs : {results.error_count}")
print(f"Nombre d'avertissements : {results.warning_count}")
# Accès aux résultats détaillés
for issue in results.issues:
print(f"[{issue.severity}] Ligne {issue.line}: {issue.message}")
Pour intégrer le linter dans une pipeline d'intégration continue (ex: GitLab CI, GitHub Actions) :
# .gitlab-ci.yml (extrait)
lint-plc:
stage: validate
script:
- python skills/industrial/automation/automation-linter/scripts/automation_linter.py
./projets/ --recursive --json -o rapport-lint.json --min-severity warning
- python -c "
import json
with open('rapport-lint.json') as f:
data = json.load(f)
if data['total_errors'] > 0:
exit(1)
"
artifacts:
paths:
- rapport-lint.json
Mauvaise détection des boucles infinies complexes :
WHILE TRUE mais peut manquer des boucles infinies déguisées (ex: WHILE NOT stop_flag avec stop_flag jamais modifié).Faux positifs sur les divisions par zéro :
/ 0 mais ne distingue pas une division littérale par zéro d'un calcul où le diviseur est une variable nommée zero.--ignore ST-DIV-ZERO) pour les cas validés manuellement.Encodage de fichier non standard :
Erreur : Les fichiers .awl exportés de TIA Portal peuvent avoir des encodages variables (UTF-8, UTF-16, ISO-8859-1).
Correction : Utiliser chardet ou cchardet pour détecter automatiquement l'encodage avant analyse :
import chardet
with open(fichier, 'rb') as f:
raw = f.read()
encodage = chardet.detect(raw)['encoding']
with open(fichier, 'r', encoding=encodage) as f:
contenu = f.read()
Noms de blocs longs en AWL :
--max-block-name-length..venv du projet.--recursive.M, I, Q, DB) sont bien activées..st et .scl couvrent la vérification syntaxique et les conventions de nommage.WHILE TRUE sont détectées comme erreurs de sécurité bloquantes.