Files
HundM_awl/=A01+UH07-KF00/Programmbausteine/Module/MAusfahrFreigabe.awl
T

575 lines
15 KiB
Plaintext

FUNCTION_BLOCK "MAusfahrFreigabe"
TITLE = Ausfahrfreigabe für Pufferstrecken
{ S7_Optimized_Access := 'FALSE' }
VERSION : 0.1
VAR_INPUT
Antrieb_aktiv { ExternalWritable := 'False'} : Bool;
Kommt_1 { ExternalWritable := 'False'} : Bool; // BM fährt aus Strecke ausgefahren
Kommt_2 { ExternalWritable := 'False'} : Bool; // BM fährt aus Strecke ausgefahren
Kommt_3 { ExternalWritable := 'False'} : Bool; // BM fährt aus Strecke ausgefahren
Kommt_4 { ExternalWritable := 'False'} : Bool; // BM fährt aus Strecke ausgefahren
Kommt_5 { ExternalWritable := 'False'} : Bool; // BM fährt aus Strecke ausgefahren
Kommt_6 { ExternalWritable := 'False'} : Bool; // BM fährt aus Strecke ausgefahren
Kommt_7 { ExternalWritable := 'False'} : Bool; // BM fährt aus Strecke ausgefahren
Kommt_8 { ExternalWritable := 'False'} : Bool; // BM fährt aus Strecke ausgefahren
Kommt_9 { ExternalWritable := 'False'} : Bool; // BM fährt aus Strecke ausgefahren
Kommt_10 { ExternalWritable := 'False'} : Bool; // BM fährt aus Strecke ausgefahren
Kommt_11 { ExternalWritable := 'False'} : Bool; // BM fährt aus Strecke ausgefahren
Kommt_12 { ExternalWritable := 'False'} : Bool; // BM fährt aus Strecke ausgefahren
Kommt_13 { ExternalWritable := 'False'} : Bool; // BM fährt aus Strecke ausgefahren
Kommt_14 { ExternalWritable := 'False'} : Bool; // BM fährt aus Strecke ausgefahren
Kommt_15 { ExternalWritable := 'False'} : Bool; // BM fährt aus Strecke ausgefahren
Kommt_16 { ExternalWritable := 'False'} : Bool; // BM fährt aus Strecke ausgefahren
Kommt_17 { ExternalWritable := 'False'} : Bool; // BM fährt aus Strecke ausgefahren
Kommt_18 { ExternalWritable := 'False'} : Bool; // BM fährt aus Strecke ausgefahren
Kommt_19 { ExternalWritable := 'False'} : Bool; // BM fährt aus Strecke ausgefahren
Kommt_20 { ExternalWritable := 'False'} : Bool; // BM fährt aus Strecke ausgefahren
Kommt_21 { ExternalWritable := 'False'} : Bool; // BM fährt aus Strecke ausgefahren
Kommt_22 { ExternalWritable := 'False'} : Bool; // BM fährt aus Strecke ausgefahren
Kommt_23 { ExternalWritable := 'False'} : Bool; // BM fährt aus Strecke ausgefahren
Kommt_24 { ExternalWritable := 'False'} : Bool; // BM fährt aus Strecke ausgefahren
Kommt_25 { ExternalWritable := 'False'} : Bool; // BM fährt aus Strecke ausgefahren
Vorbei_1 { ExternalWritable := 'False'} : Bool; // BM ist an Sensor vorbeigefahren
Vorbei_2 { ExternalWritable := 'False'} : Bool; // BM ist an Sensor vorbeigefahren
Vorbei_3 { ExternalWritable := 'False'} : Bool; // BM ist an Sensor vorbeigefahren
Vorbei_4 { ExternalWritable := 'False'} : Bool; // BM ist an Sensor vorbeigefahren
Vorbei_5 { ExternalWritable := 'False'} : Bool; // BM ist an Sensor vorbeigefahren
Nur_1 { ExternalWritable := 'False'} : Bool; // Nachtriggern nur bei Vorbei_1
END_VAR
VAR
Para : Struct
Sicherheit : Int := 60; // Sicherheitszeit dazu[100ms]
Abstand_Lines : Int := 20; // Abstand zwischen 2 Linien [100ms]
Position_Vorbei_1 : Int; // Vorbei-Sensor in Höhe Linie X
Position_Vorbei_2 : Int; // Vorbei-Sensor in Höhe Linie X
Position_Vorbei_3 : Int; // Vorbei-Sensor in Höhe Linie X
Position_Vorbei_4 : Int; // Vorbei-Sensor in Höhe Linie X
Position_Vorbei_5 : Int; // Vorbei-Sensor in Höhe Linie X
END_STRUCT;
Dyn : Struct
RestZeit : Int; // BM noch unterwegs [s]
Aktiv_Line : Int; // Aktive Linie
Last_Line : Int; // Letzte aktive Linie
Nachtrigger_Freigabe : Int; // Nachtriggern der Freigabe der ausfahrenden Linie
END_STRUCT;
Out : Struct
Line_1_Ok : Bool;
Line_2_Ok : Bool;
Line_3_Ok : Bool;
Line_4_Ok : Bool;
Line_5_Ok : Bool;
Line_6_Ok : Bool;
Line_7_Ok : Bool;
Line_8_Ok : Bool;
Line_9_Ok : Bool;
Line_10_Ok : Bool;
Line_11_Ok : Bool;
Line_12_Ok : Bool;
Line_13_Ok : Bool;
Line_14_Ok : Bool;
Line_15_Ok : Bool;
Line_16_Ok : Bool;
Line_17_Ok : Bool;
Line_18_Ok : Bool;
Line_19_Ok : Bool;
Line_20_Ok : Bool;
Line_21_Ok : Bool;
Line_22_Ok : Bool;
Line_23_Ok : Bool;
Line_24_Ok : Bool;
Line_25_Ok : Bool;
END_STRUCT;
END_VAR
BEGIN
NETWORK
TITLE = Erst mal
SET;
R #Out.Line_1_Ok;
R #Out.Line_2_Ok;
R #Out.Line_3_Ok;
R #Out.Line_4_Ok;
R #Out.Line_5_Ok;
R #Out.Line_6_Ok;
R #Out.Line_7_Ok;
R #Out.Line_8_Ok;
R #Out.Line_9_Ok;
R #Out.Line_10_Ok;
R #Out.Line_11_Ok;
R #Out.Line_12_Ok;
R #Out.Line_13_Ok;
R #Out.Line_14_Ok;
R #Out.Line_15_Ok;
R #Out.Line_16_Ok;
R #Out.Line_17_Ok;
R #Out.Line_18_Ok;
R #Out.Line_19_Ok;
R #Out.Line_20_Ok;
R #Out.Line_21_Ok;
R #Out.Line_22_Ok;
R #Out.Line_23_Ok;
R #Out.Line_24_Ok;
R #Out.Line_25_Ok;
NETWORK
TITLE = Vorbei.Sensoren auswerten
UN #Vorbei_1;
SPB V002;
L #Para.Position_Vorbei_1;
L #Para.Abstand_Lines;
*I;
L #Para.Sicherheit;
+I;//Neue RestZeit ermitteln
L #Dyn.RestZeit;//Neuer Wert kleiner?
<I;//Ja !
SPB V002;//Ohne Speicherung weiter
TAK;//Neuen Wert übernehmen
T #Dyn.RestZeit;//Wert speichern
V002: UN #Vorbei_2;
O #Nur_1;//Nachtriggern nur bei Vorbei_1
SPB V003;
L #Para.Position_Vorbei_2;
L #Para.Abstand_Lines;
*I;
L #Para.Sicherheit;
+I;//Neue RestZeit ermitteln
L #Dyn.RestZeit;//Neuer Wert kleiner?
<I;//Ja !
SPB V003;//Ohne Speicherung weiter
TAK;//Neuen Wert übernehmen
T #Dyn.RestZeit;//Wert speichern
V003: UN #Vorbei_3;
O #Nur_1;//Nachtriggern nur bei Vorbei_1
SPB V004;
L #Para.Position_Vorbei_3;
L #Para.Abstand_Lines;
*I;
L #Para.Sicherheit;
+I;//Neue RestZeit ermitteln
L #Dyn.RestZeit;//Neuer Wert kleiner?
<I;//Ja !
SPB V004;//Ohne Speicherung weiter
TAK;//Neuen Wert übernehmen
T #Dyn.RestZeit;//Wert speichern
V004: UN #Vorbei_4;
O #Nur_1;//Nachtriggern nur bei Vorbei_1
SPB V005;
L #Para.Position_Vorbei_4;
L #Para.Abstand_Lines;
*I;
L #Para.Sicherheit;
+I;//Neue RestZeit ermitteln
L #Dyn.RestZeit;//Neuer Wert kleiner?
<I;//Ja !
SPB V005;//Ohne Speicherung weiter
TAK;//Neuen Wert übernehmen
T #Dyn.RestZeit;//Wert speichern
V005: UN #Vorbei_5;
O #Nur_1;//Nachtriggern nur bei Vorbei_1
SPB V00E;
L #Para.Position_Vorbei_5;
L #Para.Abstand_Lines;
*I;
L #Para.Sicherheit;
+I;//Neue RestZeit ermitteln
L #Dyn.RestZeit;//Neuer Wert kleiner?
<I;//Ja !
SPB V00E;//Ohne Speicherung weiter
TAK;//Neuen Wert übernehmen
T #Dyn.RestZeit;//Wert speichern
V00E: NOP 0;
NETWORK
TITLE = Aus-/vorbeifahrendes BM -> Aktivzeit speichern
L 25;
U #Kommt_25;
SPB Save;
L 24;
U #Kommt_24;
SPB Save;
L 23;
U #Kommt_23;
SPB Save;
L 22;
U #Kommt_22;
SPB Save;
L 21;
U #Kommt_21;
SPB Save;
L 20;
U #Kommt_20;
SPB Save;
L 19;
U #Kommt_19;
SPB Save;
L 18;
U #Kommt_18;
SPB Save;
L 17;
U #Kommt_17;
SPB Save;
L 16;
U #Kommt_16;
SPB Save;
L 15;
U #Kommt_15;
SPB Save;
L 14;
U #Kommt_14;
SPB Save;
L 13;
U #Kommt_13;
SPB Save;
L 12;
U #Kommt_12;
SPB Save;
L 11;
U #Kommt_11;
SPB Save;
L 10;
U #Kommt_10;
SPB Save;
L 9;
U #Kommt_9;
SPB Save;
L 8;
U #Kommt_8;
SPB Save;
L 7;
U #Kommt_7;
SPB Save;
L 6;
U #Kommt_6;
SPB Save;
L 5;
U #Kommt_5;
SPB Save;
L 4;
U #Kommt_4;
SPB Save;
L 3;
U #Kommt_3;
SPB Save;
L 2;
U #Kommt_2;
SPB Save;
L 1;
U #Kommt_1;
SPB Save;
SPA Zeit;
Save: T #Dyn.Aktiv_Line;//Aktive Linie speichern
L #Para.Abstand_Lines;
*I;
L #Para.Sicherheit;
+I;//RestZeit ermitteln
L #Dyn.RestZeit;//Neuer Wert größer?
>=I;//Ja !
SPB Ok;
//Ausgefahrene Stelle ist kleiner:
L 0;//Löschen
T #Dyn.Aktiv_Line;//Aktive Linie
T #Dyn.Nachtrigger_Freigabe;//Nachtriggern der Freigabe der ausfahrenden Linie
BEA;
Ok: TAK;//Neuen Wert übernehmen
T #Dyn.RestZeit;//Wert speichern
//Freigabe aus aktiver Linie verlängern aktivieren:
L #Para.Sicherheit;
L #Para.Abstand_Lines;
+I;
L 10;
/I;
L 2;///Nach 2 Sekunden
T #Dyn.Nachtrigger_Freigabe;//Nachtriggern der Freigabe der ausfahrenden Linie
NETWORK
TITLE = Aktiv-/Nachtrigger-Zeit verändern
Zeit: UN #Antrieb_aktiv ;//Antrieb aktiv
ON "1s-Impuls";//1s-Impuls
SPB Chk;
//BM ist unterwegs:
L #Dyn.RestZeit;
+ -10;//10*100ms = 1s
T #Dyn.RestZeit;
L 0;//Minimum erreicht?
>I;//Nein !
SPB Trig;
T #Dyn.RestZeit;//Minimum übergeben
//Freigabe nachtriggern:
Trig: L #Dyn.Nachtrigger_Freigabe;//Nachtriggern der Freigabe der ausfahrenden Linie
+ -1;
T #Dyn.Nachtrigger_Freigabe;//Nachtriggern der Freigabe der ausfahrenden Linie
L 0;//Minimum erreicht?
>I;//Nein !
SPB Chk;
T #Dyn.Nachtrigger_Freigabe;//Minimum übergeben
T #Dyn.Aktiv_Line;
T #Dyn.Last_Line;
NETWORK
TITLE = Nachtriggern der Freigabe der ausfahrenden Linie
Chk: L #Dyn.Aktiv_Line ;//Aktive Linie
L #Dyn.Last_Line;
<>I;//Unterschiedlich !
SPB More;
TAK;
SPL ENDE_Mig;
SPA ENDE_Mig;//Bei 0
SPA Li01;//Linie 1 war aktiv
SPA Li02;
SPA Li03;
SPA Li04;
SPA Li05;
SPA Li06;
SPA Li07;
SPA Li08;
SPA Li09;
SPA Li10;
SPA Li11;
SPA Li12;
SPA Li13;
SPA Li14;
SPA Li15;
SPA Li16;
SPA Li17;
SPA Li18;
SPA Li19;
SPA Li20;
SPA Li21;
SPA Li22;
SPA Li23;
SPA Li24;
SPA Li25;//Linie 25 war aktiv
ENDE_Mig: SPA More;
Li01: SET;
S #Out.Line_1_Ok;
BEA;
Li02: SET;
S #Out.Line_2_Ok;
BEA;
Li03: SET;
S #Out.Line_3_Ok;
BEA;
Li04: SET;
S #Out.Line_4_Ok;
BEA;
Li05: SET;
S #Out.Line_5_Ok;
BEA;
Li06: SET;
S #Out.Line_6_Ok;
BEA;
Li07: SET;
S #Out.Line_7_Ok;
BEA;
Li08: SET;
S #Out.Line_8_Ok;
BEA;
Li09: SET;
S #Out.Line_9_Ok;
BEA;
Li10: SET;
S #Out.Line_10_Ok;
BEA;
Li11: SET;
S #Out.Line_11_Ok;
BEA;
Li12: SET;
S #Out.Line_12_Ok;
BEA;
Li13: SET;
S #Out.Line_13_Ok;
BEA;
Li14: SET;
S #Out.Line_14_Ok;
BEA;
Li15: SET;
S #Out.Line_15_Ok;
BEA;
Li16: SET;
S #Out.Line_16_Ok;
BEA;
Li17: SET;
S #Out.Line_17_Ok;
BEA;
Li18: SET;
S #Out.Line_18_Ok;
BEA;
Li19: SET;
S #Out.Line_19_Ok;
BEA;
Li20: SET;
S #Out.Line_20_Ok;
BEA;
Li21: SET;
S #Out.Line_21_Ok;
BEA;
Li22: SET;
S #Out.Line_22_Ok;
BEA;
Li23: SET;
S #Out.Line_23_Ok;
BEA;
Li24: SET;
S #Out.Line_24_Ok;
BEA;
Li25: SET;
S #Out.Line_25_Ok;
BEA;
More: NOP 0;
NETWORK
TITLE = Freigaben an Pufferstrecken aufgrund der fahrenden BM
L #Dyn.RestZeit;
L 10;
/I;
SPL Ende;
SPA Ok01;//Restzeit in 0 Sekunden
SPA Ok01;//Restzeit in 1 Sekunden
SPA Ok02;//Restzeit in 2 Sekunden
SPA Ok02;//Restzeit in 3 Sekunden
SPA Ok03;//Restzeit in 4 Sekunden
SPA Ok03;//Restzeit in 5 Sekunden
SPA Ok04;//Restzeit in 6 Sekunden
SPA Ok04;//Restzeit in 7 Sekunden
SPA Ok05;//Restzeit in 8 Sekunden
SPA Ok05;//Restzeit in 9 Sekunden
SPA Ok06;//Restzeit in 10 Sekunden
SPA Ok06;//Restzeit in 11 Sekunden
SPA Ok07;//Restzeit in 12 Sekunden
SPA Ok07;//Restzeit in 13 Sekunden
SPA Ok08;//Restzeit in 14 Sekunden
SPA Ok08;//Restzeit in 15 Sekunden
SPA Ok09;//Restzeit in 16 Sekunden
SPA Ok09;//Restzeit in 17 Sekunden
SPA Ok10;//Restzeit in 18 Sekunden
SPA Ok10;//Restzeit in 19 Sekunden
SPA Ok11;//Restzeit in 20 Sekunden
SPA Ok11;//Restzeit in 21 Sekunden
SPA Ok12;//Restzeit in 22 Sekunden
SPA Ok12;//Restzeit in 23 Sekunden
SPA Ok13;//Restzeit in 24 Sekunden
SPA Ok13;//Restzeit in 25 Sekunden
SPA Ok14;//Restzeit in 26 Sekunden
SPA Ok14;//Restzeit in 27 Sekunden
SPA Ok15;//Restzeit in 28 Sekunden
SPA Ok15;//Restzeit in 29 Sekunden
SPA Ok16;//Restzeit in 30 Sekunden
SPA Ok16;//Restzeit in 31 Sekunden
SPA Ok17;//Restzeit in 32 Sekunden
SPA Ok17;//Restzeit in 33 Sekunden
SPA Ok18;//Restzeit in 34 Sekunden
SPA Ok18;//Restzeit in 35 Sekunden
SPA Ok19;//Restzeit in 36 Sekunden
SPA Ok19;//Restzeit in 33 Sekunden
SPA Ok20;//Restzeit in 38 Sekunden
SPA Ok20;//Restzeit in 39 Sekunden
SPA Ok21;//Restzeit in 40 Sekunden
SPA Ok21;//Restzeit in 41 Sekunden
SPA Ok22;//Restzeit in 42 Sekunden
SPA Ok22;//Restzeit in 43 Sekunden
SPA Ok23;//Restzeit in 44 Sekunden
SPA Ok23;//Restzeit in 45 Sekunden
SPA Ok24;//Restzeit in 46 Sekunden
SPA Ok24;//Restzeit in 43 Sekunden
SPA Ok25;//Restzeit in 48 Sekunden
SPA Ok25;//Restzeit in 49 Sekunden
Ende: SPA En04;
Ok01: SET;
S #Out.Line_1_Ok;
Ok02: SET;
S #Out.Line_2_Ok;
Ok03: SET;
S #Out.Line_3_Ok;
Ok04: SET;
S #Out.Line_4_Ok;
Ok05: SET;
S #Out.Line_5_Ok;
Ok06: SET;
S #Out.Line_6_Ok;
Ok07: SET;
S #Out.Line_7_Ok;
Ok08: SET;
S #Out.Line_8_Ok;
Ok09: SET;
S #Out.Line_9_Ok;
Ok10: SET;
S #Out.Line_10_Ok;
Ok11: SET;
S #Out.Line_11_Ok;
Ok12: SET;
S #Out.Line_12_Ok;
Ok13: SET;
S #Out.Line_13_Ok;
Ok14: SET;
S #Out.Line_14_Ok;
Ok15: SET;
S #Out.Line_15_Ok;
Ok16: SET;
S #Out.Line_16_Ok;
Ok17: SET;
S #Out.Line_17_Ok;
Ok18: SET;
S #Out.Line_18_Ok;
Ok19: SET;
S #Out.Line_19_Ok;
Ok20: SET;
S #Out.Line_20_Ok;
Ok21: SET;
S #Out.Line_21_Ok;
Ok22: SET;
S #Out.Line_22_Ok;
Ok23: SET;
S #Out.Line_23_Ok;
Ok24: SET;
S #Out.Line_24_Ok;
Ok25: SET;
S #Out.Line_25_Ok;
En04: NOP 0;
NETWORK
TITLE = Letzten aktiven Puffer speichern
L #Dyn.Aktiv_Line ;//Aktive Linie
T #Dyn.Last_Line;//speichern
NETWORK
TITLE = Ende
BE;
END_FUNCTION_BLOCK