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_OUTvariabile 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_OUTvariabili proprio come la POU chiamante usa le sue variabili. L'accesso in lettura è sempre consentito.
- Accesso in lettura/scrittura da remoto: - VAR_IN_OUTvariabili non può essere letto direttamente o scritto a distanza tramite- <function block instance name>.<variable name>. Questo funziona solo per- VAR_INPUTe- VAR_OUTPUTvariabili.
- 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 CONSTANTparametri.
- Passaggio di variabili bit: Una variabile bit non può essere passata direttamente ad a - VAR_IN_OUTvariabile 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 parameterLa 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 | PRGVAR_IN_OUT CONSTANT le variabili vengono dichiarate senza assegnare un valore di inizializzazione.
- Quando si chiama la POU, a - STRINGo- WSTRINGè 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 CONSTANTvariabili.
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.