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:
aCoefficientsArray_a : ARRAY[1..nFilterOrder+1] OF FLOAT;
aCoefficientsArray_b : ARRAY[1..nFilterOrder+1] OF FLOAT;
aStDigitalFilterData : ARRAY[1..nFilterOrder] OF
ST_CTRL_DIGITAL_FILTER_DATA;
In dem Array aCoefficientsArray_b
werden die Koeffizienten „b1“ bis „bn“ abgelegt. Diese müssen folgendermaßen angeordnet werden:
aCoefficientsArray_b[1] := b1;
aCoefficientsArray_b[2] := b2;
…
aCoefficientsArray_b[n-1] := bn-1;
aCoefficientsArray_b[n] := bn;
In dem Array aCoefficientsArray_a
werden die Koeffizienten „a1“ bis „an“ abgelegt.
Diese müssen folgendermaßen angeordnet werden:
aCoefficientsArray_a[1] := xxx; (* not being evaluated *)
aCoefficientsArray_a[2] := a2;
...
aCoefficientsArray_a[n-1] := an-1;
aCoefficientsArray_a[n] := an;
Die internen Daten, die der Baustein benötigt, werden in dem Array aStDigitalFilterData
abgelegt. Diese Daten dürfen innerhalb des SPS-Programms keinesfalls geändert werden. Diese Vorgehensweise wird auch in dem unten aufgeführten Beispielprogramm dargestellt.
Eingänge
VAR_INPUT
fIn : FLOAT;
fManValue : FLOAT;
eMode : E_CTRL_MODE;
END_VAR
Name | Typ | Beschreibung |
---|---|---|
fIn | FLOAT | Eingang des Digitalfilters |
fManValue | FLOAT | Eingang, dessen Wert im Manual-Mode am Ausgang anliegt. |
eMode | E_CTRL_MODE | Eingang, der die Betriebsart des Bausteins festlegt. |
Ausgänge
VAR_OUTPUT
fOut : FLOAT;
eState : E_CTRL_STATE;
bError : BOOL;
eErrorId : E_CTRL_ERRORCODES;
END_VAR
Name | Typ | Beschreibung |
---|---|---|
fOut | FLOAT | Ausgang des Digitalfilters |
eState | E_CTRL_STATE | State des Funktionsbausteins |
bError | BOOL | Wird TRUE, sobald ein Fehler eintritt. |
eErrorId | E_CTRL_ERRORCODES | Liefert bei einem gesetzten |
Ein-/ Ausgänge
VAR_IN_OUT
stParams : ST_CTRL_DIGITAL_FILTER_PARAMS;
END_VAR
Name | Typ | Beschreibung |
---|---|---|
stParams | ST_CTRL_ | Parameterstruktur des Funktionsbausteins |
stParams
besteht aus den folgenden Elementen:
TYPE
ST_CTRL_DIGITAL_FILTER_PARAMS :
STRUCT
tTaskCycleTime : TIME;
tCtrlCycleTime : TIME := T#0ms;
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
Name | Typ | Beschreibung |
---|---|---|
tTaskCycleTime | TIME | Zykluszeit, mit der der Funktionsbaustein aufgerufen wird. Diese entspricht der Task-Zykluszeit der aufrufenden Task, wenn der Baustein in jedem Zyklus aufgerufen wird. |
tCtrlCycleTime | TIME | 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 | USINT | Ordnung des Digitalfilters [0... ] |
pCoefficientsArray_a_ADR | POINTER TO FLOAT | Adresse des Arrays mit den Koeffizienten a |
nCoefficientsArray_a_SIZEOF | UINT | Größe des Arrays mit den Koeffizienten a in Byte |
pCoefficientsArray_b_ADR | POINTER TO FLOAT | Adresse des Arrays mit den Koeffizienten b |
nCoefficientsArray_b_SIZEOF | UINT | Größe des Arrays mit den Koeffizienten b in Byte |
pDigitalFilterData_ADR | POINTER TO ST_CTRL_ | Adresse des Daten-Arrays |
nDigitalFilterData_SIZEOF | UINT | Größe des Daten-Arrays in Byte |
TYPE
ST_CTRL_DIGITAL_FILTER_DATA
STRUCT
Internal structure. This must not be written to.
END_STRUCT
END_TYPE
Beispiel:
PROGRAM PRG_DIGITAL_FILTER_TEST
VAR
fbDigitalFilter : FB_CTRL_DIGITAL_FILTER;
aCoefficientsArray_a : ARRAY[1..3] OF FLOAT;
aCoefficientsArray_b : ARRAY[1..3] OF FLOAT;
aStDigitalFilterData : 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
aCoefficientsArray_a[1] := 0.0; (* not used *)
aCoefficientsArray_a[2] := 0.2;
aCoefficientsArray_a[3] := 0.1;
aCoefficientsArray_b[1] := 0.6;
aCoefficientsArray_b[2] := 0.4;
aCoefficientsArray_b[3] := 0.2;
stParams.tTaskCycleTime := T#2ms;
stParams.tCtrlCycleTime := T#2ms;
stParams.nFilterOrder := 2;
eMode := eCTRL_MODE_ACTIVE;
bInit := FALSE;
END_IF
stParams.pCoefficientsArray_a_ADR := ADR(aCoefficientsArray_a);
stParams.nCoefficientsArray_a_SIZEOF := SIZEOF(aCoefficientsArray_a);
stParams.pCoefficientsArray_b_ADR := ADR(aCoefficientsArray_b);
stParams.nCoefficientsArray_b_SIZEOF := SIZEOF(aCoefficientsArray_b);
stParams.pDigitalFilterData_ADR := ADR(astDigitalFilterData);
stParams.nDigitalFilterData_SIZEOF := SIZEOF(aStDigitalFilterData);
fbDigitalFilter ( fIn := fIn,
eMode := eMode,
stParams := stParams,
fOut => fOut,
eErrorId => eErrorId,
bError => bError);