Variable: VAR_IN_OUT
A VAR_IN_OUT variable es una variable de entrada/salida, que forma parte de una interfaz POU y sirve como parámetro formal de paso por referencia.
Sintaxis
<keyword> <POU name>
VAR_IN_OUT
    <variable name> : <data type>;
END_VAR
<keyword> : FUNCTION | FUNCTION_BLOCK | METHOD | PRGPuede declarar una variable de entrada/salida en el VAR_IN_OUT sección de declaración en las POU PRG, FUNCTION_BLOCK, METHOD, o FUNCTION. El VAR_IN_OUT La variable se puede leer y escribir.
- Llamar: Cuando se llama a un POU, el formal - VAR_IN_OUTvariable recibe la variable real ("variable de paso por referencia") como argumento. En tiempo de ejecución, no se generan copias cuando se pasan parámetros. En cambio, la variable formal recibe una referencia a la variable real pasada de forma remota. Las variables referenciales contienen una dirección de memoria internamente como un valor al valor real (pasar como puntero, llamada por referencia). No es posible especificar una constante (literal) o una variable de bit directamente como argumento.
- Acceso de lectura/escritura dentro de la POU: si la variable se escribe dentro de la POU, esto afecta a la variable pasada. Cuando se sale de la POU, se conservan los cambios realizados. Esto significa que una POU utiliza su - VAR_IN_OUTvariables al igual que la POU llamante utiliza sus variables. El acceso de lectura siempre está permitido.
- Acceso de lectura/escritura de forma remota: - VAR_IN_OUTVariables no puede ser leído directamente o escrito de forma remota a través de- <function block instance name>.<variable name>. Esto funciona solo para- VAR_INPUTy- VAR_OUTPUTvariables
- Pasar variables de cadena: si se pasa una variable de cadena como argumento, la variable real y la variable formal deben tener la misma longitud. De lo contrario, la cadena pasada puede manipularse sin querer. Este problema no ocurre en el caso de - VAR_OUTPUT CONSTANTparámetros
- Paso de variables de bit: Una variable de bit no se puede pasar directamente a un - VAR_IN_OUTvariable porque necesita una variable intermedia.
- traspaso de propiedades: No permitido 
Sugerencia
Si una cadena se pasa como una variable o una constante a un formal VAR_IN_OUT CONSTANT variable, entonces la cadena se pasa automáticamente por completo. No tienes que comprobar la longitud de la cadena.
Para más información, ver: Variable de transferencia "VAR_IN_OUT CONSTANTE"
Pasar matrices
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);
pasando cuerdas
{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 variable sDeviceStatus es parte de la interfaz POU de FB_B. al llamar fbDoB, primero se asigna un nombre de dispositivo a la cadena y luego se manipula la cadena.

Paso de variables de 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;El programa llama a las instancias del bloque de función. DoSomething_1 y DoSomething_2. Como resultado de la asignación directa de la variable de bit xBit0 al VAR_IN_OUT entrada, se genera un error del compilador cuando el DoSomething_1 se llama la instancia. En cambio, llamar a la DoSomething_2 instancia con la asignación de una variable intermedia es el código correcto.
Variable de transferencia VAR_IN_OUT CONSTANT
A VAR_IN_OUT CONSTANT variable sirve como un parámetro constante de paso por referencia, al que se STRING o WSTRING Se puede pasar tipo variable o constante (literal). El parámetro se puede leer, pero no escribir. No se permite el traspaso de propiedades.
Declaración de sintaxis
<keyword> <POU name>
VAR_IN_OUT CONSTANT
    <variable name> : <data type>; // formal parameter
END_VAR
<keyword> : FUNCTION | FUNCTION_BLOCK | METHOD | PRGVAR_IN_OUT CONSTANT las variables se declaran sin asignar un valor de inicialización.
- Al llamar a la POU, un - STRINGo- WSTRINGSe puede pasar variable constante o literal. En consecuencia, no se permite el acceso de escritura.
- Pasar parámetros de una constante de cadena: la longitud de la cadena de las constantes puede ser de cualquier tamaño, y la longitud de la cadena no depende de la longitud de la cadena del - VAR_IN_OUT CONSTANTvariables
Sugerencia
Si el Reemplazar constantes se selecciona la opción en en el Opciones de compilación categoría, luego pasar los parámetros de una constante con tipo de datos básico o una variable constante con tipo de datos básico genera un error de compilación.
Sugerencia
La variable es compatible con la versión del compilador >= 3.5.2.0.
Pasar parámetros de constantes de cadena y variables de cadena
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);En el código, las cadenas se pasan al funManipulate función a través de diferentes VAR_IN_OUT variables Al pasar un literal de cadena, se envía un error del compilador a un VAR_IN_OUT variable. Al pasar una variable constante a una VAR_IN_OUT CONSTANT variable, se genera el código correcto incluso para pasar variables de cadena.