È possibile aggiungere le seguenti parole chiave attributo alla dichiarazione del tipo di variabile per specificare l'ambito:
RETAIN
: vedere Variabili Retain
PERSISTENT
: vedere Variabili persistenti
CONSTANT
: vedere Costanti - CONSTANT, Letterali con tipo
VAR_GENERIC CONSTANT
: vedere Costanti - VAR_GENERIC CONSTANT
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).
VAR PERSISTENT
viene interpretata allo stesso modo di VAR PERSISTENT RETAIN
o VAR RETAIN PERSISTENT
.
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.
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
. 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
e, a differenza delle variabili persistenti, quando si esegue il comando o durante il download di un'applicazione.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 | |
---|---|
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.
Le variabili persistenti sono identificate dalla parola chiave PERSISTENT
(VAR_GLOBAL PERSISTENT
). Vengono reinizializzate solo quando si esegue il comando . A differenza delle variabili Retain, mantengono i loro valori dopo un download.
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.
VAR_GLOBAL PERSISTENT
ha lo stesso effetto di una dichiarazione con VAR_GLOBAL PERSISTENT RETAIN
o VAR_GLOBAL RETAIN PERSISTENT
.
PERSISTENT
all’esterno dell'editor di elenchi persistenti. Per ulteriori informazioni, vedere il comando .
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
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.
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.
PERSISTENT
, l'istanza del blocco funzione con le sue variabili viene archiviata nella memoria rimanente, ma solo tale variabile viene trattata come persistente.
Consultare la Guida alla programmazione del controller specifico per ulteriori informazioni sul comportamento delle variabili rimanenti.
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.
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
.
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');
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.