VAR_IN_OUT
变量是一种输入/输出变量,是 POU 接口的一部分,充当正式的逐参传递参数。
语法声明
<keyword> <POU name> VAR_IN_OUT <variable name> : <data type> ( := <initialization value> )? ; END_VAR <keyword> : FUNCTION | FUNCTION_BLOCK | METHOD | PRG
您可以在VAR_IN_OUT
声明部分的 POUPRG
,FUNCTION_BLOCK
,METHOD
或FUNCTION
中声明输入/输出变量。作为一种选择,可以指定一个已声明数据类型的常量作为初始化值。VAR_IN_OUT
变量可以读写。
使用方法
-
请致电 :当调用 POU 时,形式
VAR_IN_OUT
变量接收实际变量(逐参变量)作为参数。在运行时,传递参数时不会生成副本。相反,形式变量会收到一个指向远程传递的实际变量的引用。引用变量内部包含一个内存地址,作为实际值(作为指针传递 ,通过引用调用 )。不能直接将常量(字面量)或位变量指定为参数。 -
POU 内的读/写权限 :如果在 POU 中写入变量,则会影响传递的变量。退出 POU 后,任何已执行的更改都将保留。这意味着,POU 使用其
VAR_IN_OUT
变量,就像调用 POU 使用其变量一样。始终允许读取。 -
远程读/写访问:
VAR_IN_OUT
变量不能通过<function block instance name>.<variable name>
直接远程读取或写入。这只适用于VAR_INPUT
和VAR_OUTPUT
变量。 -
传递字符串变量 :如果将字符串变量作为参数传递,则实际变量和形式变量的长度应相同。否则,传递的字符串可能会被无意篡改。
VAR_OUTPUT CONSTANT
参数不会出现这个问题。 -
传递位变量 :位变量不能直接传递到
VAR_IN_OUT
变量,因为它需要一个中间变量。 -
传递属性 :不允许。
如果将字符串作为变量或常量传递给一个正式的VAR_IN_OUT CONSTANT
变量,那么字符串会自动完整传递。您不必检查字符串长度。
示例
传递数组
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);

传递字符串
{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
变量sDeviceStatus
是FB_B
POU 接口的一部分。在调用fbDoB
时,首先会将设备名称分配给字符串,然后对字符串进行操作。

传递位变量
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;
程序会调用功能块实例DoSomething_1
和DoSomething_2
。由于位变量xBit0
直接赋值给VAR_IN_OUT
输入,因此在调用DoSomething_1
实例时会产生编译器错误。相反,调用DoSomething_2
实例并赋值中间变量才是正确的代码。
转移变量 VAR_IN_OUT CONSTANT
VAR_IN_OUT CONSTANT
变量是一个常量传递参数,可以向其传递STRING
或WSTRING
类型的变量或常量(字面量)。可以读取参数,但不能写入。不允许传递财产。
语法声明
<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
变量声明时不分配初始化值。
使用方法
-
调用 POU 时,可以传递
STRING
或WSTRING
常量变量或字面量。因此,不允许写入访问。 -
传递字符串常量的参数:常量的字符串长度可以是任意大小,字符串长度与
VAR_IN_OUT CONSTANT
变量的字符串长度无关。
如果在“Project Project Settings” 的“Compile Options” 类别中选择了“Replace constants” 选项,则传递基本数据类型的常量参数或基本数据类型的常量变量会产生编译器错误。
编译器版本 >= 3.5.2.0 支持该变量。
示例
传递字符串常量和字符串变量的参数
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);
在代码中,字符串通过不同的VAR_IN_OUT
变量传递给funManipulate
函数。当传递字符串字面量时,编译器错误会输出到VAR_IN_OUT
变量。将常量变量传递给VAR_IN_OUT CONSTANT
变量时,即使传递的是字符串变量,也会生成正确的代码。