- i := 0;
- j := 0;
- k := 0;
- l := 0;
- x := 0;
- Synthese_Visu_invisible := FALSE;
- (* SELECTION CIRCUIT *)
- FOR i:=1 TO bitDivers.Nombre_Circuit DO
- (* contrôle circuit isolé ou non *)
- IF Circuits[i].Isoler THEN
- Synthese_Visu_invisible := TRUE;
- END_IF;
- (* Contrôle circuits Aspiration *)
- Aspi_ok := TRUE;
- IF bitDivers.Circuit_Asp_General > 0 THEN
- IF Circuits[bitDivers.Circuit_Asp_General].Graphe <> 30 THEN
- Aspi_ok := FALSE;
- END_IF;
- END_IF;
- FOR j:=0 TO 9 DO
- IF Circuits[i].Circuit_Aspi[j] > 0 THEN
- IF Circuits[Circuits[i].Circuit_Aspi[j]].Graphe <> 30 THEN
- Aspi_ok := FALSE;
- EXIT;
- END_IF;
- END_IF;
- END_FOR;
- (* Lancement des circuits aspiration si un Circuit le demande *)
- IF i < bitDivers.Premier_Circuit_Asp THEN
- IF Circuits[i].Graphe >= 19 THEN
- IF bitDivers.Circuit_Asp_General > 0 THEN
- Circuits[bitDivers.Circuit_Asp_General].Dde_Ext := 1;
- END_IF;
- FOR j:=0 TO 9 DO
- IF Circuits[i].Circuit_Aspi[j] > 0 THEN
- Circuits[Circuits[i].Circuit_Aspi[j]].Dde_Ext := 1;
- END_IF;
- END_FOR;
- END_IF;
- END_IF;
- (*Bouton Attente ou Arret sur NB*)
- IF Circuits[i].Attente_Cycle_NB = 1 THEN
- Circuits[i].Arret_Cycle_NB := 0;
- END_IF;
- IF Circuits[i].Arret_Cycle_NB = 1 THEN
- Circuits[i].Attente_Cycle_NB := 0;
- END_IF;
- (* ARRET SUR ARRET D'URGENCE *)
- IF Circuits[i].Graphe <> 0 AND NOT SYNT_ATU THEN
- Circuits[i].Graphe := 200;
- END_IF;
- (* GESTION DES DEMANDES EXTERIEURES *)
- IF Circuits[i].Dde_Ext = 2 AND (Circuits[i].Graphe = 20 OR Circuits[i].Graphe = 30) THEN
- Circuits[i].Arret := 1;
- END_IF;
- IF Circuits[i].Dde_Ext = 1 AND (Circuits[i].Graphe = 0 OR Circuits[i].Graphe = 100) THEN
- Circuits[i].Marche := 1;
- END_IF;
- (* MARCHE *)
- IF Circuits[i].Marche OR Circuits[i].Graphe = 0 AND (Circuits[i].Visualisation OR Circuits[i].Isoler) THEN
- Circuits[i].Marche := 0;
- IF Circuits[i].Graphe = 18 OR Circuits[i].Graphe = 16 THEN
- Circuits[i].Graphe := 15;
- ELSIF Circuits[i].Graphe = 100 THEN
- Circuits[i].Graphe := 20;
- ELSE
- Circuits[i].Graphe := 5;
- END_IF;
- Circuits[i].Res6 := 0;
- Circuits[i].Res7 := 0;
- Circuits[i].NH := 0;
- Circuits[i].NB := 0;
- Circuits[i].Arret_SPV := 0;
- END_IF;
- (* ARRET *)
- IF Circuits[i].Arret THEN
- Circuits[i].Arret_SPV := 1;
- Circuits[i].Arret := 0;
- IF Circuits[i].Graphe < 20 THEN
- Circuits[i].Graphe := 0;
- ELSIF Circuits[i].Graphe = 100 THEN
- Circuits[i].Graphe := 200;
- ELSE
- Circuits[i].Graphe := 100;
- END_IF;
- END_IF;
- (* GRAFCET DE GESTION DU CIRCUIT *)
- (* GRAFCET DE GESTION DU CIRCUIT *)
- (* GRAFCET DE GESTION DU CIRCUIT *)
- CASE Circuits[i].graphe OF
- 0: (* CIRCUIT A L'ARRET *)
- Circuits[i].Elem_Coupe := 99;
- 5: (* CONTROLE DES ELEMENTS DU CIRCUIT *)
- (* On initialise les circuits aspirations *)
- FOR j:=0 TO 9 DO
- Circuits[i].Circuit_Aspi[j] := 0;
- END_FOR;
- use := FALSE;
- (* On vérifie qu'un élément du circuit n'est pas déjà utilisé 5 fois *)
- FOR j := 0 TO bitDivers.Nombre_Element DO
- nombreUtilisation := 0;
- IF Circuits[i].Elements[j] <> 0 THEN
- (* COMPTAGE D'UTILISATION DE L'ELEMENT D'ORIGINE DANS LE MEME CIRCUIT *)
- IF Circuits[i].Elements[j] = Circuits[i].Elements[0] THEN
- nombreUtilisation := nombreUtilisation +1;
- END_IF;
- (* RECHERCHE DE L'ELEMENT SELECTIONNE DANS LES AUTRES CIRCUITS ACTUELLEMENT EN COURS *)
- FOR k := 1 TO bitDivers.Nombre_Circuit DO
- IF i <> k AND Circuits[k].Graphe > 0 AND Circuits[i].Graphe > 0 THEN
- FOR l := 0 TO bitDivers.Nombre_Element DO
- IF Circuits[k].Elements[l] <> 0 AND Circuits[i].Elements[j] = Circuits[k].Elements[l] THEN
- nombreUtilisation := nombreUtilisation +1;
- END_IF;
- END_FOR;
- END_IF;
- END_FOR;
- END_IF;
- IF nombreUtilisation > 5 THEN
- use := TRUE;
- EXIT;
- END_IF;
- END_FOR;
- IF NOT use THEN
- (* i circuit sélectionné *)
- (* j element sélectionné *)
- FOR j:=0 TO bitDivers.Nombre_Element DO
- (* SI ELEMENT NUL, ON PASSE A L'ELEMENT SUIVANT *)
- IF Circuits[i].Elements[j] <> 0 THEN
- (* k circuit à observer *)
- FOR k:=1 TO bitDivers.Nombre_Circuit DO
- (* SI CIRCUIT OBSERVE = CIRCUIT SELECTIONNE OU LE CIRCUIT OBSERVE EST A L'ARRET, ON PASSE CIRCUIT AU SUIVANT *)
- IF k <> i AND Circuits[k].Graphe > 0 THEN
- (* l element dans le circuit à observer *)
- FOR l:=0 TO bitDivers.Nombre_Element DO
- (* AU PREMIER ELEMENT COMMUN RENCONTRE *)
- IF ((Circuits[k].Elements[l] MOD 1000) = (Circuits[i].Elements[j] MOD 1000)) THEN
- (* COMPTAGE DU NOMBRE D'ELEMENTS COMMUNS CONSECUTIFS JUSQU'A LA PREMIERE DESTINATION *)
- x := 0;
- WHILE Circuits[k].Elements[l + x] MOD 1000 = Circuits[i].Elements[j + x] MOD 1000 DO
- x := x + 1;
- IF Circuits[k].Elements[l + x] = 0 OR Circuits[i].Elements[j + x] = 0 THEN
- EXIT;
- END_IF;
- END_WHILE;
- (* A DESTINATION EGALE, ON OBSERVE LES ELEMENTS SUIVANTS *)
- (* si la suite d'éléments consécutifs ne vont pas sur le même élement *)
- IF Circuits[k].Elements[l + x] MOD 1000 <> Circuits[i].Elements[j + x] MOD 1000 THEN
- (* sauf si destination du circuit observé est l'origine du circuit sélectionné *)
- IF Circuits[k].Elements[l + 1] = 0 AND j = 0 THEN
- EXIT;
- (* ou si l'origine du circuit observé est la destination du circuit sélectionné *)
- ELSIF l = 0 AND Circuits[i].Elements[j + 1] = 0 THEN
- EXIT;
- (* alors on déclare l'élément utilisé *)
- ELSE
- use := TRUE;
- Circuits[i].Def_elem := Circuits[k].Elements[l] MOD 1000;
- Circuits[i].Def_Circuit := k;
- EXIT;
- END_IF;
- END_IF;
- (* pour la suite, on saute à la suite de la série d'éléments consécutifs *)
- l := l + x;
- j := j + x;
- END_IF;
- END_FOR;
- END_IF;
- IF use THEN EXIT; END_IF;
- END_FOR;
- END_IF;
- IF use THEN EXIT; END_IF;
- END_FOR;
- END_IF;
- IF (use) THEN
- Circuits[i].Graphe := 6;
- Circuits[i].Isoler := 0;
- Circuits[i].Visualisation := 0;
- ELSE
- Circuits[i].Graphe := 10;
- END_IF;
- 6: (* !!! ELEMENT UTILISE !!! *)
- ;
- 10: (* ELEMENTS CONTROLES - CHOIX DU MODE DE FONCTIONNEMENT DU CIRCUIT *)
- IF (Circuits[i].Visualisation = 1) THEN
- Circuits[i].Graphe := 16;
- ELSIF (Circuits[i].Isoler = 1) THEN
- Circuits[i].Graphe := 18;
- ELSE
- Circuits[i].Graphe := 15;
- (*Lancement_Cycle_Klaxon:=1;*)
- END_IF;
- 15: (* CONTROLE PREMIER ELEMENT DU CIRCUIT *)
- IF Circuits[i].Elements[0] <> 0 THEN
- (* SI CIRCUIT ASPIRATION ALORS ON LANCE, SINON, ON ATTEND ASPI OK *)
- IF i < bitDivers.Premier_Circuit_Asp THEN
- Circuits[i].Graphe := 19;
- ELSE
- Circuits[i].Graphe := 20;
- END_IF;
- ELSE
- Circuits[i].Graphe := 0;
- END_IF;
- 16: (* VISUALISATION CIRCUIT *)
- IF NOT Circuits[i].Visualisation THEN
- IF Circuits[i].Elements[0] <> 0 THEN
- Circuits[i].Graphe := 200;
- ELSE
- Circuits[i].Graphe := 0;
- END_IF;
- END_IF;
- 17: (* PAUSE CIRCUIT SUR NIVEAU HAUT *)
- (* GERE PAR LES ELEMENTS D'ORIGINE ET DE DESTINATION *)
- ;
- 18: (* ISOLATION CIRCUIT *)
- IF NOT Circuits[i].Isoler THEN
- IF Circuits[i].Elements[0] <> 0 THEN
- Circuits[i].Graphe := 200;
- ELSE
- Circuits[i].Graphe := 0;
- END_IF;
- END_IF;
- 19: (* ATTENTE ASPIRATION *)
- IF Aspi_ok THEN
- Circuits[i].Graphe := 20;
- END_IF;
- 20: (* DEMARRAGE DU CIRCUIT EN COURS *)
- (* L'ELEMENT D'ORIGINE DU CIRCUIT DECIDE DE BASCULER LE CIRCUIT A L'ETAT EN COURS OU NON *)
- (* Si défaut d'aspiration, Arrêt brutal *)
- IF NOT Aspi_ok AND i < bitDivers.Premier_Circuit_Asp THEN
- Circuits[i].Graphe := 200;
- (* Si NH Aspiration, Arrêt cascade *)
- ELSIF spv_Bennes.DEF_NH AND NOT spv_bennes.INH_DEF_NH THEN
- IF bitDivers.Circuit_Asp_General > 0 THEN
- Circuits[i].Graphe := 100;
- END_IF;
- FOR j:=0 TO 9 DO
- IF Circuits[i].Circuit_Aspi[j] > 0 THEN
- Circuits[i].Graphe := 100;
- END_IF;
- END_FOR;
- END_IF;
- 30: (* CIRCUIT EN COURS *)
- (* L'ELEMENT D'ORIGINE DU CIRCUIT DECIDE DE BASCULER LE CIRCUIT A L'ETAT EN COURS OU NON *)
- (* Si défaut d'aspiration, Arrêt brutal *)
- IF NOT Aspi_ok AND i < bitDivers.Premier_Circuit_Asp THEN
- Circuits[i].Graphe := 200;
- (* Si NH Aspiration, Arrêt cascade *)
- ELSIF spv_Bennes.DEF_NH AND NOT spv_bennes.INH_DEF_NH THEN
- IF bitDivers.Circuit_Asp_General > 0 THEN
- Circuits[i].Graphe := 100;
- END_IF;
- FOR j:=0 TO 9 DO
- IF Circuits[i].Circuit_Aspi[j] > 0 THEN
- Circuits[i].Graphe := 100;
- END_IF;
- END_FOR;
- END_IF;
- 100: (* ARRET EN CASCADE DU CIRCUIT *)
- (* L'ELEMENT DE DESTINATION DU CIRCUIT DECIDE BASCULER LE CIRCUIT A L'ETAT ARRET COMPLET OU NON *)
- (* Si défaut d'aspiration, Arrêt brutal *)
- IF NOT Aspi_ok AND i < bitDivers.Premier_Circuit_Asp THEN
- Circuits[i].Graphe := 200;
- END_IF;
- 200: (* ARRET IMMEDIAT *)
- Circuits[i].Graphe := 0;
- Circuits[i].Def_elem := 0;
- Circuits[i].Def_Circuit := 0;
- Circuits[i].Isoler := 0;
- Circuits[i].Visualisation := 0;
- Circuits[i].Arret_SPV := 0;
- ELSE
- Circuits[i].graphe := 200;
- END_CASE;
- END_FOR;