Skip to main content

变量: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_INPUTVAR_OUTPUT 变量。

  • 传递字符串变量:如果将字符串变量作为参数传递,那么实际变量和形式变量应该具有相同的长度。否则,传递的字符串可能会被无意中操作。在以下情况下不会出现此问题 VAR_OUTPUT CONSTANT 参数。

  • 传递位变量: 位变量不能直接传递给 VAR_IN_OUT 变量,因为它需要一个中间变量。

  • 传递属性: 不允许

提示

如果将字符串作为变量或常量传递给形式 VAR_IN_OUT CONSTANT 变量,则字符串自动完全传递。您不必检查字符串长度。

有关更多信息,请参阅: “VAR_IN_OUT CONSTANT”传输变量

84. 例子

传递数组

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

传递字符串

{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,首先将设备名称分配给字符串,然后对字符串进行操作。

_cds_varinouts_string.png

传递位变量

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_1DoSomething_2.由于位变量的直接赋值 xBit0VAR_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 支持该变量。

85. 例子

传递字符串常量和字符串变量的参数

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 变量,即使传递字符串变量也会生成正确的代码。