Skip to main content

Attributo: global_init_slot

Il pragma definisce l'ordine di inizializzazione delle POU e degli elenchi di variabili globali: le variabili all'interno di un GVL o di una POU vengono inizializzate dall'alto verso il basso. Se sono presenti più elenchi di variabili globali, l'ordine di inizializzazione non è definito.

L'inizializzazione non si applica, ad esempio, all'inizializzazione di valori letterali 1, 'hello', 3.6o costanti di tipi di dati di base. Tuttavia, è necessario definire personalmente l'ordine di inizializzazione se sono presenti dipendenze tra gli elenchi. È possibile assegnare uno slot di inizializzazione definito a un GVL o POU con il 'global_init_slot' attributo.

Le costanti vengono inizializzate prima delle variabili e nello stesso ordine delle variabili. Durante l'inizializzazione, le POU vengono ordinate in base al valore per <slot>. Quindi viene generato il codice per l'inizializzazione delle costanti e successivamente il codice per l'inizializzazione delle variabili.

Sintassi:

{attribute 'global_init_slot' := '<slot>'}

Inserisci posizione

Il pragma agisce sempre sull'intero GVL o POU e quindi deve trovarsi al di sopra del VAR_GLOBAL o dichiarazione POU.

<slot>

Valore intero che definisce la posizione nell'ordine delle chiamate

Il valore predefinito per una POU (programma, blocco funzione) è 50000. Il valore predefinito per un GVL è 49990. Un valore più basso indica un'inizializzazione precedente.

Suggerimento

Se a più POU è stato assegnato lo stesso valore per il 'global_init_slot' attributo, l'ordine della loro inizializzazione rimane indefinito.

Esempio 267. Esempio

Il progetto include due elenchi di variabili globali GVL_1 e GVL_2, così come il PLC_PRG programma che utilizza le variabili di entrambe le liste. GVL_1 usa la variabile B per inizializzare la variabile A, che viene inizializzato in GVL_2 con 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;

In questo caso, il compilatore stampa un errore perché GVL_2.B viene utilizzato per l'inizializzazione GVL_1.A prima di GVL_2 è stato inizializzato. Puoi evitarlo usando il global_init_slot attribuire alla posizione GVL_2 prima di GVL_1 nella sequenza di inizializzazione.

In questo esempio, GVL_1 deve avere almeno un valore di slot di 49989 per ottenere la prima inizializzazione all'interno del programma. Ogni valore più basso ha lo stesso effetto:

GVL_2

{attribute 'global_init_slot' := '100'}
VAR_GLOBAL
  B : INT := 1000;
END_VAR

Usando GVL_2.C nella parte attuativa del PLC_PRG inoltre non è critico anche senza utilizzare un pragma perché entrambi i GVL vengono inizializzati prima del programma in entrambi i casi.



Per ulteriori informazioni, vedere: Global Init Slots