Die Zweite Variante mit einem Timer:
FUNCTION_BLOCK EntprellungT
(*
##############################################################
Programmbeschreibung:
Entprellung von dig Eingangssignalen über einen Timer
ein- und ausschaltverzögert
Lib: standard
##############################################################
Änderungsindex
Name:TL Version:0.1 Datum: 20.12.2015 Grund: neu, Test OK
##############################################################
*)
VAR_INPUT
Geber: BOOL; (*Eingang*)
Ev_Wert: TIME := t#100ms; (*Einschaltverzögerung*)
Av_Wert: TIME := t#100ms; (*Ausschaltverzögerung*)
END_VAR
VAR_OUTPUT
out: BOOL; (*entprellter Ausgang*)
END_VAR
VAR
Zeit: TON; (*Timer*)
END_VAR
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
(*Einschaltverzögerung*)
IF NOT out AND Geber
THEN Zeit(IN:= TRUE, PT:= Ev_Wert, Q=> , ET=> );
IF Zeit.Q (*Verzögerungswert erreicht*)
THEN out:= TRUE;
Zeit(IN:= FALSE, PT:= Ev_Wert, Q=> , ET=> );(*Timer auf Null, wenn geschaltet*)
END_IF
ELSIF NOT out AND NOT Geber (*reset bei Verzögerungswert nicht erreicht*)
THEN Zeit(IN:= FALSE, PT:= Ev_Wert, Q=> , ET=> );
END_IF
(*Ausschaltverzögerung*)
IF out AND NOT Geber
THEN Zeit(IN:= TRUE, PT:= Av_Wert, Q=> , ET=> );
IF Zeit.Q (*Verzögerungswert erreicht*)
THEN out:= FALSE;
Zeit(IN:= FALSE, PT:= Av_Wert, Q=> , ET=> );(*Timer auf Null, wenn geschaltet*)
END_IF
ELSIF out AND Geber (*reset bei Verzögerungswert nicht erreicht*)
THEN Zeit(IN:= FALSE, PT:= Av_Wert, Q=> , ET=> );
END_IF
Im Anhang noch ein Bild der Aussenschnittstellen
Gruß Thomas