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!