Downloadbereich > Xsoft-CoDeSys
PT1 Filter
(1/1)
radar17892:
Ein weiteres Beispiel aus der eigenen Sammlung von nützlichen Bausteinen.
Ein PT1-Filter, universell einsetzbar in der Analogwertverarbeitung.
Hinweis: Bitte die Zeitkonstante nur so groß wie nötig wählen, um ungewollte Signalverzögerungen zu vermeiden.
--- Code: ---FUNCTION_BLOCK PT1_Filter
(*
##############################################################
Programmbeschreibung:
einfacher PT1 Filter zum glätten von verrauschten Signalen
##############################################################
Änderungsindex
Name:TL Version:0.1 Datum: 06.06.2012 Grund: neu
##############################################################
*)
VAR_INPUT
EN: BOOL; (*x Filter EIN*)
IN: REAL; (*r Signaleingang*)
TC: REAL := 1.0; (*r Zeitkonstante in s*)
Cycle: INT := 10; (*i Zykluszeit in ms*)
END_VAR
VAR_OUTPUT
OUT: REAL; (*r Signalausgang*)
END_VAR
VAR
K: REAL; (*K-Faktor*)
Cy: REAL; (*Zykluszeit in real*)
END_VAR
################################################
Cy:= INT_TO_REAL(Cycle);
K:= Cy / (Cy + 1000 * TC); (*Zeitfaktor berechnen*)
IF EN THEN
OUT:= OUT+K*(IN-OUT);; (*Filtern*)
ELSE
OUT:= IN; (*Bei Filter AUS, Signal durchreichen*)
END_IF
--- Ende Code ---
Have a lot of fun!
radar17892:
Hallo,
eine neue Version des Filters mit verbessertem Anlaufverhalten.
Im ersten Aufruf wird OUT:=IN übernommen, auch bei festem EN:= TRUE
Hierdurch wird ein Filterstartwert von 0 umgangen.
--- Code: ---FUNCTION_BLOCK PT1_Filter
(*
##############################################################
Programmbeschreibung:
einfacher PT1 Filter zum glätten von verrauschten Signalen
##############################################################
Änderungsindex
Name:TL Version:0.1 Datum: 06.06.2012 Grund: neu
Name:TL Version:0.2 Datum: 18.03.2015 Grund: Änderung Anlaufverhalten
##############################################################
*)
VAR_INPUT
EN: BOOL; (*x Filter EIN*)
IN: REAL; (*r Signaleingang*)
TC: REAL := 1.0; (*r Zeitkonstante in s*)
Cycle: INT := 10; (*i Zykluszeit in ms*)
END_VAR
VAR_OUTPUT
OUT: REAL; (*r Signalausgang*)
END_VAR
VAR
K: REAL; (*K-Faktor*)
Cy: REAL; (*Zykluszeit in real*)
xAnlauf: BOOL; (*Anlaufmerker*)
END_VAR
#########################################################
Cy:= INT_TO_REAL(Cycle);
K:= Cy / (Cy + 1000 * TC); (*Zeitfaktor berechnen*)
IF (xAnlauf AND EN) THEN
OUT:= OUT+K*(IN-OUT); (*filtern*)
ELSE
OUT:= IN; (*Bei Filter AUS, Signal durchreichen*)
END_IF
(*wird PT1 erstmals aufgerufen, soll der aktuelle Wert übernommen werden
um bei filtern nicht erst von Null hochlaufen zu müssen*)
IF NOT xAnlauf THEN xAnlauf :=TRUE; END_IF
--- Ende Code ---
Have a lot of fun!
radar17892:
Eine weitere Variante, Typ: Tiefpass
--- Code: ---FUNCTION_BLOCK Tiefpass
(*
##############################################################
Programmbeschreibung:
einfacher PT1 Filter nahe der e-Funktion
Y= ((X-Y)/N)+Y
Endwert wird nach N Zyklen erreicht (begrebzt auf 5-250)
##############################################################
Änderungsindex
Name:TL Version:0.1 Datum: 06.05.2017 Grund: neu
##############################################################
*)
VAR_INPUT
IN: REAL;
N: USINT:=50; (*Endwert wird nach N Zyklen erreicht*)
END_VAR
VAR_OUTPUT
OUT: REAL;
END_VAR
VAR
END_VAR
+++++++++++++++++++++++++++++++++++++
N:= LIMIT(5, N, 250);
OUT:= ( (IN - OUT) / N) + OUT;
--- Ende Code ---
Viel Spass!
Thomas
Navigation
[0] Themen-Index
Zur normalen Ansicht wechseln