用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
直接命令不会经过审查 Prompt;运行前请先检查来源。
npx skills add https://github.com/JohnNuwan/EVA_CORE --skill automation-linter命令会保持在同一行。复制前请横向滚动并检查完整内容。
想先保存到本地?可下载 SkillsMP 当前能够提供的文件。
基于 SOC 职业分类
正在显示 SKILL.md
| 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.