Variabile: VAR_IN_OUT
UN VAR_IN_OUT
variabile è una variabile di input/output, che fa parte di un'interfaccia POU e funge da parametro di pass-by-reference formale.
Sintassi
<keyword> <POU name> VAR_IN_OUT <variable name> : <data type>; END_VAR <keyword> : FUNCTION | FUNCTION_BLOCK | METHOD | PRG
È possibile dichiarare una variabile di input/output nel file VAR_IN_OUT
sezione dichiarazioni nei POU PRG
, FUNCTION_BLOCK
, METHOD
, O FUNCTION
. IL VAR_IN_OUT
la variabile può essere letta e scritta.
Chiamata: Quando viene chiamata una POU, il formale
VAR_IN_OUT
variabile riceve la variabile effettiva ("variabile pass-by-reference") come argomento. In fase di esecuzione, non vengono generate copie quando vengono passati i parametri. Al contrario, la variabile formale riceve un riferimento alla variabile effettiva passata in remoto. Le variabili di riferimento contengono internamente un indirizzo di memoria come valore rispetto al valore effettivo (passare come puntatore, call-by referenza). Non è possibile specificare una costante (letterale) o una variabile bit direttamente come argomento.Accesso in lettura/scrittura all'interno della POU: Se la variabile viene scritta all'interno della POU, ciò influisce sulla variabile passata. Quando si esce dalla POU, tutte le modifiche eseguite vengono mantenute. Ciò significa che una POU usa il suo
VAR_IN_OUT
variabili proprio come la POU chiamante usa le sue variabili. L'accesso in lettura è sempre consentito.Accesso in lettura/scrittura da remoto:
VAR_IN_OUT
variabili non può essere letto direttamente o scritto a distanza tramite<function block instance name>.<variable name>
. Questo funziona solo perVAR_INPUT
eVAR_OUTPUT
variabili.Passaggio di variabili stringa: Se una variabile stringa viene passata come argomento, la variabile effettiva e la variabile formale dovrebbero avere la stessa lunghezza. In caso contrario, la stringa passata può essere manipolata involontariamente. Questo problema non si verifica nel caso di
VAR_OUTPUT CONSTANT
parametri.Passaggio di variabili bit: Una variabile bit non può essere passata direttamente ad a
VAR_IN_OUT
variabile perché necessita di una variabile intermedia.Passaggio di proprietà: Non consentito
Suggerimento
Se una stringa viene passata come variabile o costante a un formale VAR_IN_OUT CONSTANT
variabile, la stringa viene passata automaticamente completamente. Non è necessario controllare la lunghezza della stringa.
Per ulteriori informazioni, vedere: Variabile di trasferimento "VAR_IN_OUT CONSTANT".
Matrici di passaggio
TYPE DUT_A : STRUCT xA: BOOL; iB: INT; END_STRUCT END_TYPE FUNCTION_BLOCK FB_SetArray VAR_IN_OUT aData_A : ARRAY[0..1] OF DUT_A; // Formal variable END_VAR aData_A[0].xA := TRUE; aData_A[0].iB := 100; PROGRAM PLC_PRG VAR fbSetA : FB_SetArray; aSpecialData : ARRAY[0..1] OF DUT_A; // Actual variable END_VAR fbSetA(aData_A := aSpecialData);

Passare le stringhe
{attribute 'qualified_only'} VAR_GLOBAL g_sDEV_STATUS : STRING(25) := 'Device_A'; END_VAR FUNCTION_BLOCK FB_SetStatus VAR_IN_OUT sDeviceStatus : STRING(25); // Formal parameter END_VAR sDeviceStatus := CONCAT(sDeviceStatus, ' Activ'); PROGRAM PLC_PRG VAR fbDoB : FB_SetStatus; END_VAR fbDoB(sDeviceStatus := GVL.g_sDEV_STATUS); //Call with actual parameter
La variabile sDeviceStatus
fa parte dell'interfaccia POU di FB_B
. Quando si chiama fbDoB
, prima viene assegnato un nome di dispositivo alla stringa, quindi la stringa viene manipolata.

Passaggio di variabili bit
VAR_GLOBAL xBit0 AT %MX0.1 : BOOL; xTemp : BOOL; END_VAR FUNCTION_BLOCK FB_DoSomething VAR_INPUT xIn : BOOL; END_VAR VAR_IN_OUT xInOut : BOOL; END_VAR IF xIn THEN xInOut := TRUE; END_IF PROGRAM PLC_PRG VAR xIn : BOOL; DoSomething_1 : FB_DoSomething; DoSomething_2 : FB_DoSomething; END_VAR // The following line of code causes a compiler error: // C0201: Typ 'BIT' is not equal to type 'BOOL' of VAR_IN_OUT 'xInOut' DoSomething_1(xIn := xIn, xInOut := xBit0); // Workaround xTemp := xBit0; DoSomething_2(xIn := xIn, xInOut := xTemp); xBit0 := xTemp;
Il programma richiama le istanze del blocco funzione DoSomething_1
e DoSomething_2
. Come risultato dell'assegnazione diretta della variabile bit xBit0
al VAR_IN_OUT
input, viene generato un errore del compilatore quando il file DoSomething_1
viene chiamata l'istanza. Al contrario, chiamando il DoSomething_2
istanza con l'assegnazione di una variabile intermedia è codice corretto.
Variabile di trasferimento VAR_IN_OUT CONSTANT
UN VAR_IN_OUT CONSTANT
La variabile funge da parametro di riferimento costante, a cui a STRING
o WSTRING
è possibile passare una variabile di tipo o una costante (letterale). Il parametro può essere letto, ma non scritto. Non è consentito il passaggio di proprietà.
Dichiarazione di sintassi
<keyword> <POU name> VAR_IN_OUT CONSTANT <variable name> : <data type>; // formal parameter END_VAR <keyword> : FUNCTION | FUNCTION_BLOCK | METHOD | PRG
VAR_IN_OUT CONSTANT
le variabili vengono dichiarate senza assegnare un valore di inizializzazione.
Quando si chiama la POU, a
STRING
oWSTRING
è possibile passare una variabile costante o un letterale. Di conseguenza, l'accesso in scrittura non è consentito.Passaggio dei parametri di una costante stringa: la lunghezza della stringa delle costanti può essere di qualsiasi dimensione e la lunghezza della stringa non dipende dalla lunghezza della stringa del
VAR_IN_OUT CONSTANT
variabili.
Suggerimento
Se la Sostituisci le costanti l'opzione è selezionata in nel Opzioni di compilazione categoria, quindi il passaggio dei parametri di una costante con tipo di dati di base o di una variabile costante con tipo di dati di base genera un errore del compilatore.
Suggerimento
La variabile è supportata nella versione del compilatore >= 3.5.2.0.
Passaggio di parametri di costanti stringa e variabili stringa
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);
Nel codice, le stringhe vengono passate a funManipulate
funzione tramite diverso VAR_IN_OUT
variabili. Quando si passa una stringa letterale, viene restituito un errore del compilatore a a VAR_IN_OUT
variabile. Quando si passa una variabile costante ad a VAR_IN_OUT CONSTANT
variabile, viene generato il codice corretto anche per il passaggio di variabili stringa.