S7-1500 使用AT覆盖变量

S7-1500 要访问声明变量内的数据区域,可以通过附加声明来覆盖所声明的变量。其优势在于无需指令即可根据需要实现变量的拆分,拆分后的变量可在程序中直接使用。例如,可以通过 Array of Bool 寻址数据类型为 Byte、Word 或 DWord 变量的各个位。


支持AT 访问的变量如下:
• 标准访问的FC/FB的接口数据区中的变量;
• 优化访问的FB的接口数据区中保持性设置为“在IDB中设置”的变量。

AT变量的声明:要覆盖一个参数,可以在待覆盖的参数后直接声明一个附加参数,然后选择数据类型"AT"。编辑器随即创建该覆盖,然后选择将用于该覆盖的数据类型、结构或数组。

以下使用TIA V17 Por软件,以一个简单实例讲述AT覆盖变量使用,具体如下;

1. AT 覆盖变量使用-标准访问的FB/FC

(1) 创建一个 S7-1500 的项目,在程序块中添加一个 FB (或者 FC ),右击FB 进入该块的属性中,将 FB 属性中的"优化的块访问"取消,改为标准FB,如图 1 所示。

图1. 创建非优化的 FB 块

(2) 双击进入 FB 块, 展开 FB 块的"块接口",如图 2 所示。

图2. 展开 FB 块的"块接口"

(3)在FB"块接口"中,在 Input 添加一个变量,变量名为 "InData",数据类型为 Word;然后紧跟在变量 “InData” 下一行,数据类型处输入"AT"数据类型,如图 3 所示。

图3. 输入"AT"数据类型

(4)Input 中会生成一个新变量,变量名可自由定义此处定义为“AtInData”,然后把变量的数据类型修改成 Array[0..15] of Bool,并编译该 FB 块。可以看到变量 "InData" 和覆盖变量 “AtInData” 的偏移量都是 0.0,表示这两个变量是相同地址,只是以不同的数据类型显示,如图 4 所示。

图4. 创建AT覆盖变量

(5)同样方法新建 Output 的变量 “OutData” 和AT覆盖变量 “AtOutData”,如图 5 所示。

图5. 定义输出AT覆盖变量

(6) FB中编程使用(程序无实际意义仅为应用示例),此时输入和输出的WORD变量均可按拆分成的Bool数据类型使用,如图 6 所示。

图6. FB中使用AT覆盖变量编程

(7) 在OB1中调用FB时,接口管脚上是不会显示AT覆盖变量的,如图 7 所示。

图7. OB1中调用FB

2. AT 覆盖变量使用-优化访问的FB

若FB为优化程序块,需要在"保持"一列中选择"在 IDB 中设置",才能使用 AT 变量覆盖,如图 8 所示。

图8. FB 块的优化访问处理

3. 注意事项和规则

注意事项:

S7-1500/1200:在 FC 中使用 AT,对于 S7-1500/1200 中的 FC,覆盖变量和被覆盖变量的数据长度必须相同。如果无法通过程序实现,请检查是否可以使用片段访问来代替 AT 结构。

规则:

对于变量覆盖可适用以下通用规则:

1.在 STL、LAD、FBD 和 GRAPH 中,S7-1200 和 S7-1500 允许变量覆盖。

2.SCL 支持在所有 CPU 系列中覆盖。

3.可以在以下块中覆盖变量:

在标准访问的代码块中;

在可优化访问具有保留设置"在 IDB 中设置"的变量的代码块中。

4.覆盖变量数据宽度必须小于等于被覆盖变量的数据宽度。

5.不可以覆盖 VARIANT 和 INSTANCE 数据类型的变量。

6.如果被覆盖变量的数据类型为字符串、字节数组、字符数组等,那么其长度应与偶数个字节数对应。

7.无法覆盖库中声明为接口中参数的块。

8.无法覆盖接口中声明为参数的结构化 PLC 变量。

9.无法通过片段访问对覆盖变量进行寻址。

下列组合规则也适用,如下图9所示。

图9. FB 块的优化访问处理

上图9来在TIA V17帮助文件,图中标注的“X**”应该和“√”对调。测试验证如下图10 所示。“Input_1”为被覆盖的变量,数据类型为基本类型;“Input_2”为覆盖变量,数据类型为结构体;不符合帮助文件备注的例外情况。

图10. AT覆盖的例外情况