.

输入/输出变量(VAR_IN_OUT)

.
.

VAR_IN_OUT变量是输入/输出变量,它是POU接口的一部分,并用作正式的按引用传递参数。

.语法声明


<关键字> <POU名称> 
VAR_IN_OUT
    <变量名称> : <数据类型> ( := <初始化值> )? ;
END_VAR
<关键字>: FUNCTION | FUNCTION_BLOCK | METHOD | PRG 
 

您可以在POU PRGFUNCTION_BLOCKMETHODFUNCTIONVAR_IN_OUT声明部分中声明输入/输出变量。作为选择,可以将声明的数据类型的常量分配为初始化值。可以读取和写入VAR_IN_OUT变量。

.用法

  • 调用:调用POU时,正式的VAR_IN_OUT变量将接收实际变量(传递引用变量)作为参数。在runtime下,传递参数时不会生成任何副本。相反,形式变量接收对远程传递的实际变量的引用。引用变量在内部包含一个内存地址,作为实际值的值(作为指针传递通过调用引用)。不能直接指定常量(文字)或位变量作为参数。
  • 在POU中进行读/写访问:如果将变量写入POU中,则这会影响所传递的变量。退出POU时,将保留执行的更改。这意味着POU使用其VAR_IN_OUT变量,就像调用POU使用其变量一样。始终允许读取访问。
  • 远程读写访问不能通过<function block instance name>.<variable name>直接远程读写VAR_IN_OUT变量。这仅适用于VAR_INPUTVAR_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
 

变量sDeviceStatusFB_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_1DoSomething_2。将位变量xBit0直接分配给VAR_IN_OUT输入的结果是,在调用DoSomething_1实例时生成了编译器错误。相反,调用DoSomething_2实例并分配中间变量是正确的代码。

.
传输变量VAR_IN_OUT CONSTANT

VAR_IN_OUT CONSTANT变量用作常量传递参数,可以将STRINGWSTRING类型的变量或常量(文字)传递给该参数。该参数可以读取,但不能写入。不允许传递属性。

.语法声明

<关键字> <POU名称> 
VAR_IN_OUT CONSTANT
    <变量名称> : <数据类型>; // formal parameter
END_VAR
<关键字> : FUNCTION | FUNCTION_BLOCK | METHOD | PRG
 

声明VAR_IN_OUT CONSTANT变量时不分配初始化值。

.用法

  • 调用POU时,可以传递STRINGWSTRING常量或文本。因此,不允许写访问。
  • 传递字符串常量的参数:常量的字符串长度可以是任意大小,并且字符串长度不取决于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);

 

在代码中,字符串通过不同的VAR_IN_OUT变量传递给funManipulate函数。传递文字时,编译器错误将输出到VAR_IN_OUT变量。将常量变量传递给VAR_IN_OUT CONSTANT变量时,即使传递字符串变量,也会生成正确的代码。