FB_CTRL_LOOP_SCHEDULER
Mit diesem Funktionsbaustein kann die Systemlast von mehreren Regelkreisen, welche mit der gleichen tCtrlCycleTime parametriert sind und für die die Bedingung tCtrlCycleTime > tTaskCycleTime gilt, verteilt werden. Mit dem Ausgangsvektor, der von diesem Baustein berechnet wird, werden die einzelnen Regelkreise zeitlich versetzt gestartet, so dass sich eine Verteilung der Systemlast ergibt.
Verhalten des Ausgangsvektors:
In diesem Bild werden 6 Regelkreise verwaltet. Bei diesen gilt tCtrlCycleTime = 7 · tTaskCycleTime.
Um den Funktionsbaustein nutzen zu können, muss vom Programmierer in der SPS das folgende Array angelegt werden:
arrOutputVector :
ARRAY[1..nNumberOfControlLoops] OF BOOL;
Die Bits in diesem Vektor werden von dem Funktionsbaustein auf TRUE oder FALSE gesetzt. Die Regelkreise, die mit dem Loop-Scheduler verwaltet werden, sollten dann in den eCTRL_MODE_ACTIVE geschaltet werden, wenn das entsprechende Bit im Ausgangsvektor TRUE ist. Siehe Beispielcode unten.
VAR_INPUT
VAR_INPUT
nManValue : DWORD;
eMode : E_CTRL_MODE;
END_VAR
nManValue : Mit diesem Eingang können im eCTRL_MODE_MANUAL die ersten 32 Bit in dem Ausgangsvektor gesetzt werden. Eine 1 setzt das erste Bit, eine 2 das zweite Bit, eine 3 das erste und zweite Bit, ...
eMode : Eingang, der die Betriebsart des Bausteins festlegt.
VAR_OUTPUT
VAR_OUTPUT
eState : E_CTRL_STATE;
eErrorId : E_CTRL_ERRORCODES;
bError : BOOL;
END_VAR
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_LOOP_SCHEDULER_PARAMS;
END_VAR
stParams : Parameterstruktur des Loop-Schedulers. Diese besteht aus den folgenden Elementen:
TYPE
ST_CTRL_LOOP_SCHEDULER_PARAMS:
STRUCT
tCtrlCycleTime : TIME := T#0ms; (*
controller cycle time [TIME] *)
tTaskCycleTime : TIME := T#0ms; (* task
cycle time [TIME] *)
nNumberOfControlLoops : UINT;
pOutputVector_ADR : POINTER TO BOOL := 0;
nOutputVector_SIZEOF : UINT := 0;
END_STRUCT
END_TYPE
tCtrlCycleTime : Zykluszeit, mit der die Regelkreise bearbeitet werden, die mit dem Loop-Scheduler verwaltet werden. Diese muss größer oder gleich der TaskCycleTime sein.
tTaskCycleTime : Zykluszeit, mit der der Loop-Scheduler und die Funktionsbausteine der Regelkreise aufgerufen werden. Diese entspricht der Task-Zykluszeit der aufrufenden Task, wenn der Baustein in jedem Zyklus aufgerufen wird.
nNumberOfControlLoops : Anzahl der Regelkreise die verwaltet werden.
pOutputVector_ADR :.Adresse des Ausgangsvektors.
nOutputVector_SIZEOF :Größe des Ausgangsvektors in Byte.
Beispiel:
PROGRAM PRG_LoopScheduler
VAR
arrOutputVector : ARRAY[1..5] OF BOOL;
eMode : E_CTRL_MODE;
stParams : ST_CTRL_LOOP_SCHEDULER_PARAMS;
eErrorId : E_CTRL_ERRORCODES;
bError : BOOL;
fbCTRL_LoopScheduler : FB_CTRL_LOOP_SCHEDULER;
bInit : BOOL := TRUE;
(* modes of the control loops *)
eMode_CtrlLoop_1 : E_CTRL_MODE;
eMode_CtrlLoop_2 : E_CTRL_MODE;
eMode_CtrlLoop_3 : E_CTRL_MODE;
eMode_CtrlLoop_4 : E_CTRL_MODE;
eMode_CtrlLoop_5 : E_CTRL_MODE;
END_VAR
IF bInit
THEN
stParams.tCtrlCycleTime := T#10ms;
stParams.tTaskCycleTime := T#2ms;
stParams.nNumberOfControlLoops := 5;
bInit := FALSE;
END_IF
(* set addresses *)
stParams.nOutputVector_SIZEOF := SIZEOF(arrOutputVector);
stParams.pOutputVector_ADR := ADR(arrOutputVector);
(* call scheduler *)
fbCTRL_LoopScheduler( eMode := eMode,
stParams := stParams,
eErrorId => eErrorId,
bError => bError);
IF arrOutputVector[ 1 ]
THEN
(* activate control loop 1 *)
eMode_CtrlLoop_1 := eCTRL_MODE_ACTIVE;
END_IF
IF arrOutputVector[ 2 ]
THEN
(* activate control loop 2 *)
eMode_CtrlLoop_2 := eCTRL_MODE_ACTIVE;
END_IF
IF arrOutputVector[ 3 ]
THEN
(* activate control loop 3 *)
eMode_CtrlLoop_3 := eCTRL_MODE_ACTIVE;
END_IF
IF arrOutputVector[ 4 ]
THEN
(* activate control loop 4 *)
eMode_CtrlLoop_4 := eCTRL_MODE_ACTIVE;
END_IF
IF arrOutputVector[ 5 ]
THEN
(* activate control loop 5 *)
eMode_CtrlLoop_5 := eCTRL_MODE_ACTIVE;
END_IF