easy-forum
		Downloadbereich => Xsoft-CoDeSys => Thema gestartet 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
			 
			
			- 
				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