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