FB_CTRL_TRANSFERFUNCTION_2
Dieser Baustein berechnet eine diskrete Übertragungsfunktion mit der unten dargestellten 2. Standardform. Die Übertragungsfunktion kann hierbei von beliebiger Ordnung n sein.
In den Parameter-Arrays werden die Koeffizienten der folgenden Übertragungsfunktion abgelegt:
Beschreibung des Übertragungsverhaltens:
Die interne Berechnung erfolgt in jedem Abtastschritt nach der 2. Standardform, für die das folgende Blockschaltbild gilt:
Durch einige Umformungen lässt sich die Übertragungsfunktion auf die im Blockschaltbild dargestellte Form bringen:
Die Koeffizienten des Zählerpolynoms berechnen sich dabei nach folgender Vorschrift:
Um diesen Funktionsbaustein nutzen zu können, müssen vom Programmierer in der SPS die folgenden Arrays angelegt werden:
ar_fNumeratorArray :
ARRAY[0..nOrderOfTheTransferfunction] OF FLOAT;
ar_DenominatorArray : ARRAY[0..nOrderOfTheTransferfunction]
OF FLOAT;
ar_stTransferfunction2Data : ARRAY[0..nOrderOfTheTransferfunction]
OF ST_CTRL_TRANSFERFUNCTION_2_DATA;
In dem Array ar_fNumeratorArray werden die Koeffizienten b0 bis bn abgelegt. Diese müssen folgendermaßen angeordnet werden:
ar_fNumeratorArray[
0 ] := b0;
ar_fNumeratorArray[ 1 ] := b1;
...
ar_fNumeratorArray[ n-1 ] := bn-1;
ar_fNumeratorArray[ n ] := bn;
In dem Array ar_DenominatorArray werden die Koeffizienten a0 bis an abgelegt. Diese müssen folgendermaßen angeordnet werden:
ar_DenominatorArray
[ 0 ] := a0;
ar_DenominatorArray [ 1 ] := a1;
...
ar_DenominatorArray [ n-1 ] := an-1;
ar_DenomiantorArray [ n ] := an;
Die internen Daten, die der Baustein benötigt, werden in dem Array ar_stTransferfunction2Data 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 der Übertragungsfunktion.
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 der Übertragungsfunktion.
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_TRANSFERFUNCTION_2_PARAMS;
END_VAR
stParams : Parameterstruktur des Funktionsbausteins. Diese besteht aus den folgenden Elementen:
TYPE
ST_CTRL_TRANSFERFUNCTION_2_PARAMS:
STRUCT
tTaskCycleTime : TIME; (* task
cycle time in seconds *)
tCtrlCycleTime : TIME := T#0ms; (*
controller cycle time *)
nOrderOfTheTransferfunction : USINT;
pNumeratorArray_ADR : POINTER TO FLOAT :=
0;
nNumeratorArray_SIZEOF : UINT;
pDenominatorArray_ADR : POINTER TO FLOAT :=
0;
nDenomiantorArray_SIZEOF : UINT;
pTransferfunction2Data_ADR : POINTER TO
ST_CTRL_TRANSFERFUNCTION_2_DATA;
nTransferfunction2Data_SIZEOF : UINT;
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.
nOrderOfTheTransferfunction : Ordnung der Übertragungsfunktion [0... ]
pNumeratorArray_ADR : Adresse des Arrays mit den Zählerkoeffizienten.
nNumeratorArray_SIZEOF : Größe des Arrays mit den Zählerkoeffizienten in Byte.
pDenominatorArray_ADR : Adresse des Arrays mit den Nennerkoeffizienten.
nDenominatorArray_SIZEOF : Größe des Arrays mit den Nennerkoeffizienten in Byte.
pTransferfunction2Data_ADR : Adresse des Daten-Arrays.
nTransferfunction2Data_SIZEOF : Größe des Daten-Arrays in Byte.
TYPE
ST_CTRL_TRANSFERFUNCTION_2_DATA:
STRUCT
Interne Struktur. Auf diese darf nicht schreibend
zugegriffen werden.
END_STRUCT
END_TYPE
Beispiel:
PROGRAM PRG_TRANSFERFUNCTION_2_TEST
VAR CONSTANT
nOrderOfTheTransferfunction : USINT := 2;
END_VAR
VAR
ar_fNumeratorArray :
ARRAY[0..nOrderOfTheTransferfunction] OF FLOAT;
ar_DenominatorArray :
ARRAY[0..nOrderOfTheTransferfunction] OF FLOAT;
ar_stTransferfunction2Data :
ARRAY[0..nOrderOfTheTransferfunction] OF
ST_CTRL_TRANSFERFUNCTION_2_DATA;
eMode : E_CTRL_MODE;
stParams : ST_CTRL_TRANSFERFUNCTION_2_PARAMS;
eErrorId : E_CTRL_ERRORCODES;
bError : BOOL;
fbTansferfunction : FB_CTRL_TRANSFERFUNCTION_2;
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
(* set values in the local arrays *)
ar_fNumeratorArray[0] := 1.24906304658218E-007;
ar_fNumeratorArray[1] := 2.49812609316437E-007;
ar_fNumeratorArray[2] := 1.24906304658218E-007;
ar_DenominatorArray[0] := 0.998501124344101;
ar_DenominatorArray[1] := -1.99850062471888;
ar_DenominatorArray[2] := 1.0;
(* set values in the parameter struct *)
stParams.tTaskCycleTime := T#2ms;
stParams.tCtrlCycleTime := T#2ms;
stParams.nOrderOfTheTransferfunction :=
nOrderOfTheTransferfunction;
(* set the mode *)
eMode := eCTRL_MODE_ACTIVE;
bInit := FALSE;
END_IF
(* set the addresses *)
stParams.pNumeratorArray_ADR := ADR( ar_fNumeratorArray);
stParams.nNumeratorArray_SIZEOF := SIZEOF(
ar_fNumeratorArray);
stParams.pDenominatorArray_ADR := ADR( ar_DenominatorArray );
stParams.nDenominatorArray_SIZEOF := SIZEOF( ar_DenominatorArray
);
stParams.pTransferfunction2Data_ADR := ADR(
ar_stTransferfunction2Data );
stParams.nTransferfunction2Data_SIZEOF := SIZEOF(
ar_stTransferfunction2Data );
fbTansferfunction ( fIn := fIn,
eMode := eMode,
stParams := stParams,
fOut => fOut,
eErrorId => eErrorId,
bError => bError
);