.

声明变量

.
变量声明:在哪里?怎么做?

.可以在以下位置声明变量:

  • POU的声明部分
    声明变量对话框可帮助你解决此问题。
    提示:如果在表格声明编辑器中定义一个变量,就会自动生成正确的语法。
  • GVL或NVL编辑器的声明部分
  • I/O设备对象的I/O映射配置

.语法

( <pragma> )*
<scope> ( <type qualifier> )?
    <identifier> (AT <address> )? : <data type> ( := <initial value> )? ;
END_VAR
 
.
 

声明

<编译指令>

编译指令(无、一个、多个)

注意:添加编译指令可以影响一个或多个变量的行为和属性。

<scope>

.范围

  • VAR
  • VAR_CONFIG
    注意:如果功能块中声明了地址信息不完整的变量(例如AT %I*),那么在变量声明VAR_CONFIG中的变量必须完整声明。完成此操作后,才能在本地实例中访问这些变量。
  • VAR_EXTERNAL
  • VAR_GLOBAL
  • VAR_INPUT
  • VAR_INST
  • VAR_IN_OUT
  • VAR_OUTPUT
  • VAR_STAT
  • VAR_TEMP

<type qualifier>

.类型限定符

  • CONST
  • RETAIN
  • PERSISTENT

<identifier>

标识符、变量名称

注意:在分配标识符时,必须毫无例外地遵循“标识符”一章中列出的规则。此外还可以找到有关统一命名的建议。

.另请参见

AT <address>

在输入、输出或标志存储范围(I、Q或M)中分配地址

AT % <memory area prefix> ( <size prefix> )? <memory position>

.示例

  • AT %I* // Incomplete address
  • AT %I7.5
  • AT %IW0
  • AT %QX7.5
  • AT %MD48

<data type>

. 数据类型

  • <elementary data type>
  • <user defined data type>
  • <function block>

<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的局部变量之前初始化。