Una variabile VAR_IN_OUT è una variabile di input/output che fa parte di un'interfaccia POU e funge da parametro
formale pass-by-reference.
Sintassi
<keyword> <POU name>
VAR_IN_OUT
<variable name> : <data type> ( := <initialization value> )? ;
END_VAR
<keyword> : FUNCTION | FUNCTION_BLOCK | METHOD | PRG
È possibile dichiarare una variabile di input/output nella sezione di dichiarazione
VAR_IN_OUT nei POU PRG, FUNCTION_BLOCK, METHOD, o FUNCTION. Come opzione, è possibile assegnare una costante del tipo di dati dichiarato come
valore di inizializzazione. La variabile VAR_IN_OUT può essere letta e scritta.
Utilizzo
-
Chiama: Quando viene richiamata una POU, la variabile formale
VAR_IN_OUTriceve come argomento la variabile reale ("variabile pass-by-reference"). In fase di esecuzione, non vengono generate copie quando vengono passati i parametri. Invece, la variabile formale riceve un riferimento alla variabile effettiva passata in remoto. Le variabili referenziali contengono internamente un indirizzo di memoria come valore al valore effettivo (pass as pointer, call-by reference). Non è possibile specificare una costante (letterale) o una variabile bit direttamente come argomento. -
Accesso in lettura/scrittura all'interno del POU: Se la variabile viene scritta all'interno del POU, ciò influisce sulla variabile passata. Quando si esce dal POU, le modifiche effettuate vengono mantenute. Ciò significa che un POU usa le sue variabili
VAR_IN_OUTproprio come il POU chiamante usa le sue variabili. L'accesso in lettura è sempre consentito. -
Accesso in lettura/scrittura da remoto: le variabili
VAR_IN_OUTnon possono essere lette o scritte direttamente da remoto tramite<function block instance name>.<variable name>. Questo funziona solo per le variabiliVAR_INPUTeVAR_OUTPUT. -
Passaggio di variabili stringa: Se viene passata una variabile stringa come argomento, la variabile reale e quella formale devono avere la stessa lunghezza. In caso contrario, la stringa passata può essere manipolata involontariamente. Questo problema non si verifica nel caso dei parametri
VAR_OUTPUT CONSTANT. -
Passaggio di variabili bit: Una variabile bit non può essere passata direttamente a una variabile
VAR_IN_OUTperché necessita di una variabile intermedia. -
Passaggio di proprietà: Non consentito
Se una stringa viene passata come variabile o costante a una variabile formale di
VAR_IN_OUT CONSTANT, la stringa viene automaticamente passata completamente. Non è necessario controllare
la lunghezza della stringa.
Per ulteriori informazioni, vedere: "VAR_IN_OUT CONSTANT" Variabile di trasferimento
Esempio
Passaggio di array
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);

Passaggio di 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 e poi 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 chiama le istanze del blocco funzione DoSomething_1 e DoSomething_2. A causa dell'assegnazione diretta della variabile di bit xBit0 all'ingresso di VAR_IN_OUT, quando viene richiamata l'istanza di DoSomething_1 viene generato un errore del compilatore. Al contrario, richiamare l'istanza di DoSomething_2 con l'assegnazione di una variabile intermedia è un codice corretto.
-
Variabile di trasferimento
VAR_IN_OUT CONSTANT