Definizione di variabili persistenti
Le singole variabili così come le istanze della struttura e le istanze dei blocchi funzione possono essere contrassegnate come "persistenti" mediante l'uso di attributi. Quando un'istanza viene contrassegnata, tutti i membri di VAR, VAR_INPUT, E VAR_OUTPUT verranno archiviati in modo persistente. Nel caso in cui le variabili in a VAR PERSISTENT sono contrassegnate come "persistenti", verrà creato un avviso.
Inoltre sono disponibili attributi per definire un gruppo di archiviazione predefinito, nonché per escludere variabili particolari dall'archiviazione persistente di strutture o istanze di blocchi funzione.
Se la definizione delle variabili persistenti è stata modificata (aggiunta, rimozione, ridenominazione, modifica del tipo di dati) non deve essere eseguita alcuna nuova generazione di codice compositore (comando Genera). Queste modifiche verranno aggiornate automaticamente nelle istanze di Persistent Manager durante la compilazione.
Per informazioni sulle possibili conversioni implicite in caso di definizione del tipo di dati modificata, vedere: Parametro
Tipi di dati supportati
Le istanze con i seguenti tipi di dati non possono essere archiviate in modo persistente:
- MORSO 
- Puntatore 
- Interfacce 
- Costanti 
- Array di tipi di dati non persistenti 
Tutti gli altri tipi di dati sono supportati. Ciò include enumerazioni, tipi di dati sottointervallo, matrici di matrici e matrici multidimensionali:
ARRAY[0..9] OF ARRAY[5..6, 7..8, 9..10] OF INT
Tipo di dati: UNIONE
Per salvare l'istanza di un'unione in modo persistente, uno dei suoi campi deve essere contrassegnato come "rappresentante". Ci sono tre modi possibili:
- Esattamente un campo nella dichiarazione dell'unione è contrassegnato con l'attributo - ac_persist_union_representant(senza valore dell'attributo). Questo campo quindi "rappresenta" l'unione. Il suo valore verrà salvato e caricato in modo rappresentativo per l'intera unione.
- Un campo esatto nella dichiarazione dell'unione è contrassegnato con l'attributo - ac_persist– questo definisce allo stesso tempo il rappresentante.
- L'istanza dell'unione è contrassegnata con l'attributo - ac_persist_union_set_representantcompreso il valore dell'attributo. Il valore dell'attributo descrive il nome del campo dell'unione che dovrà essere utilizzato come rappresentativo. Questo attributo sovrascrive un esistente- ac_persist_union_representantattributo nella dichiarazione dell'unione. Anche gli array di unioni possono essere contrassegnati e fare riferimento agli elementi dell'array.
'ac_persist_union_representant'
TYPE UnionWithRep :
UNION
        di : DINT ;
        {attribute 'ac_persist_union_representant'}
        dw : DWORD ;
END_UNION
END_TYPE'ac_persistere'
TYPE UnionWithPersist :
UNION
        di : DINT ;
        {attribute 'ac_persist' := 'TestUnion'}
        dw : DWORD ;
END_UNION
END_TYPE'ac_persist_union_set_representant'
FUNCTION_BLOCK FBTestUnion
VAR
        {attribute 'ac_persist_union_set_representant' := 'dw'}
        u2 : UnionWithoutRep ;
END_VARMatrice di unione
VAR
        {attribute 'ac_persist_union_set_representant' := 'dw'}
        aElems ARRAY[0..7] OF SomeUnion ;
        {attribute 'ac_persist_union_set_representant' := 'dw'}
        aaElems ARRAY[0..7] OF ARRAY[0..1] OF SomeUnion ;
END_VAR- Il rappresentante deve avere le stesse dimensioni dell'intero sindacato. Altrimenti i dati completi non verrebbero salvati. Il rappresentante inoltre non deve avere aree di riempimento (aree di dati vuote create dal compilatore per allineare i dati nell'archivio). 
- La scomposizione del rappresentante in tipi di dati primitivi non deve contenere istanze di tipo - REALO- LREALo istanza di tipo- STRINGO- WSTRING.
- Inoltre il rappresentante deve essere composto da tipi supportati (vedi sopra). Ad esempio il rappresentante può essere di tipo - Structure– tuttavia, la struttura stessa non deve contenere Pointer.
Attributo: 'ac_persist'
L'attributo 'ac_persist' può essere utilizzato per
- Variabili 
- Istanze di strutture 
- Istanze di blocchi funzione 
- Membri delle strutture 
- Membri dei blocchi funzione 
{attribute 'ac_persist' [ := '<PERSISTENCE_GROUP>']}
PERSISTENCE_GROUP è il nome del gruppo di persistenza a cui deve essere attribuita la dichiarazione. Deve essere un identificatore IEC valido. Se qui non viene nominato alcun gruppo di persistenza, l'assegnazione verrà eseguita in base all'attributo 'ac_persist_set_default_group', che in questo caso deve essere definito.
Se un'istanza di struttura o un'istanza di blocco funzione è contrassegnata come "persistente" e anche almeno un membro nella dichiarazione è contrassegnato come "persistente", verrà creato un messaggio di errore.
La variabile t viene assegnato al gruppo di persistenza PROCESS. Tutti i membri verranno archiviati in modo persistente.
PROGRAM PLC_PRG
VAR
        {attribute 'ac_persist' := 'PROCESS'}
        t : TON;
END_VARIl membro iNumIOs viene assegnato al gruppo di persistenza CONFIG. Questo membro verrà archiviato in modo persistente per tutte le istanze del blocco funzione (se non esplicitamente soppresso dall'attributo 'ac_persist_exclude').
FUNCTION_BLOCK FB
VAR
        {attribute 'ac_persist' := 'CONFIG'}
        iNumIOs : INT := 0;
END_VARAttributo: 'ac_persist_set_default_group'
Se il nome del gruppo manca nell'attributo 'ac_persist', UN gruppo predefinito deve essere definito in un'istanza di blocco funzione o di struttura contenente la rispettiva variabile direttamente o indirettamente. Questo è possibile con l'attributo 'ac_persist_set_default_group'. L'attributo può essere impostato anche per un membro del blocco funzione. La definizione più interna trovata di 'ac_persist_set_default_group' verrà utilizzato come gruppo predefinito per la variabile.
Non è consentito l'uso 'ac_persist_set_default_group' insieme a 'ac_persist' O 'ac_persist_exclude'. In questo caso verrà creato un messaggio di errore durante la generazione del codice.
FUNCTION_BLOCK FB_Util
VAR
        {attribute 'ac_persist'} // no group
        //'ac_persist_set_default_group‘ and 'ac_persist_exclude' not allowed here
        i : INT := 0;
END_VARPROGRAM PLC_PRG
VAR
        {attribute 'ac_persist_set_default_group' := 'PROCESS'}
        fbu1 : FB_Util;
        {attribute 'ac_persist_set_default_group'´ := 'CONFIG'}
        fbu2 : FB_Util;
END_VARAttributo: 'ac_persist_exclude'
L'attributo 'ac_persist_exclude' viene utilizzato per escludere una variabile dalla memoria persistente, non importa se i membri nella dichiarazione della struttura o del blocco funzione sono definiti come "persistenti". Se non esistono membri persistenti nella dichiarazione verrà creato un errore durante la generazione del codice.
PROGRAM PLC_PRG
VAR
        {attribute 'ac_persist_exclude'}
        fb1 : FB;
END_VAR