Le moteur générique¶
Principe¶
Un seul processus, ALL - Prochaine étape, fait avancer n'importe quel équipement dans n'importe quelle séquence. Il ne connaît pas les séquences « en dur » : il lit de la configuration.
Deux tables, portées par des variables globales, décrivent chaque séquence :
SEQUENCE_ORDER[type]: la liste ordonnée des numéros d'étape. Ex.CC=[10, 20, 30, 40, 51, …].SEQUENCE_ACTIONS[type][étape]: le BPM à lancer pour chaque étape.
L'avancement se fait par index + 1 : le moteur trouve l'étape courante dans SEQUENCE_ORDER, prend la suivante, et lance le BPM correspondant.
Déroulé d'un passage¶
flowchart TD
A[Constantes<br/><br/>Charge les globaux] --> B[Séquence - ordre et actions<br/><br/>Construit SEQUENCE_ORDER / ACTIONS]
B --> C[Infos production<br/><br/>Lit OF, cycle, étape sur l'équipement]
C --> D[Récupérer le type de séquence<br/><br/>Lit CYCLE_TYPE_SEQUENCE]
D --> E[Calcul du code de séquence<br/><br/>Libellé → code via SEQUENCE_CODES]
E --> F[Nouvelle étape<br/><br/>Index+1 → étape suivante + BPM]
F --> G{Étape connue ?}
G -- non --> H[Alerte séquence]
G -- oui --> I{BPM connu ?}
I -- non --> J[Alerte BPM]
I -- oui --> K[Mise à jour étape] --> L[Lancer le processus technique]
D'où vient le type de séquence ?¶
Le moteur tourne sur l'équipement, mais lit le type de séquence sur le cycle courant (EP_WIW_CYCLE → CYCLE_TYPE_SEQUENCE). Ce champ contient un libellé technique (extraction, concentration___chaud). Il est converti en code court (EX, CC) via le global SEQUENCE_CODES. C'est ce code court qui indexe toutes les tables.
Source unique
Le type descend de l'OF vers le cycle à la planification (OF_TYPE_SEQUENCE → CYCLE_TYPE_SEQUENCE), puis du cycle vers le moteur. Une seule source qui descend, donc pas de table refId → type à maintenir.
Le modèle « un événement = une avance »¶
Le moteur lance les BPM d'étape sans les attendre : il ne bloque pas sur leur exécution. C'est un événement de complétion (fin d'un automate, validation d'un opérateur) qui relance Prochaine étape : un événement, une avance.
En conséquence, une étape qui n'émet pas d'événement propre (étape sautée, mode dégradé) doit s'auto-avancer, en relançant Prochaine étape avec les paramètres entityId = ep_id et nouvelle_etape_forcee = 999 (999 = « avance normalement d'un cran »).
Forçage d'étape¶
Le paramètre nouvelle_etape_forcee permet de sauter vers une étape précise (au lieu de index + 1). Il est utilisé essentiellement pour les embranchements conditionnels (ex. « caisse déjà présente → sauter directement à l'étape 100 »). La valeur 999 permet d'avancer normalement d'un cran.
Le forçage sert aussi à reboucler : une fin de passe qui décide de refaire un tour force le retour à l'étape du début de passe (ex. CC : retour à l'étape 30, concentration) au lieu d'avancer. Voir le choix de fin de passe CC.
Clôture de cycle vs fin de passe¶
Deux étapes terminales à ne pas confondre (voir le vocabulaire) :
- Fin de passe (ex. CC étape 45) : décision métier de refaire un tour d'équipement ou de continuer la séquence. Ne ferme rien.
- Clôture de cycle (
ALL - Clôture de cycle, étapes 100/170) : ferme l'entité cycle en fin de séquence (poids produit, passage en activitéCLOTURE), puis laisse la place àALL - Déclaration de fin d'ordre de fabricationqui décide si l'OF est terminé.