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