57 lines
1.6 KiB
Plaintext
57 lines
1.6 KiB
Plaintext
FUNCTION_BLOCK "FB_CarrAccumulate1Sep"
|
|
{ S7_Optimized_Access := 'TRUE' }
|
|
VERSION : 0.1
|
|
VAR_INPUT
|
|
stInSensor1 : "UDT_Sensor"; // Sensor vom 1. Sep
|
|
xInConvActive : Bool; // Conveyor Rückmeldung
|
|
stInTimes : Struct
|
|
tFreeSen1 : Time := T#5000ms; // Zeit welche Sep 1 frei ist
|
|
tTimerWait : Time := T#10000ms; // Wartezeit
|
|
END_STRUCT;
|
|
END_VAR
|
|
|
|
VAR_OUTPUT
|
|
xOutLockSep1 : Bool; // true = Sep 1 wird gesperrt
|
|
END_VAR
|
|
|
|
VAR
|
|
tOn1 {InstructionName := 'TON_TIME'; LibVersion := '1.0'} : TON_TIME; // Timer zählt wie lange Sep 1 warten muss
|
|
xTimerQ : Bool; // Timerausgang
|
|
xLockSep1 : Bool;
|
|
END_VAR
|
|
|
|
|
|
BEGIN
|
|
(*
|
|
<====== Fahrtrichtung <======
|
|
... -------<----------|o|--------<------ ...
|
|
Sep 1
|
|
|
|
Sep 1 lässt Carrier raus die sich angestaut haben, bis In-Sensor wieder mal eine gewisse Zeit frei ist.
|
|
Dann beginnt Wartezeit wenn in diesem Zustand Sep 1 erstmals wieder ein In-Signal bekommt. Usw....
|
|
|
|
*)
|
|
|
|
IF NOT #stInSensor1.xDirectSensor AND #stInSensor1.tDirectChangeLast > #stInTimes.tFreeSen1 THEN
|
|
#xLockSep1 := TRUE;
|
|
ELSIF #xTimerQ THEN
|
|
#xLockSep1 := FALSE;
|
|
END_IF;
|
|
|
|
REGION Timer
|
|
#tOn1(IN := #xLockSep1 AND #stInSensor1.xDirectSensor AND #xInConvActive, //Conveyoer Full Speed ok und Sep 1 wartet
|
|
PT := #stInTimes.tTimerWait);
|
|
|
|
|
|
#xTimerQ := #tOn1.Q (* OR (#stInSensor1.xDirectSensor AND #stInSensor1.tDirectChangeLast > #stInTimes.tFullSen1) *);
|
|
END_REGION
|
|
|
|
|
|
REGION Outputs
|
|
#xOutLockSep1 := #xLockSep1;
|
|
END_REGION
|
|
|
|
|
|
END_FUNCTION_BLOCK
|
|
|