VAR_IN_OUT变量是输入/输出变量,它是POU接口的一部分,并用作正式的按引用传递参数。
.语法声明
<关键字> <POU名称>
VAR_IN_OUT
<变量名称> : <数据类型> ( := <初始化值> )? ;
END_VAR
<关键字>: FUNCTION | FUNCTION_BLOCK | METHOD | PRG
您可以在POU PRG,FUNCTION_BLOCK,METHOD或FUNCTION的VAR_IN_OUT声明部分中声明输入/输出变量。作为选择,可以将声明的数据类型的常量分配为初始化值。可以读取和写入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变量用作常量传递参数,可以将STRING或WSTRING类型的变量或常量(文字)传递给该参数。该参数可以读取,但不能写入。不允许传递属性。
.语法声明
<关键字> <POU名称>
VAR_IN_OUT CONSTANT
<变量名称> : <数据类型>; // formal parameter
END_VAR
<关键字> : FUNCTION | FUNCTION_BLOCK | METHOD | PRG
声明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变量时,即使传递字符串变量,也会生成正确的代码。