Parole chiave attributo per tipi di variabile

Panoramica

È possibile aggiungere le seguenti parole chiave attributo alla dichiarazione del tipo di variabile per specificare l'ambito:

Variabili rimanenti - RETAIN, PERSISTENT

Le variabili rimanenti possono mantenere il loro valore per il periodo di esecuzione normale del programma. Dichiararle come variabili Retain o, in modo più rigoroso, come variabili persistenti.

La dichiarazione determina il livello di resistenza di una variabile rimanente in caso di ripristino, download o riavvio del controller. Nelle applicazioni si usa principalmente la combinazione di entrambi i flag di rimanenza (vedere Variabili persistenti).

NOTA: Una dichiarazione VAR PERSISTENT viene interpretata allo stesso modo di VAR PERSISTENT RETAIN o VAR RETAIN PERSISTENT.
NOTA: Utilizzare il comando Aggiungi tutti i percorsi di istanza per accettare le variabili dichiarate come persistenti nell'oggetto Elenco persistente.

La persistenza si ottiene con le seguenti procedure:

  • Determinando i task ciclici che accedono alla variabile.

  • Copiando la variabile nell'elenco di variabili globali persistenti alla fine del primo task ciclico (in ogni ciclo).

  • Copiando il valore della variabile persistente nella variabile normale al riavvio del controller.

Poiché la memoria viene allocata sia nella dichiarazione che nel percorso dell'istanza, questa variabile persistente richiede una doppia allocazione di memoria in ciascun ciclo. Ciò può portare a tempi di elaborazione più lunghi, soprattutto con valori grandi e strutturati.

Variabili Retain

Le variabili dichiarate come Retain sono memorizzate in un'area di memoria non volatile. Per dichiarare questo tipo di variabile, utilizzare la parola chiave RETAIN nella parte dichiarazione di una POU o in un elenco variabili globali.

Esempio

VAR RETAIN
 iRem1 : INT; (* 1. Retain variable*)
END_VAR

Le variabili Retain mantengono il loro valore anche dopo uno spegnimento imprevisto o normale del controller o quando si esegue il comando Online Reset a caldo. Al riavvio del programma, i valori ritenuti continueranno ad essere elaborati. Le altre variabili non Retain vengono nuovamente inizializzate, con i relativi valori di inizializzazione o, se questi non sono stati dichiarati, con i valori di inizializzazione predefiniti.

Ad esempio, è possibile utilizzare un valore ritenuto quando un'operazione, come il conteggio dei pezzi di un macchinario di produzione, deve continuare dopo un'interruzione di corrente.

Le variabili Retain, tuttavia, vengono reinizializzate quando si esegue il comando Online Reset origine e, a differenza delle variabili persistenti, quando si esegue il comando Online Reset a freddo o durante il download di un'applicazione.

NOTA: Solo le variabili specifiche definite come VAR RETAIN sono memorizzate nella memoria non volatile. Le variabili locali definite come VAR RETAIN nelle funzioni, tuttavia, NON sono memorizzate nella memoria non volatile. La definizione locale di VAR RETAIN nelle funzioni non ha alcun effetto..

Utilizzando interfacce o blocchi funzioni provenienti dalle librerie di configurazione sistema nella sezione ritentiva del programma (VAR_RETAIN) si provocano eccezioni di sistema, che possono rendere il controller inutilizzabile e richiedere un riavvio.

 AVVERTIMENTO
FUNZIONAMENTO IMPREVISTO DELL'APPARECCHIATURA
  • Non utilizzare interfacce dalla libreria SystemConfigurationItf nella sezione ritentiva del programma (VAR_RETAIN).
  • Non utilizzare blocchi funzione dalla libreria SystemConfiguration nella sezione ritentiva del programma (VAR_RETAIN).
Il mancato rispetto di queste istruzioni può provocare morte, gravi infortuni o danni alle apparecchiature.
NOTA: Le librerie SystemConfigurationItf e SystemConfiguration sono disponibili solo per controller PacDrive (PacDrive LMC Eco, PacDrive LMC Pro/Pro2).
NOTA: Se una variabile in un blocco funzione è contrassegnata con RETAIN, l'istanza del blocco funzione con le sue variabili viene archiviata nella memoria rimanente. questa funzione non è disponibile per tutti i controller. Consultare la Guida alla programmazione del controller specifico per informazioni dettagliate.

Variabili persistenti

Le variabili persistenti sono identificate dalla parola chiave PERSISTENT (VAR_GLOBAL PERSISTENT). Vengono reinizializzate solo quando si esegue il comando Online Reset origine. A differenza delle variabili Retain, mantengono i loro valori dopo un download.

NOTA: Non utilizzare la dichiarazione AT in combinazione con VAR PERSISTENT.

