Coordonnez plusieurs postes sur une ligne de production automatisée grâce à des Poignées de Main Maître-Esclave déterministes et des verrouillages de zones.
Sur les lignes d'assemblage industrielles, les machines sont composées de sous-ensembles découplés (ex. : Poste d'alimentation, Portique Pick-and-Place, Presse d'emmanchement, Poste d'évacuation et contrôle).
Regrouper tous les postes dans un seul Grafcet monolithique crée des blocages et rend la maintenance impossible. Le standard éprouvé en bureau d'études consiste à créer des Séquences Postes Découplées synchronisées par des signaux d'échange explicites :
bReq_Start : Le superviseur demande au poste de démarrer son traitement.bAck_Busy : Le poste acquitte la demande et signale son travail en cours.bDone_PartReady : Le poste signale la fin du cycle et la mise à disposition de la pièce.bZone_Clear : Verrouillage matériel confirmant que la zone partagée est dégagée.+----------------+ bReq_Start +----------------+
| | -------------------> | |
| SUPERVISEUR | | POSTE 1 |
| MAÎTRE LIGNE | <------------------- | (ALIMENTATION) |
| | bDone_PartReady | |
+----------------+ +----------------+
|
| bReq_Start +----------------+
+-----------------------------> | |
| POSTE 2 |
<----------------------------- | (PICK & PLACE) |
bDone_PartReady +----------------+
Ce protocole élimine tout risque d'aléa de commutation :
bReq_Start_Stn1 = TRUE dès que les conditions amont et la sécurité sont réunies.bAck_Busy_Stn1 = TRUE et exécute son Grafcet local.bDone_PartReady_Stn1 = TRUE et retombe bAck_Busy_Stn1 = FALSE.bDone_PartReady_Stn1, enregistre le transfert de la pièce et retombe bReq_Start_Stn1 = FALSE.bReq_Start_Stn1, le poste remet bDone_PartReady_Stn1 = FALSE et retrouve son étape initiale.Ouvrez station_pick_place.seq pour modéliser la sous-séquence subordonnée.
from automation_machine import Sequence, StepType
class StationPickAndPlace(Sequence):
def setup(self):
s0 = self.add_step(StepType.INITIAL, name="Wait_For_Master_Req")
s1 = self.add_step(name="Process_Cycle")
s2 = self.add_step(name="Signal_Completion")
s3 = self.add_step(name="Wait_Master_Handshake_Clear")
self.add_transition(s0, s1, condition="bReq_Start_Stn2 AND bZone_Clear_Stn2")
self.add_transition(s1, s2, condition="bPart_Transferred")
self.add_transition(s2, s3, condition="NOT bReq_Start_Stn2")
self.add_transition(s3, s0, condition="NOT bDone_PartReady_Stn2")
s1.add_action("bAck_Busy_Stn2", "Poste en cours d'usinage")
s2.add_action("bDone_PartReady_Stn2", "Poste termine")
Lorsque deux postes partagent un même volume physique (ex. : sortie convoyeur et préhenseur robot), utilisez des jetons booléens de zone :
Condition d'entrée en zone : bZone_Clear_Shared AND NOT bRobot_In_Shared_Zone
Action entrée de zone : SET bRobot_In_Shared_Zone
Action sortie de zone : RESET bRobot_In_Shared_Zone
bReq_Start_Stn2 = TRUE et bZone_Clear_Stn2 = TRUE.Wait_For_Master_Req vers Process_Cycle.bPart_Transferred = TRUE.bDone_PartReady_Stn2 s'enclenche, puis retombe proprement dès que le maître libère bReq_Start_Stn2.