FUNCTION_BLOCK "NewTON"TITLE =TON (unterbrechbar)
//Der Baustein verhält sich kompatibel zum Einschaltverzögerung SFB4 (TON), mit
//dem Unterschied, dass der Zeitablauf unterbrechbar ist
AUTHOR : 'Blockmove'
VERSION : 0.1
VAR_INPUT
On : BOOL := TRUE;
IN : BOOL ;
PT : TIME ;
END_VAR
VAR_OUTPUT
Q : BOOL ;
ET : TIME ;
END_VAR
VAR
FM_IN : BOOL ; //Flankenmerker IN
FM_ON : BOOL ; //Flankenmerker ON
Startzeit : TIME ;
Endzeit : TIME ;
Restzeit : TIME ;
END_VAR
VAR_TEMP
SysTime : TIME ; //Aktuelle Systemzeit
FP_IN : BOOL ; //Positive Flanke IN
FP_ON : BOOL ; //Positive Flanke ON
FN_ON : BOOL ; //Negative Flanke ON
END_VAR
BEGIN
NETWORK
TITLE =akuelle Systemzeit einlesen
CALL "TIME_TCK" (
RET_VAL := #SysTime);
NETWORK
TITLE =// Positive und Negative Flanke ON
U #On;
UN #FM_ON;
= #FP_ON; // Positive Flanke ON
UN #On;
U #FM_ON;
= #FN_ON; // Negative Flanke ON
U #On;
= #FM_ON; // Flankenmerker
NETWORK
TITLE =Bei neg. Flanke ON Restzeit sichern
U #FN_ON;
SPBN FN1;
L #Endzeit;
L #SysTime;
-D ;
T #Restzeit;
FN1: NOP 0;
NETWORK
TITLE =Bei pos. Flanke ON Neue Endzeit bereichen
U #FP_ON;
SPBN FP1;
L #SysTime;
L #Restzeit;
+D ;
T #Endzeit;
FP1: NOP 0;
NETWORK
TITLE =Wenn ON = 0, dann ist hier Schluss
UN #On;
BEB ;
NETWORK
TITLE =// Positive Flanke IN
U #IN;
FP #FM_IN;
= #FP_IN;
NETWORK
TITLE =Endzeit ermitteln
U #FP_IN;
SPBN End1;
L #SysTime;
L #PT;
+D ;
T #Endzeit;
L L#0;
T #ET;
End1: NOP 0;
NETWORK
TITLE =ET
U #IN; // Wenn IN = 0,
SPB ET1; // dann Wert 0
L L#0; // in ET schreiben
SPA ET3;
ET1: UN #Q; // Wenn Ausgang = 1,
SPB ET2; // dann den Zeitwert PT
L #PT; // in ET schreiben
SPA ET3;
ET2: L #SysTime; // ansonsten
L #Endzeit; // ET = Systemzeit - Endzeit + PT
-D ;
L #PT;
+D ;
ET3: T #ET;
NETWORK
TITLE =Ausgang
U( ;
L #SysTime;
L #Endzeit;
>=D ;
) ;
U #IN;
= #Q;
END_FUNCTION_BLOCK