Esempio di applicazione:

un contatore di ore di funzionamento, che deve continuare anche dopo un'interruzione di corrente o un download. Vedere la tabella sinottica sul comportamento delle variabili rimanenti.

È possibile dichiarare le variabili persistenti solo in uno speciale elenco di variabili globali del tipo di oggetto variabili persistenti assegnato all'applicazione. È possibile aggiungere un solo elenco di questo tipo a un'applicazione.

NOTA: Una dichiarazione con VAR_GLOBAL PERSISTENT ha lo stesso effetto di una dichiarazione con VAR_GLOBAL PERSISTENT RETAIN o VAR_GLOBAL RETAIN PERSISTENT.
NOTA: I percorsi istantanei vengono aggiunti per le variabili contrassegnate con la parola chiave PERSISTENT all’esterno dell'editor di elenchi persistenti. Per ulteriori informazioni, vedere il comando Aggiungi tutti i percorsi di istanza .

Come le variabili Retain, anche le variabili persistenti sono memorizzate in un'area di memoria separata.

Esempio

VAR_GLOBAL PERSISTENT RETAIN
  iVarPers1 : DINT; (* 1. Persistent+Retain Variable App1 *)
  bVarPers : BOOL;  (* 2. Persistent+Retain Variable App1 *)
END_VAR
NOTA: Le variabili persistenti possono essere dichiarate solo nell'oggetto Elenco persistente. Se vengono dichiarate altrove, si comportano come variabili Retain e sono rilevate come errore di Compilazione nella vista Messaggi. Le variabili Retain possono essere dichiarate negli elenchi di variabili globali o nelle POU.

A ogni nuovo caricamento dell'applicazione, l'elenco delle variabili persistenti sul controller viene confrontato con quello del progetto. L'elenco sul controller è identificato dall'applicazione. In caso di incongruenze, verrà richiesto di reinizializzare tutte le variabili persistenti dell'applicazione. L'incoerenza può risultare dalla modifica del nome, dall'elliminazione o da altre modifiche apportate alle dichiarazioni presenti nell'elenco.

NOTA: Tenere attentamente presenti tutte le modifiche apportate alla parte di dichiarazione dell'elenco delle variabili persistenti e il loro effetto sulla reinizializzazione.

Le nuove dichiarazioni possono essere aggiunte solo alla fine dell'elenco. Durante un download, queste verranno rilevate come nuove e non richiederanno una reinizializzazione dell'intero elenco. Se si modifica il nome o il tipo dati di una variabile, questa viene gestita come una nuova dichiarazione e provoca una reinizializzazione della variabile al successivo download o modifica in linea.

NOTA: Se una variabile in un blocco funzione è contrassegnata con PERSISTENT, l'istanza del blocco funzione con le sue variabili viene archiviata nella memoria rimanente, ma solo tale variabile viene trattata come persistente.

Comportamento delle variabili rimanenti

Consultare la Guida alla programmazione del controller specifico per ulteriori informazioni sul comportamento delle variabili rimanenti.

Costanti - CONSTANT

Le costanti sono identificate dalla parola chiave CONSTANT. È possibile dichiararle localmente (unità di oggetti di programmazione) o globalmente (elenco di variabili globali). È possibile accedere alle variabili costanti in sola lettura nella parte di implementazione di una POU.

Sintassi

<scope> CONSTANT <identifier>:<type> := <initialization>;
END_VAR

Con <scope> : VAR | VAR_INPUT | VAR_STAT | VAR_GLOBAL

Assicurarsi di assegnare un valore di inizializzazione quando si dichiara una variabile costante.

Esempio

VAR CONSTANT
c_iCon1:INT:=12; (* 1. Constant*)
END_VAR

Vedere il capitolo Operandi per un elenco di possibili vincoli.

Costanti - VAR_GENERIC CONSTANT

Una costante generica è una variabile nell’area di dichiarazione VAR_GENERIC CONSTANT di un blocco funzione a cui non viene assegnato un valore di inizializzazione finché non viene assegnata l'istanza del blocco funzione.

Sintassi: Dichiarazione del blocco funzione:

FUNCTION_BLOCK <function block name>
VAR_GENERIC CONSTANT
    <generic constant name> : <integer data type> := <initial value>; //Initial value will be overwritten
END_VAR
;

Ad esempio, è possibile utilizzare la costante generica (tipo di dati intero) in un blocco funzione per la dimensione degli array o la lunghezza delle stringhe. Il valore iniziale <initial value> è necessario solo per i controlli di compilazione. Al runtime, il valore viene sovrascritto.

Sintassi: Dichiarazione dell'istanza del blocco funzione:

