Vérifiez vos séquences face à un procédé virtuel réaliste avant le déploiement sur un automate physique.
Un modèle de procédé calcule les entrées des capteurs (inputs) à partir des sorties de l'automate (outputs) et du temps de cycle écoulé (dt).
Créez plant/line.mjs dans le dossier de votre projet :
export const INITIAL_INPUTS = {
part_present: false,
part_is_metal: false,
clamp_is_retracted: true,
clamp_is_extended: false,
pusher_is_retracted: true,
pusher_is_extended: false,
};
let clampPos = 0;
let pusherPos = 0;
export function step(outputs, dt, inputs) {
const speed = dt / 0.25;
clampPos = outputs.clamp_extend ? Math.min(1, clampPos + speed) : Math.max(0, clampPos - speed);
pusherPos = outputs.pusher_extend ? Math.min(1, pusherPos + speed) : Math.max(0, pusherPos - speed);
return {
clamp_is_retracted: clampPos <= 0.05,
clamp_is_extended: clampPos >= 0.95,
pusher_is_retracted: pusherPos <= 0.05,
pusher_is_extended: pusherPos >= 0.95,
};
}
Pour les vérins et convoyeurs standards qui ne nécessitent pas de script personnalisé, vous pouvez également utiliser un fichier déclaratif
plant.yamlà la racine de votre projet.
automationview.emulation.plantConfigPath) sur plant/line.mjs (ou plant.yaml).clamp_extend, le modèle de procédé fait passer clamp_is_retracted à FALSE puis clamp_is_extended à TRUE après 250 ms..yaml automatisésCréez des fichiers de test reproductibles dans un dossier tests/ pour valider les cycles normaux de production, les changements de recette et les alarmes de surveillance.
tests/normal_cycle.yaml)name: "Normal Sorting Cycle"
project: ".."
cycle_ms: 10
plant: "../plant/line.mjs"
max_time: 60s
steps:
- set: { start_button: true, part_present: true, part_is_metal: true }
- wait: 100ms
- set: { start_button: false }
- wait_until: "sorted_metal == 1"
timeout: 15s
- assert: "sorted_total == 1"
message: "Total sorted count must increment after sorting a metal part"
- expect_active: ["Coordination.WaitPart"]
tests/jam_fault.yaml)Utilisez force et release pour simuler un capteur de fin de course bloqué et vérifier que la séquence bascule bien dans son étape de défaut :
name: "Cylinder Jam Watchdog Test"
project: ".."
cycle_ms: 10
plant: "../plant/line.mjs"
max_time: 30s
steps:
- force: { clamp_is_extended: false }
- pulse: { start_button: 100ms }
- set: { part_present: true }
- wait_until: "clamp_error == true"
timeout: 5s
- assert: "fault_active == true"
message: "Machine fault flag must activate when clamp watchdog expires"
- release: [clamp_is_extended]
| Action | Syntaxe | Rôle |
|---|---|---|
| Définir des entrées | set: { var: value } |
Écrire des valeurs dans une ou plusieurs variables d'entrée |
| Impulsion d'entrée | pulse: { var: 100ms } |
Maintenir une entrée booléenne à TRUE pendant une durée, puis la remettre à FALSE |
| Forcer une variable | force: { var: value } |
Forcer une valeur fixe prioritaire sur le modèle de procédé et les séquences |
| Libérer le forçage | release: [var] |
Retirer le forçage sur les variables listées |
| Attente fixe | wait: 500ms |
Faire avancer l'horloge de simulation d'une durée fixe |
| Attente conditionnelle | wait_until: "expr" |
Faire avancer la simulation jusqu'à ce que l'expression booléenne soit TRUE (échoue si timeout expire) |
| Assertion | assert: "expr" |
Vérifier immédiatement l'expression booléenne ; fait échouer le test avec message si FALSE |
| Vérification d'étape active | expect_active: ["Seq.Step"] |
Vérifier que des étapes spécifiques sont actives au cycle courant |