FB_CTRL_DIGITAL_FILTER
Dieser Baustein berechnet eine diskrete Übertragungsfunktion mit der unten dargestellten Struktur. Mit dieser Struktur ist sowohl die Realisierung eines FIR-Filters (Finite Impulse Response) als auch die Realisierung eines IIR-Filters (Infinite Impulse Response) möglich. Die Übertragungsfunktion kann hierbei von beliebiger Ordnung n sein.
In den Parameter-Arrays werden die Koeffizienten der folgenden Übertragungsstruktur abgelegt:
Um diesen Funktionsbaustein nutzen zu können, müssen vom Programmierer in der SPS die folgenden Arrays angelegt werden:
ar_CoefficientsArray_a :
ARRAY[1..nFilterOrder+1] OF FLOAT;
ar_CoefficientsArray_b : ARRAY[1..nFilterOrder+1] OF
FLOAT;
ar_stDigitalFilterData : ARRAY[1..nFilterOrder ] OF
ST_CTRL_DIGITAL_FILTER_DATA;
In dem Array ar_CoefficientsArray_b werden die Koeffizienten b1 bis bn abgelegt. Diese müssen folgendermaßen angeordnet werden:
ar_CoefficientsArray_b[ 1 ] := b1;
ar_CoefficientsArray_b[ 2 ] := b2;
...
ar_CoefficientsArray_b[ n-1 ] := bn-1;
ar_CoefficientsArray_b[ n ] := bn;
In dem Array ar_CoefficientsArray_a werden die Koeffizienten a1 bis an abgelegt. Diese müssen folgendermaßen angeordnet werden:
ar_CoefficientsArray_a[ 1 ] := xxx; (* wird nicht ausgewertet
*)
ar_CoefficientsArray_a[ 2 ] := a2;
...
ar_CoefficientsArray_a[ n-1 ] := an-1;
ar_CoefficientsArray_a[ n ] := an;
Die internen Daten, die der Baustein benötigt, werden in dem Array ar_stDigitalFilterData abgelegt. Diese Daten dürfen innerhalb des SPS-Programms keinesfalls geändert werden. Diese Vorgehensweise wird auch in dem unten aufgeführten Beispielprogramm dargestellt.
VAR_INPUT
VAR_INPUT
fIn : FLOAT;
fManValue : FLOAT;
eMode : E_CTRL_MODE;
END_VAR
fIn : Eingang des Digitalfilters.
fManValue : Eingang, dessen Wert im Manual-Mode am Ausgang anliegt.
eMode : Eingang, der die Betriebsart des Bausteins festlegt.
VAR_OUTPUT
VAR_OUTPUT
fOut : FLOAT;
eState : E_CTRL_STATE;
bError : BOOL;
eErrorId : E_CTRL_ERRORCODES;
END_VAR
fOut : Ausgang des Digitalfilters
eState : State des Funktionsbausteins.
eErrorId : Liefert bei einem gesetzten bError-Ausgang die Fehlernummer.
bError : Wird TRUE, sobald ein Fehler eintritt.
VAR_IN_OUT
VAR_IN_OUT
stParams : ST_CTRL_DIGITAL_FILTER_PARAMS;
END_VAR
stParams : Parameterstruktur des Funktionsbausteins. Diese besteht aus den folgenden Elementen:
TYPE
ST_CTRL_DIGITAL_FILTER_PARAMS :
STRUCT
tTaskCycleTime : TIME; (* task cycle
time *)
tCtrlCycleTime : TIME := T#0ms; (* controller
cycle time *)
nFilterOrder : USINT;
pCoefficientsArray_a_ADR : POINTER TO FLOAT := 0;
nCoefficientsArray_a_SIZEOF : UINT;
pCoefficientsArray_b_ADR : POINTER TO FLOAT := 0;
nCoefficientsArray_b_SIZEOF : UINT;
pDigitalFilterData_ADR : POINTER TO
ST_CTRL_DIGITAL_FILTER_DATA;
nDigitalFilterData_SIZEOF : UINT;
END_STRUCT
END_TYPE
tTaskCycleTime : Zykluszeit, mit der der Funktionsbaustein aufgerufen wird. Diese entspricht der Task-Zykluszeit der aufrufenden Task, wenn der Baustein in jedem Zyklus aufgerufen wird.
tCtrlCycleTime : Zykluszeit, mit der der Regelkreis bearbeitet wird. Diese muss größer oder gleich der TaskCycleTime sein. Der Funktionsbaustein berechnet mit dieser Eingangsgröße intern, ob die Zustands- und Ausgangsgrößen im aktuellen Zyklus aktualisiert werden müssen.
nFilterOrder : Ordnung des Digitalfilters [0... ]
pCoefficientsArray_a_ADR : Adresse des Arrays mit den Koeffizienten a.
nCoefficientsArray_a_SIZEOF :Größe des Arrays mit den Koeffizienten a in Byte.
pCoefficientsArray_b_ADR : Adresse des Arrays mit den Koeffizienten b.
nCoefficientsArray_b_SIZEOF : Größe des Arrays mit den Koeffizienten b in Byte.
pDigitalFilterData_ADR : Adresse des Daten-Arrays.
nDigitalFilterData_SIZEOF : Größe des Daten-Arrays in Byte.
TYPE
ST_CTRL_DIGITAL_FILTER_DATA
STRUCT
Interne Struktur. Auf diese darf nicht schreibend
zugegriffen werden.
END_STRUCT
END_TYPE
Beispiel:
PROGRAM PRG_DIGITAL_FILTER_TEST
VAR
fbDigitalFilter : FB_CTRL_DIGITAL_FILTER;
ar_CoefficientsArray_a : ARRAY[1..3 ] OF FLOAT;
ar_CoefficientsArray_b : ARRAY[1..3 ] OF FLOAT;
ar_stDigitalFilterData : ARRAY[1..2 ] OF
ST_CTRL_DIGITAL_FILTER_DATA;
eMode : E_CTRL_MODE;
stParams : ST_CTRL_DIGITAL_FILTER_PARAMS;
eErrorId : E_CTRL_ERRORCODES;
bError : BOOL;
fIn : FLOAT := 0;
fOut : FLOAT;
bInit : BOOL := TRUE;
END_VAR
IF bInit
THEN
(* set values in the local arrays *)
ar_CoefficientsArray_a[1] := 0.0; (* not used *)
ar_CoefficientsArray_a[2] := 0.2;
ar_CoefficientsArray_a[3] := 0.1;
ar_CoefficientsArray_b[1] := 0.6;
ar_CoefficientsArray_b[2] := 0.4;
ar_CoefficientsArray_b[3] := 0.2;
(* set values in the parameter struct *)
stParams.tTaskCycleTime := T#2ms;
stParams.tCtrlCycleTime := T#2ms;
stParams.nFilterOrder := 2;
(* set the mode *)
eMode := eCTRL_MODE_ACTIVE;
bInit := FALSE;
END_IF
(* set addresses *)
stParams.pCoefficientsArray_a_ADR := ADR(
ar_CoefficientsArray_a);
stParams.nCoefficientsArray_a_SIZEOF := SIZEOF(
ar_CoefficientsArray_a);
stParams.pCoefficientsArray_b_ADR := ADR(
ar_CoefficientsArray_b);
stParams.nCoefficientsArray_b_SIZEOF := SIZEOF(
ar_CoefficientsArray_b);
stParams.pDigitalFilterData_ADR := ADR( ar_stDigitalFilterData
);
stParams.nDigitalFilterData_SIZEOF := SIZEOF(
ar_stDigitalFilterData );
fbDigitalFilter ( fIn := fIn,
eMode := eMode,
stParams := stParams,
fOut => fOut,
eErrorId => eErrorId,
bError => bError);