admin 发表于 2024-11-6 21:28:58

变量类型


[*]VAR 局部变量
[*]VAR_INPUT 输入变量
[*]VAR_OUTPUT 输出变量
[*]VAR_IN_OUT 输入和输出变量
[*]VAR_IN_OUT CONSTANT 传输变量
[*]VAR_GLOBAL 全局变量
[*]VAR_TEMP 临时变量
[*]VAR_STAT 静态变量
[*]VAR_EXTERNAL 外部变量
[*]VAR_INST 实例变量

局部变量 - 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> 来直接从外部读取或写入。
注: 请勿向功能块的 BOOL 类型 VAR_IN_OUT 参数分配位类型符号(如,位于此类位类型地址上的 %MXaa.b 或 BOOL 变量)。如果检测到任何此类赋值,则在消息视图中将其报告为编译错误。
示例
VAR_IN_OUT
iInOut1:INT; (* 1. Inputoutputvariable *)
END_VAR

传输变量 - VAR_IN_OUT CONSTANTVAR_IN_OUT CONSTANT 变量用作常量引用传递参数。STRING 或 WSTRING 类型的变量或常量(字面量)可以被传递到此参数。此参数是只读参数。不允许传递属性。语法VAR_IN_OUT CONSTANT    <variable name> : <data type>; // formal parameterEND_VARVAR_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。注: 如果在 POU 中以本地方式定义的某个变量与某个全局变量同名,则该变量在 POU 中优先。
注: 全局变量是在 POU 的局部变量之前进行初始化。

临时变量 - 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) 中,以本地方式声明外部变量。该声明和全局声明必须相同。如果全局变量不存在,则会显示一条消息。注: 不需要将变量定义为外部变量。提供这些关键字是为了保持与 IEC 61131-3 的兼容性。
示例
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_VA
Rmeth_last := iLast;
iLast := iVar;




页: [1]
查看完整版本: 变量类型