用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
直接命令不会经过审查 Prompt;运行前请先检查来源。
npx skills add https://github.com/JohnNuwan/EVA_CORE --skill ignition-scada命令会保持在同一行。复制前请横向滚动并检查完整内容。
想先保存到本地?可下载 SkillsMP 当前能够提供的文件。
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.
基于 SOC 职业分类
正在显示 SKILL.md
| name | ignition-scada |
| description | Programmer en Jython et configurer Ignition SCADA. |
| version | 1.1.0 |
| author | EVA |
| license | Privée EVA St-Étienne |
| platforms | ["linux","macos","windows"] |
| metadata | {"EVA":{"tags":["ignition","scada","jython","python-27","perspective","industrial-automation","tags-generation"],"related_skills":["simplify-code","plan","plc-connectivity"]}} |
La plateforme industrielle Ignition par Inductive Automation repose sur un moteur de script utilisant Jython (Python s'exécutant sur la JVM Java). La syntaxe supportée par défaut est celle de Python 2.7.
Cette compétence fournit à l'agent EVA les directives, conventions d'écriture et recettes de code indispensables pour :
À utiliser lorsque l'utilisateur demande de :
system.tag.readBlocking or system.tag.writeBlocking.system.db.runNamedQuery ou requêtes préparées.Ignition exécutant Jython 2.7, l'agent doit proscrire les syntaxes exclusives à Python 3 :
"Valeur : %s" % val ou "Valeur : {}".format(val).numpy ou pandas standards) ne fonctionneront pas sous Jython. Privilégier les classes Java de la JVM importées directement :
from java.util import ArrayList
list_java = ArrayList()
list_java.add("EVA")
Lors de l'écriture sur des tags de commande de type impulsion (ex: boutons Start, Stop, Reset d'un moteur), il convient de set le tag à True puis à False de façon asynchrone pour ne jamais bloquer le thread de rendu de l'interface client (IHM).
import time
startPath = "%s/Commands/Start" % devicePath
system.tag.writeBlocking([startPath], [True])
def release_pulse():
time.sleep(0.5) # Temporisation physique de l'impulsion (500 ms)
system.tag.writeBlocking([startPath], [False])
system.util.invokeAsynchronous(release_pulse)
Les anciennes fonctions system.tag.read et system.tag.write sont obsolètes. Depuis Ignition 8, il est obligatoire d'utiliser les fonctions bloquantes ou asynchrones prenant des listes pour des raisons de performance.
Règle de performance absolue : Ne jamais appeler readBlocking ou writeBlocking à l'intérieur d'une boucle for ou while. Toujours regrouper les chemins dans une liste unique et appeler la fonction une seule fois.
Lecture groupée optimisée :
# Regroupement des chemins dans une liste unique
paths = ["[default]AS660/EPH/660C1_EPH_AgitCtrl/Status", "[default]AS664/EM/664C6_E_B_INLET/Command"]
results = system.tag.readBlocking(paths)
# Lecture des valeurs avec vérification de qualité
if results[0].quality.isGood():
status_val = results[0].value
else:
status_val = None
Écriture groupée optimisée :
paths = ["[default]AS660/EPH/660C1_EPH_AgitCtrl/Status", "[default]AS664/EM/664C6_E_B_INLET/Command"]
values = [2, 1]
# Renvoie une liste de statuts de qualité d'écriture
write_status = system.tag.writeBlocking(paths, values)
for idx, stat in enumerate(write_status):
if not stat.isGood():
system.util.getLogger("EVA_Ignition").warn("Erreur d'écriture sur le tag : " + paths[idx])
Ne jamais concaténer de chaînes pour composer des requêtes SQL. Toujours configurer et appeler des Named Queries précompilées et paramétrées sur la Gateway.
# Appel d'une requête nommée paramétrée
params = {"motorId": 12, "activeStatus": True}
dataset = system.db.runNamedQuery("MonProjetEVA", "Moteurs/GetActiveLogs", params)
# Parcours propre du dataset Ignition
for row in range(dataset.getRowCount()):
msg = dataset.getValueAt(row, "message")
t_stamp = dataset.getValueAt(row, "t_stamp")
Pour éviter de figer l'interface utilisateur lors de tâches lentes (requête SQL complexe, requête HTTP externe), utiliser system.util.invokeAsynchronous pour déléguer le travail à un thread d'arrière-plan, puis mettre à jour l'IHM de manière sécurisée via system.util.invokeLater :
def task_heavy():
# Opération lente d'arrière-plan
import time
time.sleep(2)
res = "Succès"
# Fonction de retour vers le thread graphique principal (IHM)
def update_gui():
# Mise à jour sécurisée du composant
event.source.parent.getComponent('LabelResult').text = res
system.util.invokeLater(update_gui)
# Lancer la tâche asynchrone sans figer l'IHM
system.util.invokeAsynchronous(task_heavy)
Cette compétence intègre un script Python generate_ignition_config.py pour convertir directement le rapport consolidé de l'audit technique d'automatisme en :
tags.json) définissant l'arborescence des dossiers par Station d'Automatisme (AS), divisée en sous-dossiers EPH (Phases) et EM (Équipements) contenant des instances de UDTs standardisés.ignition_sync.py) appliquant les lectures et écritures groupées pour lier les phases aux équipements.Pour appeler le générateur de configuration, exécutez le script d'assistance via l'outil d'exécution de code (execute_code) avec le snippet suivant :
import subprocess
import os
# Définition des chemins
audit_report = "output/audit/2026-06-18_15/audit_report.md" # Remplacer par le chemin réel du rapport généré
out_tags = "output/audit/2026-06-18_15/ignition_tags.json"
out_script = "output/audit/2026-06-18_15/ignition_sync.py"
cmd = [
".venv/Scripts/python.exe",
"skills/industrial/automation/ignition-scada/scripts/generate_ignition_config.py",
"--audit-report", audit_report,
"--out-tags", out_tags,
"--out-script", out_script
]
print("Génération de la configuration Ignition en cours...")
result = subprocess.run(cmd, capture_output=True, text=True)
print(result.stdout)
if result.stderr:
print("Erreurs :", result.stderr)
readBlocking/writeBlocking)._types_/EPH_Template et _types_/EM_Template).