Files
2026-06-29 16:28:48 +02:00

81 lines
2.1 KiB
Plaintext

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