easy-forum

Downloadbereich => Xsoft-CoDeSys => Thema gestartet von: radar17892 am Januar 25, 2018, 12:48:27 Nachmittag

Titel: FB zur Entprellung von digitalen Eingängen
Beitrag von: radar17892 am Januar 25, 2018, 12:48:27 Nachmittag
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.

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


Titel: Antw:FB zur Entprellung von digitalen Eingängen
Beitrag von: radar17892 am Januar 25, 2018, 12:58:36 Nachmittag
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