FB_CTRL_TRANSFERFUNCTION_1
Dieser Baustein berechnet eine diskrete Übertragungsfunktion mit der unten dargestellten 1. Standardform. Die Übertragungsfunktion kann hierbei von beliebiger Ordnung n sein.
In den Parameter-Arrays werden die Koeffizienten der folgenden Übertragungsfunktion abgelegt:
Beschreibung des Übertragungsverhalten:
Die obige Übertragungsfunktion wird nach einigen Umformungen in jedem Abtastschritt mit der 1. Standardform berechnet.
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_stTransferfunction1Data : ARRAY[0..nOrderOfTheTransferfunction]
OF ST_CTRL_TRANSFERFUNCTION_1_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_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.
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_1_PARAMS;
END_VAR
stParams : Parameterstruktur des Funktionsbausteins. Diese besteht aus den folgenden Elementen:
TYPE
ST_CTRL_TRANSFERFUNCTION_1_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;
pTransferfunction1Data_ADR : POINTER TO
ST_CTRL_TRANSFERFUNCTION_1_DATA;
nTransferfunction1Data_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.
pTransferfunction1Data_ADR : Adresse des Daten-Arrays.
nTransferfunction1Data_SIZEOF : Größe des Daten-Arrays in Byte.
TYPE
ST_CTRL_TRANSFERFUNCTION_1_DATA:
STRUCT
Interne Struktur. Auf diese darf nicht schreibend
zugegriffen werden.
END_STRUCT
END_TYPE
Beispiel:
PROGRAM PRG_TRANSFERFUNCTION_1_TEST
VAR CONSTANT
nOrderOfTheTransferfunction : USINT := 2;
END_VAR
VAR
ar_fNumeratorArray :
ARRAY[0..nOrderOfTheTransferfunction] OF FLOAT;
ar_DenominatorArray :
ARRAY[0..nOrderOfTheTransferfunction] OF FLOAT;
ar_stTransferfunction1Data :
ARRAY[0..nOrderOfTheTransferfunction] 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
(* 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.pTransferfunction1Data_ADR := ADR(
ar_stTransferfunction2Data );
stParams.nTransferfunction1Data_SIZEOF := SIZEOF(
ar_stTransferfunction2Data );
(* call the function block *)
fbTansferfunction ( fIn := fIn,
eMode := eMode,
stParams := stParams,
fOut => fOut,
eErrorId => eErrorId,
bError => bError
);