Files

88 lines
3.2 KiB
Plaintext

FUNCTION_BLOCK "MAusfahrPrio_ABP"
{ S7_Optimized_Access := 'FALSE' }
// Mechanische AWL->SCL-Konvertierung (awl2scl.py). Kontrollfluss per GOTO,
// wo im Original mit Sprungmarken gearbeitet wurde. Vor Uebernahme in TIA
// Portal pruefen/kompilieren (siehe SCL-Export/README.md).
VAR_INPUT
BG_Haupt_Schleuse : Bool; // Trolley ist in Schleuse auf Hauptstrecke
Haupt_Schleuse_geöffnet : Bool; // Schleuse hat geöffnet
BG_ABP_Schleuse : Bool; // Trolley ist in Schleuse von ABP-Einfahrt
ABP_Schleuse_geöffnet : Bool; // Schleuse hat geöffnet
Aktive_ABP : Int;
g_1s_Impuls : Word; // war "1s-Impuls"
OUT_Haupt_Schleuse_starten : Bool; // war "OUT.Haupt_Schleuse_starten"
Out_ABP_Schleuse_starten : Bool; // war "Out.ABP_Schleuse_starten"
END_VAR
VAR
"OUT.Haupt_Schleuse_starten" : Bool;
"Out.ABP_Schleuse_starten" : Bool;
Dyn : Struct
Anzahl_Haupt : Int;
Wartezeit : Int;
END_STRUCT;
END_VAR
VAR_TEMP
Check_ok : Bool;
Partner : Int;
END_VAR
BEGIN
REGION Haupt-Schleuse ist gestartet
IF #Haupt_Schleuse_geöffnet AND ##OUT_Haupt_Schleuse_starten THEN ##OUT_Haupt_Schleuse_starten := FALSE; END_IF;
IF NOT (#Haupt_Schleuse_geöffnet AND ##OUT_Haupt_Schleuse_starten) THEN GOTO En01; END_IF;
#Dyn.Anzahl_Haupt := #Dyn.Anzahl_Haupt + 1;
IF (#Dyn.Anzahl_Haupt + 1) <= 8 THEN GOTO En01; END_IF;
#Dyn.Anzahl_Haupt := 8;
En01: ;
END_REGION
REGION ABP-Schleuse ist gestartet
IF #ABP_Schleuse_geöffnet AND ##Out_ABP_Schleuse_starten THEN ##Out_ABP_Schleuse_starten := FALSE; END_IF;
IF #ABP_Schleuse_geöffnet AND ##Out_ABP_Schleuse_starten THEN #Dyn.Anzahl_Haupt := 0; END_IF;
END_REGION
REGION Wartezeit, wenn beide Schleusen geschlossen
IF NOT (#Haupt_Schleuse_geöffnet) AND NOT (#ABP_Schleuse_geöffnet) THEN
#Dyn.Wartezeit := 0;
#Check_ok := FALSE;
GOTO En03;
END_IF;
IF NOT (#g_1s_Impuls) THEN GOTO En03; END_IF;
#Dyn.Wartezeit := #Dyn.Wartezeit + 1;
IF (#Dyn.Wartezeit + 1) >= 5 THEN #Check_ok := TRUE; END_IF;
IF (#Dyn.Wartezeit + 1) < 5 THEN GOTO En03; END_IF;
#Dyn.Wartezeit := 5;
En03: ;
END_REGION
REGION Check, wer dran ist
IF NOT (#BG_Haupt_Schleuse) THEN ##OUT_Haupt_Schleuse_starten := FALSE; END_IF;
IF NOT (#BG_ABP_Schleuse) THEN ##Out_ABP_Schleuse_starten := FALSE; END_IF;
IF (##OUT_Haupt_Schleuse_starten AND #BG_Haupt_Schleuse) OR (((##Out_ABP_Schleuse_starten AND #BG_ABP_Schleuse) OR #Haupt_Schleuse_geöffnet) OR #ABP_Schleuse_geöffnet) THEN RETURN; END_IF;
#Partner := #Aktive_ABP + -1;
IF ((#Aktive_ABP + -1) <= 0) AND #BG_ABP_Schleuse THEN
##Out_ABP_Schleuse_starten := TRUE;
RETURN;
END_IF;
IF (#Dyn.Anzahl_Haupt < #Partner) AND #BG_Haupt_Schleuse THEN
##OUT_Haupt_Schleuse_starten := TRUE;
RETURN;
END_IF;
IF NOT (#Check_ok) THEN RETURN; END_IF;
IF #BG_ABP_Schleuse THEN
##Out_ABP_Schleuse_starten := TRUE;
RETURN;
END_IF;
IF #BG_Haupt_Schleuse THEN ##OUT_Haupt_Schleuse_starten := TRUE; END_IF;
RETURN;
END_REGION
REGION Ende
RETURN;
END_REGION
END_FUNCTION_BLOCK