Skip to main content

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 | PRG

Puede 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.

. Uso
  • Llamar: Cuando se llama a un POU, el formal VAR_IN_OUT variable 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_OUT variables 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_OUT Variables 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_INPUT y VAR_OUTPUT variables

  • 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 CONSTANT parámetros

  • Paso de variables de bit: Una variable de bit no se puede pasar directamente a un VAR_IN_OUT variable 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"

ejemplo 84. Ejemplo

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);
_cds_varinouts_array.png

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 parameter

La 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.

_cds_varinouts_string.png

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 | PRG

VAR_IN_OUT CONSTANT las variables se declaran sin asignar un valor de inicialización.

. Uso
  • Al llamar a la POU, un STRING o WSTRING Se 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 CONSTANT variables

Sugerencia

Si el Reemplazar constantes se selecciona la opción en Proyecto → Configuración del proyecto 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.

ejemplo 85. Ejemplo

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.