Skip to main content

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 Bausteine 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.

Syntax:

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

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

<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. Ein niedrigerer Wert bewirkt eine frühere Initialisierung.

Tipp

Wenn mehrere Programmierbausteine denselben Wert für das Attribut 'global_init_slot' zugewiesen bekommen haben, bleibt die Reihenfolge ihrer Initialisierung unbestimmt.

Beispiel 267. Beispiel

Das Projekt enthält die zwei globalen Variablenlisten GVL_1 und GVL_2 und das Programm PLC_PRG, das Variablen aus beiden Listen verwendet. GVL_1 verwendet zur Initialisierung der Variablen A die Variable B, die in GVL_2 mit 1000 initialisiert wird.

GVL_1

VAR_GLOBAL   //49990
 A : INT := GVL_2.B*100;
END_VAR

GVL_2

VAR_GLOBAL   //49990
 B : INT := 1000;
 C : INT := 10;
END_VAR

PLC_PRG

PROGRAM PLC_PRG  //50000
VAR
 ivar: INT := GVL_1.A;
 ivar2: INT;
END_VAR

ivar:=ivar+1;
ivar2:=GVL_2.C;

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

Dazu muss GVL_1 im vorliegenden Beispiel mindestens einen Slot-Wert von 49989 erhalten, um die früheste Initialisierung innerhalb des Programms zu erreichen. Jeder noch niedrigere Wert hat denselben Effekt:

GVL_2

{attribute 'global_init_slot' := '100'}
VAR_GLOBAL
  B : INT := 1000;
END_VAR

Die Verwendung von GVL_2.C im Implementierungsteil von PLC_PRG ist auch ohne Pragmaverwendung unkritisch, da beide GVLs in jedem Fall vor dem Programm initialisiert werden.



Für weitere Informationen siehe: Global Init Slots