Attribut : global_init_slot
Le pragma définit l'ordre d'initialisation des POU et des listes de variables globales : les variables au sein d'une GVL ou d'une POU sont initialisées de haut en bas. S'il existe plusieurs listes de variables globales, alors l'ordre d'initialisation n'est pas défini.
L'initialisation ne s'applique pas à l'initialisation des valeurs littérales, par exemple 1
, 'hello'
, 3.6
, ou des constantes de types de données de base. Cependant, vous devez définir vous-même l'ordre d'initialisation s'il existe des dépendances entre les listes. Vous pouvez affecter un slot d'initialisation défini à un GVL ou POU avec le 'global_init_slot'
attribut.
Les constantes sont initialisées avant les variables et dans le même ordre que les variables. Lors de l'initialisation, les POU sont triées en fonction de la valeur de <slot>. Ensuite, le code d'initialisation des constantes est généré et ensuite le code d'initialisation des variables.
Syntaxe:
{attribute 'global_init_slot' := '<slot>'}
Emplacement d'insertion | Le pragma agit toujours sur l'ensemble du GVL ou du POU et doit donc être situé au-dessus du |
| Valeur entière qui définit la position dans l'ordre des appels La valeur par défaut pour un POU (programme, bloc fonction) est 50000. La valeur par défaut pour un GVL est 49990. Une valeur inférieure signifie une initialisation plus précoce. |
Astuce
Si plusieurs POU ont été affectées à la même valeur pour le 'global_init_slot'
attribut, alors l'ordre de leur initialisation reste indéfini.
Le projet comprend deux listes de variables globales GVL_1
et GVL_2
, aussi bien que PLC_PRG
programme qui utilise les variables des deux listes. GVL_1
utilise la variable B
pour initialiser la variable A
, qui est initialisé dans GVL_2
avec 1000
.
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;
Dans ce cas, le compilateur affiche une erreur car GVL_2.B
sert à initialiser GVL_1.A
avant de GVL_2 a été initialisé. Vous pouvez empêcher cela en utilisant le global_init_slot
attribut à la position GVL_2 avant de GVL_1 dans la séquence d'initialisation.
Dans cet exemple, GVL_1 doit avoir au moins une valeur d'emplacement de 49989 afin de réaliser la première initialisation dans le programme. Chaque valeur inférieure a le même effet :
GVL_2
{attribute 'global_init_slot' := '100'} VAR_GLOBAL B : INT := 1000; END_VAR
Utilisant GVL_2.C
dans la partie mise en œuvre de PLC_PRG
n'est également pas critique même sans utiliser de pragma car les deux GVL sont initialisés avant le programme dans les deux cas.
Pour plus d'informations, voir : Global Init Slots