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>'}
<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.
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.
Wenn mehrere Programmierbausteine denselben Wert für das Attribut 'global_init_slot'
zugewiesen bekommen haben, bleibt die Reihenfolge ihrer Initialisierung unbestimmt.
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.