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.
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 paraVAR_INPUT
yVAR_OUTPUT
variablesPasar 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ámetrosPaso 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"
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 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.

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.
Al llamar a la POU, un
STRING
oWSTRING
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 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.