Files
HundM_Fortna/2_ILSLib/FB/Misc/FB_SepPrio.scl
T
2026-06-29 16:29:41 +02:00

305 lines
13 KiB
Plaintext

FUNCTION_BLOCK "FB_SepPrio"
{ S7_Optimized_Access := 'TRUE' }
VERSION : 0.1
VAR_INPUT
xInSepReq1 : Bool; // Anforderung von Sep1
xInSepReq2 : Bool; // Anforderung von Sep2
xInSepReq3 : Bool; // Anforderung von Sep3
xInSepRelease1 : Bool; // Sep 1 hat rausgelassen
xInSepRelease2 : Bool; // Sep 2 hat rausgelassen
xInSepRelease3 : Bool; // Sep 3 hat rausgelassen
xInActive : Bool; // Freigabe grundsätzlich für Separatoren
xInCarRun : Bool; // NIU Motor läuft
tInTime3 : Time; // Zeit die Sep 3 braucht
tInTime2 : Time; // Zeit die Sep 2 braucht
END_VAR
VAR_OUTPUT
xOutSepGo1 : Bool; // Freigabe für einzelnen Sep 1
xOutSepGo2 : Bool; // Freigabe für einzelnen Sep 2
xOutSepGo3 : Bool; // Freigabe für einzelnen Sep 3
END_VAR
VAR_IN_OUT
InOutJam : "stJamData";
END_VAR
VAR
fbStateManager : "FB_StateManager";
nState : Int; // Schritt
tTime3 {InstructionName := 'TOF_TIME'; LibVersion := '1.0'} : TOF_TIME; // Timer von Sep 3
tTime2 {InstructionName := 'TOF_TIME'; LibVersion := '1.0'} : TOF_TIME; // Timer von Sep 2
tTime1 {InstructionName := 'TON_TIME'; LibVersion := '1.0'} : TON_TIME;
rTrigNotActive {InstructionName := 'R_TRIG'; LibVersion := '1.0'} : R_TRIG;
rTrig2 {InstructionName := 'R_TRIG'; LibVersion := '1.0'} : R_TRIG;
fTrig3 {InstructionName := 'F_TRIG'; LibVersion := '1.0'} : F_TRIG;
fTrig2 {InstructionName := 'F_TRIG'; LibVersion := '1.0'} : F_TRIG;
xTimeBit3 : Bool; // Merker für Timer falls unterbrochen wird
xTimeBit2 : Bool; // Merker für Timer falls unterbrochen wird
END_VAR
VAR_TEMP
tmpActUnivTon : Bool;
END_VAR
VAR CONSTANT
cOff : Int := 0;
cWaitAll : Int := 1;
cWaitFor3 : Int := 30;
cWaitFor2 : Int := 20;
cOnlySep1 : Int := 10;
END_VAR
BEGIN
(*
_______________________<==
| | |
| | |
\ \ \
\ \ \
______3______2______1_____==>
3 hat vor 2 und 1 Vorfahrt
2 hat vor 1 Vorfahrt aber muss Zeit 3 abwarten
1 muss Zeit 3 und 2 abwarten
*)
REGION Schrittkette
CASE #nState OF
#cOff:
REGION 000: Off
#xOutSepGo3 := FALSE;
#xOutSepGo2 := FALSE;
#xOutSepGo1 := FALSE;
// IF #xInActive THEN
#nState := #cWaitAll;
// END_IF;
END_REGION
#cWaitAll:
REGION 001: Wait All
#xOutSepGo3 := FALSE;
#xOutSepGo2 := FALSE;
#xOutSepGo1 := FALSE;
//***************NEU***********
#nState := 005;
//*************NEU ENDE*******
(*IF NOT #xInActive THEN
#nState := #cOff;*)
// //********************Kombinationen mit Sep3*************************************************
// IF #xInSepReq3 AND #xInSepReq2 AND #xInSepReq1 THEN
// #xOutSepGo3 := TRUE;
// #xOutSepGo2 := false;//TRUE;
// #xOutSepGo1 := false;//TRUE;
// #nState := #cWaitFor3;
// ELSIF #xInSepReq3 AND (#xInSepReq2 OR NOT #xInSepReq1) THEN
// #xOutSepGo3 := TRUE;
// #xOutSepGo2 := false;//TRUE;
// #xOutSepGo1 := FALSE;
// #nState := #cWaitFor3;
// ELSIF #xInSepReq3 AND (NOT #xInSepReq2 OR #xInSepReq1) THEN
// #xOutSepGo3 := TRUE;
// #xOutSepGo2 := FALSE;
// #xOutSepGo1 := false;//TRUE;
// #nState := #cWaitFor3;
// ELSIF #xInSepReq3 AND (NOT #xInSepReq2 AND NOT #xInSepReq1) THEN
// #xOutSepGo3 := TRUE;
// #xOutSepGo2 := FALSE;
// #xOutSepGo1 := FALSE;
// #nState := #cWaitFor3;
// //********************Kombinationen ohne Sep3************************************************
// ELSIF NOT #xInSepReq3 AND (#xInSepReq2 AND #xInSepReq1) THEN
// #xOutSepGo3 := FALSE;
// #xOutSepGo2 := TRUE;
// #xOutSepGo1 := false;//TRUE;
// #nState := #cWaitFor2;
// ELSIF NOT #xInSepReq3 AND (#xInSepReq2 AND NOT #xInSepReq1) THEN
// #xOutSepGo3 := FALSE;
// #xOutSepGo2 := TRUE;
// #xOutSepGo1 := FALSE;
// #nState := #cWaitFor2;
// //********************Nur Sep1 alleine***************************************************
// ELSIF NOT #xInSepReq3 AND (NOT #xInSepReq2 AND #xInSepReq1) THEN
// #xOutSepGo3 := FALSE;
// #xOutSepGo2 := FALSE;
// #xOutSepGo1 := TRUE;
// #nState := #cOnlySep1;
// END_IF;
END_REGION
005:
REGION 005: NEU Zwischenschritt
#xOutSepGo3 := FALSE;
#xOutSepGo2 := FALSE;
#xOutSepGo1 := FALSE;
IF #fbStateManager.tOutTimeInStep > T#6s THEN
IF #xInSepReq1 THEN
#nState := 006; // Embi
// #nState := 010;
ELSIF #xInSepReq2 THEN
#nState := 16; // Embi
// #nState := 020;
// ELSIF #xInSepReq3 THEN
// #nState := 26; // Embi
// #nState := 030;
END_IF;
END_IF;
END_REGION
006:
REGION 006: Warten auf freie Ausfahrt
#xOutSepGo3 := FALSE;
#xOutSepGo2 := FALSE;
#xOutSepGo1 := FALSE;
IF #InOutJam.Status.nCount = 0 OR #fbStateManager.tOutTimeInStep > T#24s THEN
#nState := #cOnlySep1;
END_IF;
END_REGION
#cOnlySep1:
REGION 010: Only Sep 1
#xOutSepGo3 := FALSE;
#xOutSepGo2 := FALSE;
#xOutSepGo1 := TRUE;
//***************NEU***********
IF #fbStateManager.tOutTimeInStep > T#10s THEN
#nState := 015;
END_IF;
//*************NEU ENDE*******
// IF (#xInSepReq2 OR #xInSepReq3) AND #tTime1.Q THEN //Wird sofort von 2 oder 3 unterbrochen
// #xOutSepGo3 := FALSE;
// #xOutSepGo2 := FALSE;
// #xOutSepGo1 := FALSE;
// #nState := #cWaitAll;
// END_IF;
END_REGION
015:
REGION 015: NEU Zwischenschritt
#xOutSepGo3 := FALSE;
#xOutSepGo2 := FALSE;
#xOutSepGo1 := FALSE;
IF #fbStateManager.tOutTimeInStep > T#4s THEN
IF #xInSepReq2 THEN
#nState := 16; // Embi
// #nState := 020;
// ELSIF #xInSepReq3 THEN
// #nState := 26; // Embi
// #nState := 030;
ELSIF #xInSepReq1 THEN
#nState := 6; // Embi
// #nState := 010;
END_IF;
END_IF;
END_REGION
016:
REGION 16: Warten auf freie Ausfahrt
#xOutSepGo3 := FALSE;
#xOutSepGo2 := FALSE;
#xOutSepGo1 := FALSE;
IF #InOutJam.Status.nCount = 0 OR #fbStateManager.tOutTimeInStep > T#26s THEN
#nState := #cWaitFor2;
END_IF;
END_REGION
#cWaitFor2:
REGION 020: Wait for 2
#xOutSepGo3 := FALSE;
#xOutSepGo2 := TRUE;
#xOutSepGo1 := FALSE;
//***************NEU***********
IF #fbStateManager.tOutTimeInStep > T#11s THEN
// #nState := 025;
#nState := 5;
END_IF;
//*************NEU ENDE*******
(*IF NOT #xInActive THEN
#nState := #cOff;*)
// IF #fTrig2.Q THEN //Bis Sep 2 fertig....
// #xOutSepGo3 := FALSE;
// #xOutSepGo2 := FALSE;
// #xOutSepGo1 := FALSE;
// #nState := #cWaitAll;
// ELSIF #xInSepReq3 THEN //...oder sofort durch Sep 3 unterbrochen
// #xOutSepGo3 := TRUE;
// #xOutSepGo2 := FALSE;
// #xOutSepGo1 := FALSE;
// #nState := #cWaitFor3;
// END_IF;
END_REGION
025:
REGION 025: NEU Zwischenschritt
#xOutSepGo3 := FALSE;
#xOutSepGo2 := FALSE;
#xOutSepGo1 := FALSE;
IF #fbStateManager.tOutTimeInStep > T#5s THEN
IF #xInSepReq3 THEN
#nState := 26; // Embi
// #nState := 030;
ELSIF #xInSepReq1 THEN
#nState := 6; // Embi
// #nState := 010;
ELSIF #xInSepReq2 THEN
#nState := 16; // Embi
// #nState := 020;
END_IF;
END_IF;
END_REGION
026:
REGION 26: Warten auf freie Ausfahrt
#xOutSepGo3 := FALSE;
#xOutSepGo2 := FALSE;
#xOutSepGo1 := FALSE;
IF #InOutJam.Status.nCount = 0 OR #fbStateManager.tOutTimeInStep > T#25s THEN
#nState := #cWaitFor3;
END_IF;
END_REGION
#cWaitFor3:
REGION 030: Wait for 3
#xOutSepGo3 := TRUE;
#xOutSepGo2 := FALSE;
#xOutSepGo1 := FALSE;
//***************NEU***********
IF #fbStateManager.tOutTimeInStep > T#11s THEN //war 8s
#nState := 005;
END_IF;
//*************NEU ENDE*******
(*IF NOT #xInActive THEN
#nState := #cOff;*)
// IF #fTrig3.Q THEN //Bis Sep 3 fertig ist
// #xOutSepGo3 := FALSE;
// #xOutSepGo2 := FALSE;
// #xOutSepGo1 := FALSE;
// #nState := #cWaitAll;
// END_IF;
END_REGION
ELSE
;
END_CASE;
END_REGION
REGION State Manager
#fbStateManager.stInSettings.nStartState := 0;
#fbStateManager.stInSettings.xActUnivTOn := TRUE;
#fbStateManager.stInSettings.xRestartAtStartState := FALSE;
#fbStateManager(xInFunctionEnabled:=TRUE,
xInRunUnivTOn:=#tmpActUnivTon,
nInOutState:=#nState);
END_REGION
END_FUNCTION_BLOCK