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:

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

Voraussetzungen

Entwicklungsumgebung

Zielplattform

Einzubindende SPS Bibliotheken

TwinCAT v2.8

PC (i386)

TcControllerToolbox.lib

TwinCAT v2.9 ab Build 947

BC

TcControllerToolbox.lb6

TwinCAT v2.9 ab Build 956

BX

TcControllerToolbox.lbx