Skip to main content

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 VAR_GLOBAL ou déclaration POU.

<slot>

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.

Exemple 267. Exemple

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