Attribute global_init_slot

Panoramica

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.

Sintassi

{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 Crea della vista Messaggi.

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.

Esempio

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.

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;

Questo verrà indicato come un errore di programmazione rilevato nella categoria Crea della vista Messaggi 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.

GVL_2:

{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.