FB_CTRL_LOOP_SCHEDULER

FB_CTRL_LOOP_SCHEDULER 1:

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

FB_CTRL_LOOP_SCHEDULER 2:

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.

FB_CTRL_LOOP_SCHEDULER 3: VAR_INPUT

VAR_INPUT
    nManValue : DWORD;
    eMode     : E_CTRL_MODE;
END_VAR

Name

Typ

Beschreibung

nManValue

DWORD

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

E_CTRL_MODE

Eingang, der die Betriebsart des Bausteins festlegt.

FB_CTRL_LOOP_SCHEDULER 4: 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-Ausgang die Fehlernummer.

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_
LOOP_
SCHEDULER_
PARAMS

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

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