Attribute global_init_slot
Il pragma {attribute 'global_init_slot'}
definisce la sequenza di inizializzazione delle POU o degli elenchi di variabili globali.
Le variabili in un elenco (GVL o POU) vengono inizializzate dall'alto in basso.
Se sono disponibili più elenchi di variabili globali, la sequenza di inizializzazione non è definita.
La sequenza di inizializzazione è irrilevante per i valori letterali, come 1
, 'hello'
, 3.6
o per le costanti dei tipi di dati costanti. Tuttavia, se vi sono dipendenze tra i diversi elenchi, l'utente dovrà definire la sequenza di inizializzazione. Per questo, è possibile assegnare uno slot di inizializzazione definito a un GVL o una POU mediante attribute global_init_slot
.
Le costanti vengono inizializzate prima delle variabili e nello stesso ordine delle variabili. Durante l'inizializzazione, le POU vengono ordinate in base al valore di <slot>
. Quindi viene generato il codice per l'inizializzazione delle costanti. Successivamente, viene generato il codice per l'inizializzazione delle variabili.
{attribute 'global_init_slot' := '<slot>'}
Sostituire <slot> con un valore intero che definisce la posizione nell'ordine di inizializzazione. Il valore predefinito per una POU (programma, blocco funzione) è 50.000. Il valore predefinito per un GVL è 49.990. Un valore più basso provoca un'inizializzazione anticipata. In caso di più POU o GVI che hanno lo stesso valore per l'attributo global_init_slot
, la loro sequenza di inizializzazione resta indefinita. Questo verrà indicato come un errore di programmazione rilevato nella categoria della vista .
Il pragma {attribute 'global_init_slot'}
è valido per l'intero GVL o POU e deve essere quindi posizionato sopra la dichiarazione POU o VAR_GLOBAL
.
L'esempio include 2 elenchi di variabili globali, GVL_1 e GVL_2, e un programma PLC_PRG
che utilizza le variabili di entrambi gli elenchi.
GVL_1 utilizza la variabile B
per inizializzare una variabile A
inizializzata nel GVL_2 con un valore di 1000
.
:
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;
Questo verrà indicato come un errore di programmazione rilevato nella categoria vista in quanto GVL_2.B
viene utilizzato per inizializzare GVL_1.A
prima dell’inizializzazione di GVL_2
. Per evitare ciò, utilizzare attribute global_init_slot
per posizionare GVL_2
prima di GVL_1
nella sequenza di inizializzazione.
GVL_2
deve avere un valore slot di 49989
o inferiore per ottenere la prima inizializzazione nel programma.
:
{attribute 'global_init_slot' := '100'}
VAR_GLOBAL
B : INT := 1000;
C : INT := 10;
END_VAR
È anche possibile utilizzare GVL_2.C
nella parte di implementazione di PLC_PRG
senza un pragma poiché i GVL vengono inizializzati prima del programma in un caso o nell'altro.