变量:VAR_IN_OUT
一个 VAR_IN_OUT
variable 是一个输入/输出变量,它是 POU 接口的一部分,用作正式的按引用传递参数。
句法
<keyword> <POU name> VAR_IN_OUT <variable name> : <data type>; END_VAR <keyword> : FUNCTION | FUNCTION_BLOCK | METHOD | PRG
您可以在中声明输入/输出变量 VAR_IN_OUT
POU 中的声明部分 PRG
, FUNCTION_BLOCK
, METHOD
, 或者 FUNCTION
。这 VAR_IN_OUT
变量可以被读取和写入。
称呼: 当一个 POU 被调用时,正式的
VAR_IN_OUT
variable 接收实际变量(“按引用传递变量”)作为参数。在运行时,传递参数时不会生成副本。相反,形式变量接收对远程传递的实际变量的引用。引用变量在内部包含一个内存地址作为实际值的值(作为指针传递, 调用参考)。不能直接指定常量(文字)或位变量作为参数。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
变量,则字符串自动完全传递。您不必检查字符串长度。
有关更多信息,请参阅: “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
是 POU 接口的一部分 FB_B
.打电话时 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
变量。
提示
如果 替换常量 选项被选中 在里面 编译选项 类别,然后传递具有基本数据类型的常量或具有基本数据类型的常量变量的参数会生成编译器错误。
提示
编译器版本 >= 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);
在代码中,字符串被传递给 funManipulate
通过不同的功能 VAR_IN_OUT
变量。传递字符串文字时,将编译器错误输出到 VAR_IN_OUT
多变的。将常量变量传递给 VAR_IN_OUT CONSTANT
变量,即使传递字符串变量也会生成正确的代码。