FUNCTION_BLOCK "FB_Blinker"
{ S7_Optimized_Access := 'TRUE' }
VERSION : 0.1
   VAR_INPUT 
      tInPeriodicTime : Time := T#500ms;   // Eingestellte Zeit, entspricht 1/2*Clock
      xInActivate : Bool;   // true = Dauerblinken, false = Zeit pausieren
   END_VAR

   VAR_OUTPUT 
      xOutput : Bool;   // eingestellte Zeit true, eingestellte Zeit false usw.
      xOutFlag : Bool;   // Flanke von xOutput
   END_VAR

   VAR 
      rTrigSignal {InstructionName := 'R_TRIG'; LibVersion := '1.0'} : R_TRIG;
      xSync : Bool;
      timerTON {InstructionName := 'TON_TIME'; LibVersion := '1.0'} : TON_TIME;
   END_VAR
   VAR RETAIN
      timerTONR {InstructionName := 'TONR_TIME'; LibVersion := '1.0'} : TONR_TIME;
   END_VAR
   VAR 
      tTONTime : Time;   // Verarbeitete Zeit
   END_VAR
   VAR RETAIN
      xTONStart : Bool;   // IN-Signal für Timer
      xSignal : Bool;   // Merker für Ausgangszustand
   END_VAR

   VAR_TEMP 
      xReset : Bool;   // Bit um im Takt den Timer zu reseten
   END_VAR


BEGIN
	#xSignal := #xOutput;
	
	REGION Cycle
	    IF #tInPeriodicTime = T#0s THEN
	        #tTONTime := T#500ms;//Defaultwert
	    ELSE
	        #tTONTime := #tInPeriodicTime;//Zeit durch Eingabe
	    END_IF;
	        
	    IF #timerTONR.Q THEN //wenn Timer abgelaufen.....
	        IF #xSignal THEN //aktueller Zustand wird gewechselt
	            #xSignal := 0;
	        ELSE //aktueller Zustand wird gewechselt
	            #xSignal := 1;
	        END_IF;
	        #xTONStart := 0; //...dann nimm Eingangssignal weg...
	        #xReset := TRUE; //...und rücksetze Timer
	    ELSE
	        #xTONStart := 1;
	    END_IF;
	    
	    IF #xSync (*OR (#TimerTONTime <> #TimerTON.PT) *) THEN
	        #xSync := 0;
	        #xTONStart := 0;
	        #xSignal := 0;
	    END_IF;
	END_REGION
	
	#rTrigSignal(CLK:=#xSignal);
	
	REGION Outputs
	    #xOutput := #xSignal;
	    #xOutFlag := #rTrigSignal.Q;
	END_REGION
	
	REGION Timer
	    // #TimerTON(IN := #xTimerTONStart,
	    //           PT := #TimerTONTime);
	    #timerTONR(IN:=NOT #xReset AND #xTONStart AND #xInActivate,
	               R:=#xReset,
	               PT:=#tTONTime);
	END_REGION
	
END_FUNCTION_BLOCK

