Autor Thema: PT1 Filter  (Gelesen 2785 mal)

Offline radar17892

  • Full Member
  • ***
  • Beiträge: 430
  • Think easy!
PT1 Filter
« 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!
« Letzte Änderung: Januar 13, 2015, 20:18:36 Nachmittag von radar17892 »
Weil Einfach einfach Einfach ist!

Offline radar17892

  • Full Member
  • ***
  • Beiträge: 430
  • Think easy!
Re:PT1 Filter
« Antwort #1 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!
Weil Einfach einfach Einfach ist!

Offline radar17892

  • Full Member
  • ***
  • Beiträge: 430
  • Think easy!
Antw:PT1 Filter
« Antwort #2 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

Weil Einfach einfach Einfach ist!