305 lines
13 KiB
Plaintext
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
|
|
|