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
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