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 5 Regelkreise verwaltet. Bei diesen gilt „tCtrlCycleTime = 6 · 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
Name | Typ | Beschreibung |
---|---|---|
nManValue | DWORD | Mit diesem Eingang können im |
eMode | E_CTRL_MODE | Eingang, der die Betriebsart des Bausteins festlegt. |
VAR_OUTPUT
VAR_OUTPUT
eState : E_CTRL_STATE;
eErrorId : E_CTRL_ERRORCODES;
bError : BOOL;
END_VAR
Name | Typ | Beschreibung |
---|---|---|
eState | E_CTRL_STATE | State des Funktionsbausteins |
eErrorId | E_CTRL_ERRORCODES | Liefert bei einem gesetzten |
bError | BOOL | Wird TRUE, sobald ein Fehler eintritt. |
VAR_IN_OUT
VAR_IN_OUT
stParams : ST_CTRL_LOOP_SCHEDULER_PARAMS;
END_VAR
Name | Typ | Beschreibung |
---|---|---|
stParams | ST_CTRL_ | Parameterstruktur des Loop-Schedulers. |
stParams
besteht aus den folgenden Elementen:
TYPE
ST_CTRL_LOOP_SCHEDULER_PARAMS:
STRUCT
tCtrlCycleTime : TIME := T#0ms;
tTaskCycleTime : TIME := T#0ms;
nNumberOfControlLoops : UINT;
pOutputVector_ADR : POINTER TO BOOL := 0;
nOutputVector_SIZEOF : UINT := 0;
END_STRUCT
END_TYPE
Name | Typ | Beschreibung |
---|---|---|
tCtrlCycleTime | TIME | Zykluszeit, mit der die Regelkreise bearbeitet werden, die mit dem Loop-Scheduler verwaltet werden. Diese muss größer oder gleich der TaskCycleTime sein. |
tTaskCycle | TIME | 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 | UINT | Anzahl der Regelkreise, die verwaltet werden. |
pOutputVector_ADR | POINTER TO BOOL | Adresse des Ausgangsvektors |
nOutputVector_SIZEOF | UINT | 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;
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
stParams.nOutputVector_SIZEOF := SIZEOF(arrOutputVector);
stParams.pOutputVector_ADR := ADR(arrOutputVector);
fbCTRL_LoopScheduler( eMode := eMode,
stParams := stParams,
eErrorId => eErrorId,
bError => bError);
IF arrOutputVector[1] THEN
eMode_CtrlLoop_1 := eCTRL_MODE_ACTIVE;
END_IF
IF arrOutputVector[2] THEN
eMode_CtrlLoop_2 := eCTRL_MODE_ACTIVE;
END_IF
IF arrOutputVector[3] THEN
eMode_CtrlLoop_3 := eCTRL_MODE_ACTIVE;
END_IF
IF arrOutputVector[4] THEN
eMode_CtrlLoop_4 := eCTRL_MODE_ACTIVE;
END_IF
IF arrOutputVector[5]
THEN
eMode_CtrlLoop_5 := eCTRL_MODE_ACTIVE;
END_IF