FB_CTRL_TRANSFERFUNCTION_1

FB_CTRL_TRANSFERFUNCTION_1 1:

Dieser Baustein berechnet eine diskrete Übertragungsfunktion mit der unten dargestellten ersten Standardform. Die Übertragungsfunktion kann hierbei von beliebiger Ordnung „n“ sein.

In den Parameter-Arrays werden die Koeffizienten der folgenden Übertragungsfunktion abgelegt:

FB_CTRL_TRANSFERFUNCTION_1 2:

Beschreibung des Übertragungsverhaltens

Die obige Übertragungsfunktion wird nach einigen Umformungen in jedem Abtastschritt mit der ersten Standardform berechnet.

FB_CTRL_TRANSFERFUNCTION_1 3:

Um diesen Funktionsbaustein nutzen zu können, müssen vom Programmierer in der SPS die folgenden Arrays angelegt werden:

aNumArray        : ARRAY[0..nNumOrder] OF FLOAT;
aDenArray        : ARRAY[0..nDenOrder] OF FLOAT;
aStructTfData    : ARRAY[0..nTfOrder] OF ST_CTRL_TRANSFERFUNCTION_1_DATA;

In dem Array aNumArray werden die Koeffizienten „b0“ „bis bn“ abgelegt. Diese müssen folgendermaßen angeordnet werden:

aNumArray[0] := b0;
aNumArray[1] := b1;
...
aNumArray[n-1] := bn-1;
aNumArray[n] := bn;

In dem Array ar_DenominatorArray werden die Koeffizienten „a0“ bis an“ abgelegt. Diese müssen folgendermaßen angeordnet werden:

aDenArray[0] := a0;
aDenArray[1] := a1;
...
aDenArray[n-1] := an-1;
aDenArray[n] := an;

Die internen Daten, die der Baustein benötigt, werden in dem Array ar_stTransferfunction1Data 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_TRANSFERFUNCTION_1 4: VAR_INPUT

VAR_INPUT
    fIn          : FLOAT;
    fManValue    : FLOAT;
    eMode        : E_CTRL_MODE;
END_VAR

Name

Typ

Beschreibung

fIn

FLOAT

Eingang der Übertragungsfunktion

fManValue

FLOAT

Eingang, dessen Wert im Manual-Mode am Ausgang anliegt.

eMode

E_CTRL_MODE

Eingang, der die Betriebsart des Bausteins festlegt.

FB_CTRL_TRANSFERFUNCTION_1 5: VAR_OUTPUT

VAR_OUTPUT
    fOut        : FLOAT;
    eState      : E_CTRL_STATE;
    bError      : BOOL;
    eErrorId    : E_CTRL_ERRORCODES;
END_VAR

Name

Typ

Beschreibung

fOut

FLOAT

Ausgang der Übertragungsfunktion

eState

E_CTRL_STATE

State des Funktionsbausteins

bError

BOOL

Liefert bei einem gesetzten bError-Ausgang die Fehlernummer.

eErrorId

E_CTRL_ERRORCODES

Wird TRUE, sobald ein Fehler eintritt.

VAR_IN_OUT

VAR_IN_OUT
    stParams    : ST_CTRL_TRANSFERFUNCTION_1_PARAMS;
END_VAR

Name

Typ

Beschreibung

stParams

ST_CTRL_TRANSFERFUNCTION_1_PARAMS

Parameterstruktur des Funktionsbausteins

stParams besteht aus den folgenden Elementen:

TYPE
ST_CTRL_TRANSFERFUNCTION_1_PARAMS:
STRUCT
    tTaskCycleTime                 : TIME;    
    tCtrlCycleTime                 : TIME := T#0ms;
    nOrderOfTheTransferfunction    : USINT;
    pNumeratorArray_ADR            : POINTER TO FLOAT := 0;
    nNumeratorArray_SIZEOF         : UINT;
    pDenominatorArray_ADR          : POINTER TO FLOAT := 0;
    nDenomiantorArray_SIZEOF       : UINT;
    pTransferfunction1Data_ADR     : POINTER TO
ST_CTRL_TRANSFERFUNCTION_1_DATA;
    nTransferfunction1Data_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.

nOrderOfTheTransferfunction

USINT

Ordnung der Übertragungsfunktion [0...]

pNumeratorArray_ADR

POINTER TO FLOAT

Adresse des Arrays mit den Zählerkoeffizienten

nNumeratorArray_SIZEOF

UINT

Größe des Arrays mit den Zählerkoeffizienten in Byte

pDenominatorArray_ADR

POINTER TO FLOAT

Adresse des Arrays mit den Nennerkoeffizienten

nDenomiantorArray_SIZEOF

UINT

Größe des Arrays mit den Nennerkoeffizienten in Byte

pTransferfunction1Data_ADR

POINTER TO
ST_CTRL_
TRANSFER
FUNCTION_1_
DATA

Adresse des Daten-Arrays

nTransferfunction1Data_SIZEOF 

UINT

Größe des Daten-Arrays in Byte

Beispiel:

PROGRAM PRG_TRANSFERFUNCTION_1_TEST
VAR CONSTANT
    nTfOrder    : USINT := 2;
END_VAR
VAR
    aNumArray          : ARRAY[0..nNumOrder] OF FLOAT;
    aDenArray          : ARRAY[0..nDenOrder] OF FLOAT;
    aStTfData          : ARRAY[0..nTfOrder] OF ST_CTRL_TRANSFERFUNCTION_1_DATA;
    eMode              : E_CTRL_MODE;
    stParams           : ST_CTRL_TRANSFERFUNCTION_1_PARAMS;
    eErrorId           : E_CTRL_ERRORCODES;
    bError             : BOOL;
    fbTansferfunction  : FB_CTRL_TRANSFERFUNCTION_1;
    bInit              : BOOL := TRUE;
    fIn                : FLOAT := 0;
    fOut               : FLOAT;
    b_0, b_1, b_2      : FLOAT;
    a_0,a_1,a_2        : FLOAT;
END_VAR
IF bInit THEN
    aNumArray[0] := 1.24906304658218E-007;
    aNumArray[1] := 2.49812609316437E-007;
    aNumArray[2] := 1.24906304658218E-007;
    aDenArray[0] := 0.998501124344101;
    aDenArray[1] := -1.99850062471888;
    aDenArray[2] := 1.0;
    stParams.tTaskCycleTime        := T#2ms;
    stParams.tCtrlCycleTime        := T#2ms;
    stParams.nOrderOfTheTransferfunction := nTfOrder;
    eMode := eCTRL_MODE_ACTIVE;
    bInit := FALSE;
END_IF
stParams.pNumeratorArray_ADR            := ADR(aNumArray);
stParams.nNumeratorArray_SIZEOF         := SIZEOF(aNumArray);
stParams.pDenominatorArray_ADR          := ADR(aDenArray);
stParams.nDenominatorArray_SIZEOF       := SIZEOF(aDenArray);
stParams.pTransferfunction1Data_ADR     := ADR(aStructTfData);
stParams.nTransferfunction1Data_SIZEOF  := SIZEOF(aStructTfData);
fbTansferfunction (fIn := fIn,
                   eMode := eMode,
                   stParams := stParams,
                   fOut => fOut,
                   eErrorId => eErrorId,
                   bError => bError);