Downloadbereich > Xsoft-CoDeSys
FB zur Entprellung von digitalen Eingängen
(1/1)
radar17892:
Hallo Leute,
heute stelle ich euch sehr nützliche FB's zur Entprellung von digitalen Eingangssignalen vor. In erster Linie verwende ich diese, um Staub/ verschmutzungsbedingte Fehlschaltungen von Lichtschranken zu eliminieren und dadurch saubere Signale zur Materialerkennung zu erhalten.
Als erstes ein FB mit interem Zähler, der nach N Zyklen eines Stabilen Eingangssignals den Ausgang durchschaltet. Ein- und Ausschaltverzögerung können getrennt als Zyklenzahl vorgegeben werden.
--- Code: ---FUNCTION_BLOCK EntprellungZ
(*
##############################################################
Programmbeschreibung:
Entprellung von dig Eingangssignalen über (Zyklen-)Zähler
ein- und ausschaltverzögert nach N Zyklen
Lib: standart
##############################################################
Änderungsindex
Name:TL Version:0.1 Datum: 20.12.2015 Grund: neu, Test OK
##############################################################
*)
VAR_INPUT
Geber: BOOL; (*Eingang*)
E_Wert: UINT:=10; (*Einschaltvervögerung nach N Zyklen*)
A_Wert: UINT:=10; (*Ausschaltvervögerung nach N Zyklen*)
END_VAR
VAR_OUTPUT
out: BOOL; (*entprellter Ausgang*)
END_VAR
VAR
Zaehler: UINT; (*Zählwert*)
END_VAR
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++
(*Einschaltvervögerung nach N Zyklen*)
IF NOT out AND Geber
THEN Zaehler:= Zaehler + 1; (*Zyklen hochzählen*)
IF Zaehler >= E_Wert (*Verzögerungswert erreicht*)
THEN out:= TRUE;
Zaehler:=0; (*Zähler auf Null, wenn geschaltet*)
END_IF
ELSIF NOT out AND NOT Geber (*reset bei Verzögerungswert nicht erreicht*)
THEN Zaehler:=0;
END_IF
(*Ausschaltvervögerung nach N Zyklen*)
IF out AND NOT Geber
THEN Zaehler:= Zaehler + 1; (*Zyklen hochzählen*)
IF Zaehler >= A_Wert (*Verzögerungswert erreicht*)
THEN out:= FALSE;
Zaehler:=0; (*Zähler auf Null, wenn geschaltet*)
END_IF
ELSIF out AND Geber (*reset bei Verzögerungswert nicht erreicht*)
THEN Zaehler:=0;
END_IF
--- Ende Code ---
radar17892:
Die Zweite Variante mit einem Timer:
--- Code: ---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
--- Ende Code ---
Im Anhang noch ein Bild der Aussenschnittstellen
Gruß Thomas
Navigation
[0] Themen-Index
Zur normalen Ansicht wechseln