FUNCTION_BLOCK "TON_AWL"
{ S7_Optimized_Access := 'FALSE' }
VERSION : 0.1
VAR_INPUT
IN : Bool; // Sobald HIGH anliegt, wird Baustein ausgeführt
TS : Time; // Zeit für Abfallverzögerung
RESET : Bool; // Sobald HIGH anliegt, wird Ausgang resettet
END_VAR
VAR_OUTPUT
OUT : Bool; // Ausgang
Time_UP : Time; // Vergange Zeit des Timers hinaufzählend
END_VAR
VAR
Timer1 : Time; // Wert des 1ten Timers
Timer2 : Time; // Wert des 2ten Timers
LastIN : Bool; // Zustand von IN im letzten Zyklus
TimeSET : Bool; // Überprüfung ob erster Zeitwert gespeichert wurde
END_VAR
BEGIN
NETWORK
TITLE = Ausgang
U #RESET;//liegt Reset an
R #OUT;//Ausgang sofort resetten
R #TimeSET;//muss neue positive Flanke auftreten damit Programmablauf wieder von vorne beginnt
SPB Reset;
//positive Flankenänderung erkannt - Zeitwert zu diesem Zeitpunkt speichern
U #IN;
UN #LastIN;
SPB Timer1_Calc;
//Merken des letzten Zustands des Eingangs - für Flankenerkennung
Continue1: U #IN;
S #LastIN;
UN #IN;
R #LastIN;
//erster Zeitwert noch nicht gesetzt
ON #TimeSET;
ON #IN;
R #OUT;
BEB;
//akutellen Zeitwert berechnen
CALL TIME_TCK
( RET_VAL := #Timer2
);
//verstrichene Zeit berechnen wenn Ausgang noch nicht gesetzt
UN #OUT;
SPB Calc_TimeDiff;
//sobald verstrichene Zeit größer als angelegte Zeit ist -> Ausgang setzen
Continue2: L #Time_UP;
L #Time;
>D;
= #OUT;
//Bausteinende
BEA;
Timer1_Calc: CALL TIME_TCK
( RET_VAL := #Timer1
);
S #TimeSET;
SPB Continue1;
Calc_TimeDiff: L #Timer2;
L #Timer1;
-D;
T #Time_UP;
SPB Continue2;
Reset: L 0;
T #Time_UP;//damit verstrichene Zeit wert bei Visualisierung bei Reset auf 0 zurückgesetzt wird
BEB;//Bausteinausfürhung beenden -> Einsparung Zykluszeit
END_FUNCTION_BLOCK