VAR_INPUT
IN: BOOL; (* starts timer with rising edge, resets timer with falling edge *)
Enable : BOOL ;
PT: TIME; (* time to pass, before Q is set *)
END_VAR
VAR_OUTPUT
Q: BOOL; (* is TRUE, PT seconds after IN had a rising edge *)
ET: TIME; (* elapsed time *)
END_VAR
VAR
TON : TON ;
r_trig_IN : R_TRIG ;
f_trig_Enable : F_TRIG ;
Time_Memo : TIME ;
END_VAR
(* Positiver Impuls *)
r_trig_IN (CLK:= IN);
(* Negativer Impuls *)
f_trig_Enable (CLK:= Enable);
IF r_trig_IN.Q THEN (* Zeit neu setzen *)
Time_Memo := PT ;
END_IF
IF f_trig_Enable.Q THEN (* Zeit unterbrechen *)
(* Restzeit sichern *)
Time_Memo := Time_Memo - TON.ET ;
END_IF
TON ( IN := Enable AND IN, PT:= Time_Memo);
IF TON.Q AND Enable THEN
Q := TRUE ;
END_IF
IF NOT IN THEN
Q := FALSE ;
END_IF
IF IN THEN
ET := PT - (Time_Memo - TON.ET);
ELSE
ET := T#0s ;
END_IF