Attribute global_init_slot
Das pragma {attribute 'global_init_slot'}
definiert die Initialisierungssequenz für die POUs oder globalen Variablenlisten.
Die Variablen in einer Liste (GVL oder POU) werden von oben nach unten initialisiert.
Wenn mehrere globale Variablenlisten verfügbar sind, dann ist keine Initialisierungssequenz definiert.
Für Literalwerte, wie z. B. 1
, 'hello'
, 3.6
, oder für Konstanten des Basis-Datentyps ist die Initialisierungssequenz irrelevant. Wenn jedoch Abhängigkeiten zwischen den verschiedenen Listen vorliegen, müssen Sie die Initialisierungssequenz selbst definieren. Dazu können Sie einer GVL oder POU über attribute global_init_slot
eine definierte Initialisierungsposition zuweisen.
Konstanten werden vor den Variablen und in derselben Reihenfolge wie diese initialisiert. Bei der Initialisierung werden die POUs nach dem Wert für <slot>
sortiert. Anschließend wird der Code für die Initialisierung der Konstanten generiert. Danach erfolgt die Generierung des Codes für die Initialisierung der Variablen.
{attribute 'global_init_slot' := '<Position>'}
Ersetzen Sie <Position> durch einen Ganzzahl, die auf die Position innerhalb der Initialisierungsreihenfolge verweist. Der Standardwert für eine POU (Programm, Funktionsbaustein) beträgt 50.000. Der Standardwert für eine GVL ist 49.990. Ein niedrigerer Wert bewirkt eine frühere Initialisierung. Wenn mehrere POUs oder GVLs über denselben Wert für das Attribut global_init_slot
verfügen, bleibt die Reihenfolge ihrer Initialisierung unbestimmt. Das wird als Programmierfehler in der Kategorie der Ansicht SoMMenu/index.htm ausgewiesen.
Das pragma {attribute 'global_init_slot'}
ist gültig für die gesamte GVL bzw. POU und muss deshalb über VAR_GLOBAL
oder über der POU-Deklaration positioniert sein.
Das Beispiel umfasst 2 globale Variablenlisten, GVL_1 und GVL_2, sowie ein Programm PLC_PRG
, das Variablen aus beiden Listen verwendet.
GVL_1 verwendet die Variable B
für die Initialisierung einer Variablen A
, die in GVL_2 mit dem Wert 1000
initialisiert wird.
:
VAR_GLOBAL //49990
A : INT := GVL_2.B*100;
END_VAR
:
VAR_GLOBAL //49990
B : INT := 1000;
C : INT := 10;
END_VAR
:
PROGRAM PLC_PRG //50000
VAR
ivar: INT := GVL_1.A;
ivar2: INT;
END_VAR
ivar:=ivar+1;
ivar2:=GVL_2.C;
Bei der Generierung dieses Beispiels wird in der Kategorie SoMMenu/index.htm ein Programmierfehler ausgegeben, da GVL_2.B
zur Initialisierung von GVL_1.A
verwendet wird, bevor GVL_2
initialisiert wurde. Um das zu vermeiden, verwenden Sie attribute global_init_slot
, um GVL_2
in der Initialisierungssequenz vor GVL_1
zu positionieren.
GVL_2
darf höchstens den Positionswert 49989
erhalten, um die früheste Initialisierung innerhalb des Programms zu erzielen.
:
{attribute 'global_init_slot' := '100'}
VAR_GLOBAL
B : INT := 1000;
C : INT := 10;
END_VAR
Sie können sogar GVL_2.C
im Implementierungsteil von PLC_PRG
ohne ein Pragma verwenden, da beide GVLs in jedem Fall vor dem Programm initialisiert werden.