PROGRAM PLC_PRG
VAR
    <fb instance name> : <function block name> < <literal> >;
    <fb instance name> : <function block name> <( <expression> )>;
END_VAR
;

Quando le istanze del blocco funzione sono dichiarate, alla costante viene assegnato un valore specifico che è valido esclusivamente per questa istanza. A questo scopo, il valore <literal> tra parentesi angolari viene aggiunto al blocco funzione <function block name> che funge da tipo di dati.

In alternativa, può essere aggiunta un'espressione <expression>. Racchiuderla tra parentesi per consentire l'uso di simboli come < o > in un'espressione e preservare così l'univocità del codice.

Esempio: Blocco funzione generico con variabile di array parametrizzabile:

Nell'esempio di codice riportato di seguito viene illustrato come definire un blocco funzione in grado di elaborare array di lunghezza arbitraria. Il blocco funzione ha un array con una lunghezza generica ma costante. In questo contesto, il termine costante significa che sebbene ogni istanza di blocco funzione vari nella sua lunghezza di array, rimane costante durante la durata dell'oggetto.

Ciò può essere utile nella programmazione della libreria, ad esempio, per implementare una POU di libreria generica.

FUNCTION_BLOCK FB_MyString 
VAR_GENERIC CONSTANT
    maxlen : UDINT := 1;
END_VAR
VAR
    test : ARRAY[0..maxlen-1] OF BYTE;
END_VAR
;
PROGRAM PLC_PRG
VAR CONSTANT
    cconst: DINT := 1000;
END_VAR
VAR    
    fbMyString1 : FB_MyString<100>;
    fbMyString2 : FB_MyString<(2 * cconst)>;
    arrMyString : ARRAY [0..5] OF FB_MyString<100>;
END_VAR
;

Eredità

Un blocco funzione con costanti generiche può anche utilizzare i costrutti di ereditarietà EXTENDS e IMPLEMENTS.

NOTA: accertarsi di inserire prima la dichiarazione delle costanti generiche seguita da EXTENDS e IMPLEMENTS, poiché le costanti generiche possono essere utilizzate anche con le classi base.

Esempio di ereditarietà:

INTERFACE IString 
METHOD Append : BOOL 
VAR_INPUT     
    strAppend : IString; 
END_VAR 
METHOD Assign : BOOL
VAR_INPUT     
    stringIn: String; 
END_VAR 
METHOD ToString : STRING
VAR_INPUT 
END_VAR 
PROPERTY Length : DINT
FUNCTION_BLOCK MyString 
VAR_GENERIC CONSTANT        
    maxlen : UDINT; 
END_VAR 
IMPLEMENTS IString
FUNCTION_BLOCK LongString EXTENDS MyString<1000>
FUNCTION_BLOCK MySpecialString 
VAR_GENERIC CONSTANT        
    maxlen2 : UDINT:= 1; 
END_VAR 
EXTENDS MyString<maxlen2>
METHOD ToLatin1: STRING
PROGRAM PLC_PRG 
VAR CONSTANT     
    cconst: DINT := 1000; 
END_VAR
VAR     
    string1 : MyString<100>;
    string2 : MyString<(2 * cconst)>;
    derived1 : LongString;
    derived2 : MySpecialString<100>;
END_VAR 
string1.Assign ('Welt'); 
string2.Assign ('Hallo '); 
string2.Append(string1); 
derived2.ToLatin1('Hello World');

Letterali con tipo

Fondamentalmente, nell'uso delle costanti IEC, verrà utilizzato il tipo di dati più piccolo possibile. Se è necessario utilizzare un altro tipo di dati, è possibile farlo grazie ai letterali con tipo, senza bisogno di dichiarare esplicitamente le costanti. La costante verrà fornita con un prefisso che ne stabilisce il tipo.

Sintassi

<type>#<literal>;

<type>

specifica il tipo di dati desiderato

voci possibili: BOOL, SINT, USINT, BYTE, INT, UINT, WORD, DINT, UDINT, DWORD, REAL, LREAL

Il tipo deve essere scritto con lettere maiuscole.

<literal>

specifica la costante

Immettere dati corrispondenti al tipo di dati specificato in <type>.

Esempio

iVar1:=DINT#34;

Se non è possibile convertire la costante nel tipo di destinazione senza perdita di dati, viene emesso un messaggio.

È possibile utilizzare i letterali con tipo in tutti i casi in cui si possono utilizzare le normali costanti.

Costanti in modalità online

Se l'impostazione predefinita Sostituisci costanti (File > Impostazioni progetto > Opzioni del compilatore) è attivata, le costanti in modalità online hanno il valore preceduto dal simbolo nella colonna Valore della vista Dichiarazione o Controllo. In tale caso, non è possibile accedervi, ad esempio, per forzarle o scriverle.