Questo capitolo fornisce ulteriori informazioni sui seguenti tipi di variabili:
variabili locali VAR
variabili di ingresso VAR_INPUT
variabili di uscita VAR_OUTPUT
variabili di ingresso e uscita VAR_IN_OUT
VAR_IN_OUT CONSTANT
variabile di trasferimento
variabili globali VAR_GLOBAL
variabili temporanee VAR_TEMP
variabili statiche VAR_STAT
variabili esterne VAR_EXTERNAL
variabili di istanza VAR_INST
VAR
Tra le parole chiave VAR
e END_VAR
, tutte le variabili di una POU sono dichiarate. Queste variabili non hanno alcun collegamento esterno; in altre parole, non possono essere scritte dall'esterno.
Considerare la possibilità di aggiungere un attributo a VAR
.
Esempio
VAR
iLoc1:INT; (* 1. Local Variable*)
END_VAR
VAR_INPUT
Tra le parole chiave VAR_INPUT
e END_VAR
, sono dichiarate tutte le variabili che servono come variabili di ingresso per una POU. Pertanto, nella posizione della chiamata, il valore delle variabili può essere fornito insieme a una chiamata.
Considerare la possibilità di aggiungere un attributo.
Esempio
VAR_INPUT
iIn1:INT (* 1. Inputvariable*)
END_VAR
VAR_OUTPUT
Tra le parole chiave VAR_OUTPUT
e END_VAR
, sono dichiarate tutte le variabili che servono come variabili di uscita di una POU. Pertanto, questi valori vengono riportati alla POU che effettua la chiamata.
Considerare la possibilità di aggiungere un attributo a VAR_OUTPUT
.
Esempio
VAR_OUTPUT
iOut1:INT; (* 1. Outputvariable*)
END_VAR
Variabili di uscita nelle funzioni e nei metodi:
Secondo IEC 61131-3 bozza 2, le funzioni (e i metodi) possono avere uscite aggiuntive. Queste funzioni possono essere assegnate nella chiamata della funzione, come illustrato nel seguente esempio.
Esempio
fun(iIn1 := 1, iIn2 := 2, iOut1 => iLoc1, iOut2 => iLoc2);
VAR_IN_OUT
Tra le parole chiave VAR_IN_OUT
e END_VAR
, sono dichiarate tutte le variabili che servono come variabili di ingresso e uscita per una POU.
IN_OUT
, il valore della variabile trasferita viene modificato (trasferito come puntatore, Call-by-Reference). Pertanto, il valore di ingresso per tali variabili non può essere una costante. Per questo motivo, anche le variabili di un blocco funzione VAR_IN_OUT
non possono essere lette o scritte direttamente dall'esterno tramite <FBinstance>.<InOutVariable>
.
VAR_IN_OUT
di tipo BOOL dei blocchi funzione. Se vengono rilevate assegnazioni di questo tipo, vengono segnalate come un errore di nella vista.
Esempio
VAR_IN_OUT
iInOut1:INT; (* 1. Inputoutputvariable *)
END_VAR
VAR_IN_OUT CONSTANT
Una variabile VAR_IN_OUT CONSTANT
funge da parametro di riferimento costante. Una variabile o una costante (letterale) di tipo STRING o WSTRING può essere passata a questo parametro. Il parametro è di sola lettura. Il passaggio di proprietà non è consentito.
Sintassi
VAR_IN_OUT CONSTANT
<variable name> : <data type>; // formal parameter
END_VAR
Le variabili VAR_IN_OUT CONSTANT
vengono dichiarate senza assegnare un valore di inizializzazione.
Uso
Quando si chiama la POU, è possibile passare una variabile costante o letterale di tipo STRING o WSTRING. L'accesso in scrittura non è consentito.
Quando si passano i parametri di una costante STRING, la lunghezza della stringa non è limitata. La lunghezza della stringa non dipende dalla lunghezza della stringa delle variabili VAR_IN_OUT CONSTANT
.
La variabile è supportata da EcoStruxure Machine Expert V2.0 e versioni successive.
Esempio: passaggio di parametri di costanti STRING e variabili STRING
FUNCTION funManipulate : BOOL
VAR_IN_OUT
sReadWrite : STRING(16); (* Can be read or written here in POU *)
dwVarReadWrite : DWORD; (* Can be read or written here in POU *)
END_VAR
VAR_IN_OUT CONSTANT
c_sReadOnly : STRING(16); (* Constant string variable can only be read here in POU *)
END_VAR
sReadWrite := 'String_from_POU';
dwVarReadWrite := STRING_TO_DWORD(c_sReadOnly);
PROGRAM PRG_A
VAR
sVarFits : STRING(16);
sValFits : STRING(16) :='1234567890123456';
dwVar: DWORD;
END_VAR
// The following line of code causes the compiler error C0417:
// C0417: VAR_IN_OUT parameter 'sReadWrite' needs a variable with write access as input.
funManipulate(sReadWrite:='1234567890123456', c_sReadOnly:='1234567890123456', dwVarReadWrite := dwVar);
// Correct code
funManipulate(sReadWrite := sValFits, c_sReadOnly := '23', dwVarReadWrite := dwVar);
funManipulate(sReadWrite := sVarFits, c_sReadOnly := sValFits, dwVarReadWrite :=dwVar);
Nell’esempio di codice, le stringhe sono passate alla funzione funManipulate tramite variabili VAR_IN_OUT
differenti:
Quando si passa una stringa letterale a una variabile VAR_IN_OUT
, viene emesso un errore del compilatore.
Quando si passa una variabile costante a una variabile VAR_IN_OUT CONSTANT
, viene generato il codice corretto. Questo vale anche per il passaggio di variabili di stringa.
VAR_GLOBAL
Si possono dichiarare variabili normali, costanti, variabili esterne o rimanenti che vengono definite nel progetto come variabili globali. Per dichiarare le variabili globali, utilizzare l'elenco delle variabili globali (GVL). È possibile aggiungere un GVL eseguendo il comando
(per impostazione predefinita nel menu ).
Dichiarare le variabili globali localmente tra le parole chiave VAR_GLOBAL
e END_VAR
.
Considerare la possibilità di aggiungere un attributo a VAR_GLOBAL
.
Una variabile è identificata come variabile globale da un punto che ne precede il nome; ad esempio, .iGlobVar1
.
Per informazioni dettagliate sull'uso multiplo dei nomi di variabili, l'operatore ambito globale dot (.)
e gli spazi dei nomi, vedere il capitolo Operatore ambito globale.
Le variabili globali possono essere dichiarate soltanto negli elenchi di variabili globali (GVL). Servono per gestire le variabili globali in un progetto. È possibile aggiungere un GVL eseguendo il comando
(per impostazione predefinita nel menu ).VAR_TEMP
Questa caratteristica è un'estensione dello standard IEC 61131-3.
Le variabili temporanee sono (re)inizializzate ad ogni chiamata della POU. Le dichiarazioni VAR_TEMP
sono possibili solo all'interno di programmi e blocchi funzione. Queste variabili sono inoltre accessibili solo all'interno della POU di programma o del blocco funzione.
Dichiarare le variabili globali localmente tra le parole chiave VAR_TEMP
e END_VAR
.
VAR_TEMP
anziché VAR
per ridurre lo spazio di memoria necessario per una POU (ad esempio all'interno di un blocco funzione se la variabile viene utilizzata solo temporaneamente).
VAR_STAT
Questa caratteristica è un'estensione dello standard IEC 61131-3.
Le variabili statiche possono essere utilizzate nei blocchi funzione, nei metodi e nelle funzioni. Dichiararle localmente tra le parole chiave VAR_STAT
e END_VAR
. Vengono inizializzate alla prima chiamata del rispettivo POU.
Come le variabili globali, le variabili statiche non perdono il loro valore quando di esce dal POU nel quale sono state dichiarate. Vengono condivise tra i POU nei quali sono dichiarate (ad esempio, diverse istanze di blocchi funzione, funzioni o metodi condividono la stessa variabile statica). Possono essere utilizzate, ad esempio, in una funzione come contatore per il numero di chiamate di funzioni.
Considerare la possibilità di aggiungere un attributo a VAR_STAT
.
VAR_EXTERNAL
Sono le variabili globali importate nella POU.
Dichiararle localmente tra le parole chiave VAR_EXTERNAL
e END_VAR
e nell'elenco di variabili globali (GVL). La dichiarazione e la dichiarazione globale devono essere identiche. Se la variabile globale non esiste, viene visualizzato un messaggio.
Esempio
FUNCTION_BLOCK FB_DoSomething
VAR_EXTERNAL
iVarExt1:INT; (* 1st external variable *)
END_VAR
VAR_INST
Se si dichiara una variabile di un metodo come variabile di istanza tramite l'attributo VAR_INST
, tale variabile non viene memorizzata nella stack del metodo ma nello stack dell'istanza del blocco funzione. Si comporta quindi come altre variabili dell'istanza del blocco funzione e non viene reinizializzata quando si chiama il metodo.
Le variabili VAR_INST
sono consentite solo nei metodi. È possibile accedere a tali variabili solo all'interno del metodo. Gli attributi come CONST
, RETAIN
non sono consentiti nella dichiarazione. I valori delle variabili possono essere monitorati nella parte di dichiarazione del metodo.
Esempio
METHOD meth_last : INT
VAR_INPUT
iVar : INT;
END_VAR
VAR_INST
iLast : INT := 0;
END_VAR
meth_last := iLast;
iLast := iVar;