### 变量声明：在哪里？怎么做？​

可以在以下位置声明变量：

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

语法

(  )\*  
 (  )?  
  (AT  )? :  ( :=  )? ;  
END\_VAR

|  | 声明 |
|---|---|
|  | 编译指令（无、一个、多个）  注意：添加编译指令可以影响一个或多个变量的行为和属性。 |
|  | 范围  - VAR - VAR\_CONFIG       注意：如果功能块中声明了地址信息不完整的变量（例如AT %I\*），那么在变量声明VAR\_CONFIG中的变量必须完整声明。完成此操作后，才能在本地实例中访问这些变量。 - VAR\_EXTERNAL - VAR\_GLOBAL - VAR\_INPUT - VAR\_INST - VAR\_IN\_OUT - VAR\_OUTPUT - VAR\_STAT - VAR\_TEMP |
|  | 类型限定符  - CONST - RETAIN - PERSISTENT |
|  | 标识符、变量名称  注意：在分配标识符时，必须毫无例外地遵循“标识符”一章中列出的规则。此外还可以找到有关统一命名的建议。 |
| AT | 在输入、输出或标志存储范围（I、Q或M）中分配地址  AT %  (  )?  示例  - AT %I\* // Incomplete address - AT %I7.5 - AT %IW0 - AT %QX7.5 - AT %MD48 |
|  | 数据类型  -  -  - |
|  | 初始值   \|  \| |
| ( ...)? | 可选的 |
| ( ...)\* | 可选重复 |

> 示例
> 
> .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