easy-forum

Downloadbereich => Xsoft-CoDeSys => Thema gestartet von: radar17892 am Oktober 26, 2014, 13:48:21 Nachmittag

Titel: PT1 Filter
Beitrag von: radar17892 am Oktober 26, 2014, 13:48:21 Nachmittag
Hinweis: Aus meiner praktischen Erfahrung über die Jahre, setze ich mittlerweile nur noch den untenstehenden FB Tiefpass ein.
   Grund ist der einfache Code und die nicht mehr benötigte Zykluszeit.

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.

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

Have a lot of fun!
Titel: Re:PT1 Filter
Beitrag von: radar17892 am März 18, 2015, 22:02:54 Nachmittag
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.

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


Have a lot of fun!
Titel: Antw:PT1 Filter
Beitrag von: radar17892 am Januar 25, 2018, 13:29:29 Nachmittag
Eine weitere Variante, Typ: Tiefpass

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;

Viel Spass!
Thomas