VAR
在关键字 VAR
与 END_VAR
之间,POU 的所有局部变量都已声明。这些局部变量没有任何外部关连;也就是说,无法从外部写入。
请考虑向 VAR
添加属性的可能性。
示例
VAR
iLoc1:INT; (* 1. Local Variable*)
END_VAR
VAR_INPUT
在关键字 VAR_INPUT
与 END_VAR
之间,充当 POU 的输入变量的所有变量都已声明。因此,在调用位置处,变量值可以与调用一起提供。
请考虑添加属性的可能性。
示例
VAR_INPUT
iIn1:INT (* 1. Inputvariable*)
END_VAR
VAR_OUTPUT
在关键字 VAR_OUTPUT
与 END_VAR
之间,充当 POU 的输出变量的所有变量都已声明。因此,这些值将被被移动到进行调用的 POU。
请考虑向 VAR_OUTPUT
添加属性的可能性。
示例
VAR_OUTPUT
iOut1:INT; (* 1. Outputvariable*)
END_VAR
函数和方法中的输出变量:
根据 IEC 61131-3 草案 2,函数(和方法)可以具有额外输出。您可以在函数调用中分配这些输出,如以下示例中所示。
示例
fun(iIn1 := 1, iIn2 := 2, iOut1 => iLoc1, iOut2 => iLoc2);
VAR_IN_OUT
在关键字 VAR_IN_OUT
与 END_VAR
之间,充当 POU 的输入和输出变量的所有变量都已声明。
IN_OUT
类型的变量,已传输变量的值将更改(作为指针传输,即,按引用调用)。因此,此类变量的输入值不能是常量。因此,即使是功能块的 VAR_IN_OUT
变量也无法通过 <FBinstance>.<InOutVariable>
来直接从外部读取或写入。
示例
VAR_IN_OUT
iInOut1:INT; (* 1. Inputoutputvariable *)
END_VAR
VAR_IN_OUT CONSTANT
VAR_IN_OUT CONSTANT
变量用作常量引用传递参数。STRING 或 WSTRING 类型的变量或常量(字面量)可以被传递到此参数。此参数是只读参数。不允许传递属性。
语法
VAR_IN_OUT CONSTANT
<variable name> : <data type>; // formal parameter
END_VAR
VAR_IN_OUT CONSTANT
变量的声明不需要对初始化值进行赋值。
用法
调用 POU 时,可以传递 STRING 或 WSTRING 类型的常数变量或字面量。不允许执行写访问。
传递为 STRING 常量的参数时,字符串长度不受限制。字符串长度不取决于 VAR_IN_OUT CONSTANT
变量的字符串长度。
此变量受 EcoStruxure Machine Expert V2.0 及其更高版本支持。
示例:传递 STRING 常量参数和 STRING 变量参数
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
变量时,可生成正确的代码。这甚至适用于传递字符串变量。
VAR_GLOBAL
您可以作为全局变量来声明在工程中已知的正常变量、常量、外部变量或剩余变量。要声明全局变量,请使用全局变量列表 (GVL)。可以通过执行
命令(默认情况下是在 菜单中)来添加 GVL。
请在关键字 VAR_GLOBAL
和 END_VAR
之间以本地方式声明变量。
请考虑向 VAR_GLOBAL
添加属性的可能性。
以句点开头的变量将被识别为全局变量,例如,.iGlobVar1
。
有关多次使用变量名称、全局范围操作符 dot (.)
以及命名空间的详细信息,请参阅全局范围操作符一章。
全局变量只能在全局变量列表 (GVL) 中声明。GVL 用来管理工程中的全局变量。可以通过执行
命令(默认情况下是在 菜单中)来添加 GVL。VAR_TEMP
该功能是对 IEC 61131-3 标准的扩展。
临时变量在每次调用 POU 时都进行(重新)初始化。VAR_TEMP
声明仅能在程序和功能块中使用。这些变量也只能在程序 POU 或功能块的主体中访问。
请在关键字 VAR_TEMP
和 END_VAR
之间以本地方式声明变量。
VAR_TEMP
代替 VAR
,以减少 POU 需要的存储器空间(例如,在只是临时使用变量的情况下,降低功能块中的存储器空间)。
VAR_STAT
该功能是对 IEC 61131-3 标准的扩展。
静态变量可以在功能块、方法和函数中使用。请在关键字 VAR_STAT
和 END_VAR
之间以本地方式声明静态变量。静态变量是在首次调用各自 POU 时进行初始化。
如同全局变量一样,静态变量在用于声明静态变量的 POU 退出之后,不会丢失其值。静态变量在用于声明静态变量的 POU 之间共享(例如,多个功能块实例、函数或方法共享相同的静态变量)。例如,静态变量在功能中可以用作函数调用次数的计数器。
请考虑向 VAR_STAT
添加属性的可能性。
VAR_EXTERNAL
外部变量是指导入 POU 的全局变量。
请在关键字 VAR_EXTERNAL
和 END_VAR
之间以及在全局变量列表 (GVL) 中,以本地方式声明外部变量。该声明和全局声明必须相同。如果全局变量不存在,则会显示一条消息。
示例
FUNCTION_BLOCK FB_DoSomething
VAR_EXTERNAL
iVarExt1:INT; (* 1st external variable *)
END_VAR
VAR_INST
如果利用 VAR_INST
属性将方法的变量声明为实例变量,则此变量不会存储在方法堆栈上,而是存储在功能块实例的堆栈上。因此,它的行为与功能块实例其他变量的行为相似,并且在方法被调用时,不被初始化。
VAR_INST
变量仅允许用在方法中。您只能在方法中访问这样的变量。属性(如 CONST
、RETAIN
)不允许用在声明中。变量的值可以在方法的声明部分中受到监视。
示例
METHOD meth_last : INT
VAR_INPUT
iVar : INT;
END_VAR
VAR_INST
iLast : INT := 0;
END_VAR
meth_last := iLast;
iLast := iVar;