Construisez vos diagrammes SFC sous forme de classes Python, et voyez l'éditeur visuel se mettre à jour en direct.
L'éditeur visuel de séquence est rapide pour ébaucher, mais Python permet ce que le glisser-déposer ne sait pas faire :
forLes deux vues sont toujours synchronisées. Chaque fichier .seq possède une source Python et une représentation graphique, et AutomationView régénère l'une à partir de l'autre à chaque enregistrement.
Basculez via la palette de commandes (Ctrl+Shift+P) :
| Commande | Effet |
|---|---|
AutomationView: Open Visual Editor |
Afficher le diagramme SFC graphique |
AutomationView: Open Text Editor |
Afficher la source Python |
automation_machineChaque fichier de séquence commence par importer ce dont il a besoin depuis automation_machine. Les imports les plus courants :
from automation_machine import (
Sequence,
StepType,
ActionQualifier,
ActionInstruction,
)
| Nom | Rôle |
|---|---|
Sequence |
Classe de base - votre séquence en hérite |
StepType |
Énumération - INITIAL, NORMAL, MACRO, ENCLOSING |
ActionQualifier |
Énumération - contrôle quand une action s'exécute (N, S, R, P, D, L, SD, DS, SL) |
ActionInstruction |
Énumération - contrôle ce que l'action fait (TON, MOVE, CTU...) |
Pour l'ensemble de l'API, voir la référence de l'API Python.
Une séquence est une classe qui hérite de Sequence et implémente setup(). AutomationView appelle setup() une fois lorsque le fichier est analysé.
from automation_machine import Sequence, StepType
class MaSequence(Sequence):
def setup(self):
# 1. Déclarer les étapes
# 2. Déclarer les transitions
# 3. Attacher les actions aux étapes
pass
La méthode
setup()est le point d'entrée du cycle de vie utilisé par AutomationView. Ne mettez pas les déclarations d'étapes ou de transitions dans__init__- elles vont danssetup().
self.add_step() crée une étape et renvoie une instance Step. Conservez la référence pour y rattacher transitions et actions par la suite.
s0 = self.add_step(StepType.INITIAL, name="Idle")
s1 = self.add_step(name="Extending")
s2 = self.add_step(name="Retracted")
| Paramètre | Type | Notes |
|---|---|---|
step_type |
StepType |
Par défaut NORMAL. Exactement une étape doit être INITIAL. |
name |
str |
Affiché dans le diagramme. Optionnel mais recommandé. |
comment |
str |
Documentation libre, visible au survol. |
Chaque séquence doit comporter exactement une étape
StepType.INITIAL. À défaut, le SFC reste sans point d'entrée et le validateur signale le fichier.
Une transition relie une étape source à une étape cible ; elle est franchie lorsque sa condition booléenne vaut TRUE.
self.add_transition(s0, s1, condition="start_button AND NOT safety_fault")
self.add_transition(s1, s2, condition="sensor_extended")
self.add_transition(s2, s0, condition="sensor_retracted")
| Paramètre | Type | Notes |
|---|---|---|
source_step |
Step ou list[Step] |
Étape unique ou liste (convergence) |
target_step |
Step ou list[Step] |
Étape unique ou liste (divergence) |
condition |
str |
Expression booléenne : variables, opérateurs, sorties d'instructions |
comment |
str |
Note en ligne, optionnelle |
Les conditions s'écrivent en texte IEC 61131-3 : AND, OR, NOT, =, <>, <, >, <=, >=. Les variables se référencent par leur nom, les sorties d'instructions via la notation pointée (timer_extend.Q, counter.CV).
Les actions sont portées par les étapes. Elles décrivent ce que fait l'automate tant qu'une étape est active.
s1.add_action(
"cmd_extend",
description="Énergiser le solénoïde d'extension",
qualifier=ActionQualifier.N,
)
| Paramètre | Type | Notes |
|---|---|---|
name |
str |
Variable ou instance de bloc fonctionnel pilotée par l'action |
description |
str |
Libellé lisible affiché dans le diagramme |
qualifier |
ActionQualifier |
Quand l'action s'exécute - N par défaut (non mémorisé) |
instruction |
ActionInstruction |
Ce que fait l'action : temporisateur, opération arithmétique, compteur, etc. |
duration |
float |
Requis pour les temporisateurs et les qualificatifs temporisés (millisecondes) |
operands |
list[ActionOperand] |
Entrées pour les instructions multi-opérandes comme ADD |
condition |
str |
Expression de conditionnement optionnelle, propre à l'action |
L'action valide la plus simple se contente de piloter une sortie booléenne :
s1.add_action("cmd_extend")
Le qualificatif N par défaut s'applique : la variable vaut TRUE tant que l'étape est active, FALSE sinon.
Voir la référence des qualificatifs et la référence des instructions pour la liste complète des valeurs prises en charge.
Scénario industriel courant : un vérin pneumatique sort sur commande opérateur, attend la confirmation du capteur avant, recule après une temporisation d'une seconde, puis attend le capteur arrière avant de revenir au repos.
from automation_machine import Sequence, StepType, ActionQualifier, ActionInstruction
class CylinderCycle(Sequence):
"""Cycle d'extension/recul pour un vérin pneumatique."""
def setup(self):
# --- Étapes ---
s_idle = self.add_step(StepType.INITIAL, name="Idle")
s_extend = self.add_step(name="Extending")
s_hold = self.add_step(name="Hold")
s_retract = self.add_step(name="Retracting")
# --- Transitions ---
self.add_transition(
s_idle, s_extend,
condition="cmd_start AND NOT emergency_stop",
)
self.add_transition(
s_extend, s_hold,
condition="sensor_front",
)
self.add_transition(
s_hold, s_retract,
condition="hold_timer.Q",
)
self.add_transition(
s_retract, s_idle,
condition="sensor_rear",
)
# --- Actions ---
# Idle : rien à piloter
s_idle.add_action("ready_lamp", description="Voyant cycle prêt")
# Extending : énergiser le solénoïde d'extension
s_extend.add_action("sol_extend", description="Solénoïde extension")
# Hold : démarrer un temporisateur d'une seconde
s_hold.add_action(
"hold_timer",
description="Temporisation d'une seconde en fin de course",
instruction=ActionInstruction.TON,
duration=1000,
)
# Retracting : énergiser le solénoïde de recul
s_retract.add_action("sol_retract", description="Solénoïde recul")
Enregistrez le fichier. L'éditeur visuel affiche aussitôt le diagramme à quatre étapes, transitions et actions câblées. Appuyez sur F5 pour lancer l'émulation API et parcourez le cycle en forçant cmd_start, sensor_front puis sensor_rear dans le panneau Variables.
L'enregistrement fonctionne dans les deux sens :
| Vous modifiez... | AutomationView régénère... |
|---|---|
| La source Python | Le diagramme visuel |
| Le diagramme visuel | La source Python |
Les deux formats restent synchronisés : esquissez dans le diagramme, affinez en Python, sans jamais perdre de travail.
| Symptôme | Cause | Correctif |
|---|---|---|
| La séquence ne démarre jamais | Aucune étape StepType.INITIAL |
Marquer une étape comme initiale |
| Étape grisée dans le diagramme | L'étape n'a pas de transition entrante | Ajouter une transition qui la cible |
| Le validateur signale « étape inaccessible » | Étape non atteignable | La câbler ou la supprimer |
NameError: s1 is not defined dans une méthode |
Étapes stockées en variables locales | Les stocker sur self (self.s1 = ...) si elles sont utilisées dans des méthodes auxiliaires |
| Le temporisateur ne se déclenche jamais | duration oublié sur une action TON |
Ajouter duration=<ms> |
| Deux séquences portent le même nom | Collision de noms de classes entre fichiers | En renommer une - AutomationView signale les doublons en ligne |