Attribut 'global_init_slot'

Das Pragma definiert die Reihenfolge der Initialisierung von Programmierbausteinen und globalen Variablenlisten. Variablen innerhalb einer GVL oder POU werden von oben nach unten initialisiert. Im Fall von mehreren globalen Variablenlisten ist deren Initialisierungsreihenfolge unbestimmt.

Bei Initialisierungen mit Literalwerten, beispielsweise 1, 'hallo', 3.6, oder Konstanten von Basisdatentypen spielt die Reihenfolge der Initialisierungen keine Rolle. Wenn es bei den Initialisierungen jedoch Abhängigkeiten zwischen den Listen gibt, müssen Sie die Initialisierungsreihenfolge festlegen. Dazu können Sie einer GVL oder einer POU mit dem Attribut 'global_init_slot' einen definierten Initialisierungsslot zuweisen.

Konstanten werden vor den Variablen initialisiert, und zwar in der gleichen Reihenfolge wie die Variablen. Bei der Initialisierung werden die Signaturen (Bausteine, GVLs) zunächst nach dem Wert für <slot> sortiert. Anschließend wird der Code für die Initialisierung der Konstanten erzeugt und danach der Code für die Initialisierung der Variablen.

Die Initialisierung teilt sich somit in die folgenden Phasen ein:

  1. Die Signaturen werden nach den Initialisierungsslots sortiert. Dabei sind die Slots entweder implizit definiert oder explizit über das Attribut 'global_init_slot'.
  2. Anschließend werden alle Konstanten initialisiert. Dies geschieht in der Reihenfolge der Slots. Signaturen ohne Konstanten werden übersprungen.
  3. Dann werden die Variablen initialisiert, wieder in der Reihenfolge der Slots.

Syntax: {attribute 'global_init_slot' := '<slot>'}

<slot>: Ganzzahliger Wert, der die Position in der Reihenfolge der Aufrufe definiert. Der Standardwert für eine POU (Programm, Funktionsbaustein) ist 50000. Der Standardwert für eine GVL ist 49990. Der Standardwert für statische Variablen ist 49980. Ein niedrigerer Wert bewirkt eine frühere Initialisierung.

Einfügeort: Das Pragma wirkt immer auf die gesamte GVL oder POU und muss deshalb oberhalb der VAR_GLOBAL-Deklaration oder der POU-Deklaration stehen.

Attribut 'global_init_slot' 1:

Wenn mehrere Programmierbausteine denselben Wert für das Attribut 'global_init_slot' zugewiesen bekommen haben, bleibt die Reihenfolge ihrer Initialisierung unbestimmt. Um das Systemverhalten von TwinCAT 3 nicht zu beeinflussen, verwenden Sie Werte oberhalb von 40000.

Beispiel:

Das Projekt enthält zwei globale Variablenlisten GVL1 und GVL2. Das Programm MAIN verwendet Variablen aus beiden Listen. GVL1 verwendet zur Initialisierung einer Variablen nA die Variable nB, die in GVL2 mit einem Wert von 1000 initialisiert wird:

GVL1:

VAR_GLOBAL   //49990
    nA : INT := GVL2.nB*3;
END_VAR

GVL2:

VAR_GLOBAL   //49990
    nB : INT := 1000;
    nC : INT := 10;
END_VAR

Programm MAIN:

PROGRAM MAIN  //50000
VAR
    nVar1 : INT := GVL1.nA;
    nVar2 : INT;
END_VAR
nVar1 := nVar + 1;
nVar2 := GVL2.nC;

In diesem Fall gibt der Compiler einen Fehler aus, weil GVL2.nB zur Initialisierung von GVL1.nA verwendet wird, bevor GVL2 initialisiert wurde. Dies können Sie verhindern, indem Sie mit dem Attribut global_init_slot die Position von GVL2 in der Initialisierungsreihenfolge vor GVL1 stellen.

Dazu muss der global_init_slot-Wert von GVL2 kleiner als der Wert von GVL1 (mit dem Standardwert 49990) und größer als 40000 (für Systemfunktionen reserviert) sein.
D. h.: 40001 <= global_init_slot-Wert von GVL2 <= 49989.

GVL2:

{attribute 'global_init_slot' := '40500'}
VAR_GLOBAL
    nB : INT := 1000;
    nC : INT := 10;
END_VAR

Die Verwendung von GVL2.nC im Implementierungsteil von MAIN ist auch ohne Pragmaverwendung unkritisch, da beide GVLs in jedem Fall vor dem Programm initialisiert werden.