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

