Skip to main content

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_representant compreso 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_representant attributo nella dichiarazione dell'unione. Anche gli array di unioni possono essere contrassegnati e fare riferimento agli elementi dell'array.

Esempio 2. Esempi

'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_VAR

Matrice 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


. Perché un rappresentante sia valido, deve soddisfare le seguenti regole:
  • 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 REAL O LREAL o istanza di tipo STRING O 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.

Esempio 3. Esempio per un'istanza persistente

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_VAR


Esempio 4. Esempio di membro persistente di un blocco funzione

Il 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_VAR


Attributo: '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.

Esempio 5. Esempio per un gruppo predefinito
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_VAR
PROGRAM PLC_PRG
VAR
        {attribute 'ac_persist_set_default_group' := 'PROCESS'}
        fbu1 : FB_Util;

        {attribute 'ac_persist_set_default_group'´ := 'CONFIG'}
        fbu2 : FB_Util;
END_VAR


Attributo: '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.

Esempio 6. Esempio di esclusione di variabili
PROGRAM PLC_PRG
VAR
        {attribute 'ac_persist_exclude'}
        fb1 : FB;
END_VAR