FUNCTION_BLOCK "Petri"
VAR_INPUT
Fuellstand_erreicht : BOOL;
B2_abgesperrt : BOOL;
B2_entleert : BOOL;
Entleerventile_geschlossen : BOOL;
B2_evakuiert : BOOL;
Ventle_geschlossen : BOOL;
Anlage_entspannt : BOOL;
Anlage_entleert : BOOL;
Uebefuehrventil_WA_geoeffnet : BOOL;
Entleerventil_WA_geoeffnet : BOOL;
Produktion_Start : BOOL;
Produktion_Stop : BOOL;
Reinigung_Start : BOOL;
Reinigung_Stop : BOOL;
Reinigung_Halt : BOOL;
Reinigung_Weiter : BOOL;
Entleert : BOOL;
Evakuiert : BOOL;
END_VAR
VAR_IN_OUT
Wiederanlauf : BOOL;
Start_Produktion : INT;
Start_Reinigung : INT;
END_VAR
VAR_OUTPUT
SM : ARRAY [0..20] OF BOOL;
END_VAR
VAR
Aktiver_Schritt : INT;
Anlauftimer : "TON";
Timer2 : "TON";
END_VAR
VAR_TEMP
Naechster_Schritt : INT;
Index : INT;
END_VAR
// Initialisierung
IF Wiederanlauf THEN
Aktiver_Schritt := 0;
END_IF;
// Schrittkette
CASE Aktiver_Schritt OF
0 : Start_Produktion := 0;
Start_Reinigung := 0;
Wiederanlauf := SEL(G:= Anlauftimer.Q, IN1:= false, IN0:= true);
Naechster_Schritt:= SEL(G:= Anlauftimer.Q, IN1:= 1, IN0:= 0);
1 : Naechster_Schritt:= SEL(G:= Produktion_Start, IN1:= 2, IN0:= SEL(G:= Reinigung_Start, IN1:= 15, IN0:= 1));
2 : Naechster_Schritt:= SEL(G:= Entleert, IN1:= 3, IN0:= 2);
3 : Naechster_Schritt:= SEL(G:= Evakuiert, IN1:= 4, IN0:= 3);
4 : Naechster_Schritt:= SEL(G:= Fuellstand_erreicht, IN1:= 5, IN0:= 4);
5 : Naechster_Schritt:= SEL(G:= B2_abgesperrt, IN1:= 6, IN0:= 5);
6 : Naechster_Schritt:= SEL(G:= B2_entleert, IN1:= 7, IN0:= 6);
7 : Naechster_Schritt:= SEL(G:= entleerventile_geschlossen, IN1:= 8, IN0:= 7);
8 : Naechster_Schritt:= SEL(G:= B2_evakuiert, IN1:= 9, IN0:= 8);
9 : Naechster_Schritt:= SEL(G:= Ventle_geschlossen, IN1:= 10, IN0:= 9);
10 : Naechster_Schritt:= SEL(G:= Anlage_entspannt, IN1:= 11, IN0:= 10);
11 : Naechster_Schritt:= SEL(G:= Anlage_entleert, IN1:= 12, IN0:= 11);
12 : Naechster_Schritt:= SEL(G:= Uebefuehrventil_WA_geoeffnet, IN1:= 13, IN0:= 12);
13 : Naechster_Schritt:= SEL(G:= Entleerventil_WA_geoeffnet, IN1:= 2, IN0:= 13);
14 : Naechster_Schritt:= SEL(G:= true, IN1:= 15, IN0:= 14);
15 : Naechster_Schritt:= SEL(G:= true, IN1:= 16, IN0:= 15);
16 : Naechster_Schritt:= SEL(G:= true, IN1:= 17, IN0:= 16);
17 : Naechster_Schritt:= SEL(G:= true, IN1:= 18, IN0:= 17);
18 : Naechster_Schritt:= SEL(G:= true, IN1:= 19, IN0:= 18);
19 : Naechster_Schritt:= SEL(G:= true, IN1:= 20, IN0:= 19);
20 : Naechster_Schritt:= SEL(G:= true, IN1:= 1, IN0:= 20);
END_CASE;
// Schrittweiterschaltung
Aktiver_Schritt:= SEL(G:= Produktion_Stop AND NOT Wiederanlauf, IN1:= 1, IN0:= Naechster_Schritt);
// Timer
Anlauftimer(IN:= Wiederanlauf, PT:= T#20s);
Timer2 (IN:= false, PT:= T#1s);
// Ausgabe
FOR Index := 0 TO 20 BY 1 DO
SM[Index]:= SEL(G:= Index = Aktiver_Schritt, IN1:= True, IN0:= False);
END_FOR;
END_FUNCTION_BLOCK