FB_CTRL_DIGITAL_FILTER

FB_CTRL_DIGITAL_FILTER 1:

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:

FB_CTRL_DIGITAL_FILTER 2:

FB_CTRL_DIGITAL_FILTER 3:

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.

FB_CTRL_DIGITAL_FILTER 4: 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.

FB_CTRL_DIGITAL_FILTER 5: 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 bError-Ausgang die Fehlernummer.

FB_CTRL_DIGITAL_FILTER 6: Ein-/ Ausgänge

VAR_IN_OUT
    stParams        : ST_CTRL_DIGITAL_FILTER_PARAMS;
END_VAR

Name

Typ

Beschreibung

stParams

ST_CTRL_
DIGITAL_FILTER_PARAMS

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_
DIGITAL_
FILTER_DATA

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