Constituez une bibliothèque unique de modules .seq réutilisables (Cylinder, Actuator, Handling) capable de s'adapter aux distributeurs monostables ou bistables, aux capteurs de retour optionnels et aux chaînes de commande multi-opérations sur l'ensemble de votre ligne de production.
Chaque module réutilisable expose une interface standard de commande et d'acquittement à la séquence maîtresse de coordination :
| Variable dynamique | Type | Rôle |
|---|---|---|
{cmd} |
STRING |
Chaîne de commande envoyée par la séquence maîtresse (par exemple "E", "ER", "ODCU1DOUC2") |
{execute} |
BOOL |
Drapeau de départ de cycle activé par la séquence maîtresse |
{done} |
BOOL |
Drapeau de fin d'exécution activé par le module lorsque toutes les opérations de {cmd} sont terminées |
{error} |
BOOL |
Drapeau de dépassement de délai (watchdog) activé si un capteur physique ne répond pas à temps |
{idx} / {len} |
INT |
Indice du caractère courant (1..{len}) et longueur totale de {cmd} |
{op} |
STRING |
Opération courante d'un caractère extraite via MID({cmd}, 1, {idx}) |
lib/cylinder.seq et ouvrez-le dans l'Éditeur de séquence.Bistable ValvebistableOFFlib/actuator.seq, créez deux options indépendantes (fb_on et fb_off) pour basculer entre un retour capteur ({is_on} / {is_off} avec surveillance de 3000 ms) et une confirmation par temporisation fixe de 500 ms.Au lieu de déclencher un seul mouvement à la fois, un module peut exécuter une suite d'opérations encodée dans {cmd} (par exemple "ER" pour sortir puis rentrer) :
Idle -> NextOp) : Sélectionnez la transition et appuyez sur A pour attacher des actions de transition qui initialisent la boucle :
MOVE : {idx} := 1LEN : {len} := LEN({cmd})NextOp : Ajoutez une action impulsionnelle (P) avec l'instruction MID pour extraire le caractère de l'opération courante :
MID : {op} := MID({cmd}, 1, {idx})NextOp :
{op} == "E" -> Extending{op} == "R" -> RetractingStepDone : Sélectionnez la transition de bouclage ({idx} < {len} -> NextOp), appuyez sur A et attachez une action de transition ADD ({idx} := {idx} + 1) pour passer au caractère suivant. Lorsque {idx} >= {len}, franchissez la transition vers Complete et activez {done}.Retracting de Cylinder, ajoutez l'action {retract} (qualificateur N).{retract} et sélectionnez Option -> bistable (Present when option is ON).bistable pour vérifier les deux configurations directement sur le canevas.from automation_machine import Sequence, StepType, ActionQualifier, ActionInstruction
class Cylinder(Sequence):
dynamic = True
def setup(self):
self.declare_option("bistable", "Bistable Valve", "Drive retract solenoid coil", default=False)
s_idle = self.add_step(StepType.INITIAL, name="Idle")
s_next = self.add_step(StepType.NORMAL, name="NextOp")
s_ext = self.add_step(StepType.NORMAL, name="Extending")
s_ret = self.add_step(StepType.NORMAL, name="Retracting")
s_step_done = self.add_step(StepType.NORMAL, name="StepDone")
s_complete = self.add_step(StepType.NORMAL, name="Complete")
s_idle.add_action("{done}", "Reset done", qualifier=ActionQualifier.R)
s_next.add_action("{op}", "Extract command char", qualifier=ActionQualifier.P, instruction=ActionInstruction.MID, src="{cmd}", length="1", pos="{idx}")
s_ext.add_action("{extend}", "Extend coil", qualifier=ActionQualifier.N)
with self.option("bistable"):
s_ret.add_action("{retract}", "Retract coil", qualifier=ActionQualifier.N)
s_complete.add_action("{done}", "Signal done", qualifier=ActionQualifier.S)
s_complete.add_action("{execute}", "Clear execute", qualifier=ActionQualifier.R)
t_start = self.add_transition(s_idle, s_next, condition="{execute}")
t_start.add_action("{idx}", "Init index", instruction=ActionInstruction.MOVE, src="1")
t_start.add_action("{len}", "Command length", instruction=ActionInstruction.LEN, src="{cmd}")
self.add_transition(s_next, s_ext, condition='{op} == "E"')
self.add_transition(s_next, s_ret, condition='{op} == "R"')
self.add_transition(s_ext, s_step_done, condition="{is_extended}")
self.add_transition(s_ret, s_step_done, condition="{is_retracted}")
t_more = self.add_transition(s_step_done, s_next, condition="{idx} < {len}")
t_more.add_action("{idx}", "Next char", instruction=ActionInstruction.ADD, src1="{idx}", src2="1")
self.add_transition(s_step_done, s_complete, condition="{idx} >= {len}")
self.add_transition(s_complete, s_idle, condition="NOT {execute}")
Cylinder()
main.machine -> Instances et ajoutez des instances de Cylinder (par exemple clamp avec bistable = OFF et asm_z avec bistable = ON).MOVE : clamp_cmd := "E"R : clamp_doneS : clamp_executeclamp_done dans la condition de transition suivante pour confirmer la fin du mouvement.{variable} et des instancesLEN, MID, CONCAT et manipulation de chaînes