.可以在以下位置声明变量:
.语法
( <pragma> )*
<scope> ( <type qualifier> )?
<identifier> (AT <address> )? : <data type> ( := <initial value> )? ;
END_VAR
声明 | ||
<编译指令> | 编译指令(无、一个、多个) 注意:添加编译指令可以影响一个或多个变量的行为和属性。 | |
<scope> | .范围
| |
<type qualifier> | .类型限定符
| |
<identifier> | 标识符、变量名称 注意:在分配标识符时,必须毫无例外地遵循“标识符”一章中列出的规则。此外还可以找到有关统一命名的建议。 | |
AT <address> | 在输入、输出或标志存储范围(I、Q或M)中分配地址 AT % <memory area prefix> ( <size prefix> )? <memory position> .示例
| .另请参见 |
<data type> | . 数据类型
| |
<initial value> | 初始值 <literal value> | <identifier> | <expression> | |
( ...)? | 可选的 | |
( ...)* | 可选重复 |
.示例
.GVL
{attribute 'qualified_only'}
{attribute 'linkalways'}
VAR_GLOBAL CONSTANT
g_ciMAX_A : INT := 100;
g_ciSPECIAL : INT := g_ciMAX_A - 10;
END_VAR
.GVL_CONFIG
{attribute 'qualified_only'}
VAR_CONFIG
// Generated instance path of variable at incomplete address
PLC_PRG.fbDoItNow.XLOCINPUT AT %I*: BOOL := TRUE;
END_VAR
.FB_DoIt (FB)
METHOD METH_Last : INT
VAR_INPUT
iVar : INT;
END_VAR
VAR_INST
iLast : INT := 0;
END_VAR
METH_Last := iLast;
iLast := iVar;
FUNCTION_BLOCK FB_DoIt
VAR_INPUT
wInput AT %IW0 : WORD; (* Input variable *)
END_VAR
VAR_OUTPUT
wOutput AT %QW0 : WORD; (* Output variable *)
END_VAR
VAR_IN_OUT
aData_A : ARRAY[0..1] OF DATA_A; // Formal variable
END_VAR
VAR_EXTERNAL
GVL.g_ciMAX_A : INT; // Declared in object GVL
END_VAR
VAR_STAT
iNumberFBCalls : INT;
END_VAR
VAR
iCounter: INT;
xLocInput AT %I* : BOOL := TRUE; // VAR_CONFIG
END_VAR
iNumberFBCalls := iNumberFBCalls + 1;
.PLC_PRG (PRG)
PROGRAM PLC_PRG
VAR
iLoop: INT;
iTest: INT;
fbDoItNow : FB_DoIt;
iTest_200: INT;
aData_Now : ARRAY[0..1] OF DATA_A := [(iA_1 := 1, iA_2 := 10, dwA_3 := 16#00FF),(iA_1 := 2, iA_2 := 20, dwA_3 := 16#FF00)];
END_VAR
iTest := GVL.g_ciMAX_A;
iTest_200 := 2 * GVL.g_ciMAX_A;
fbDoItNow(aData_A := aData_Now);
FOR iLoop := 0 TO GVL.g_ciSPECIAL DO
;
END_FOR
所有声明的标准初始化值为0。在声明部分,你还可以为每个变量和每个数据类型指定用户定义的初始化值。
用户定义的初始化从赋值操作符:=开始,由编程语言ST(结构化文本)的任何有效表达式组成。因此,可以在常量、其他变量或函数的帮助下定义初始化值。如果使用变量,也必须对其进行初始化。
.例如
VAR
var1:INT := 12; // 初始化值12
x : INT := 13 + 8; // 由常量表达式定义的初始化值
y : INT := x + fun(4); // 由表达式定义的初始化值,
// 包含函数调用;注意顺序!
z : POINTER TO INT := ADR(y); // IEC61131-3 标准中未描述:
// 由adress函数定义的初始化值;
// 注意:在这种情况下指针不会被初始化
// 在线修改期间*)
END_VAR
初始化顺序的注意事项
从编译器3.5.3.40版本开始,一个功能块中的变量按如下顺序初始化:首先,所有的常数均按其声明顺序进行,然后所有的其他变量均按其声明顺序进行。 |
从编译器3.3.2.0版本开始,全局变量列表中的变量总是在POU的局部变量之前初始化。 |