S7-1200 中 AT 覆盖参数的应用:灵活访问数据区域的实用指南
在 S7-1200 的编程过程中,经常需要对声明参数内的数据区域进行灵活访问。例如,有时需要将一个 Word 类型的参数按位进行操作,或者将一个 DWord 类型的参数拆分为多个不同的数据类型进行处理。通过附加声明(AT 覆盖)的方式,可以实现对已声明参数的不同数据类型寻址,极大地提升了数据操作的灵活性。本文将详细介绍 AT 覆盖参数的创建方法、顺序规则及注意事项,帮助工程师更好地掌握这一实用技巧。
一、AT 覆盖参数:数据类型灵活转换
AT 覆盖参数是 S7-1200 中一种特殊的参数声明方式,它允许为同一个数据区域赋予不同的数据类型,从而实现对该区域的多样化访问。例如,对于一个 int 类型的参数,可以通过 AT 覆盖将其声明为一个由 16 个 Bool 组成的数组,这样就能够直接对该 int 类型参数的每一位进行操作,无需进行复杂的位运算转换。
这种方法在工业控制场景中非常实用。比如,在处理一个 16 位的控制字时,既可以整体对这个控制字进行赋值或传递,又可以通过 Bool 数组单独控制每一位对应的设备状态,大大简化了程序编写。
二、创建 AT 覆盖参数的详细步骤
创建 AT 覆盖参数需要按照一定的流程进行操作,不同的块类型和设置会影响创建过程,下面详细介绍具体步骤。
步骤 1:创建非优化访问的块
首先,在 S7-1200 的项目中,新建一个 FB 块(功能块)或 FC 块(功能)。以 FB 块为例,右键点击 FB 块,进入该块的属性设置界面。在属性中,需要将 “优化的块访问” 选项取消勾选。这是因为优化的块访问会对数据存储进行优化,导致无法直接通过地址偏移进行参数覆盖,只有非优化的块访问才能支持 AT 覆盖参数的创建。
步骤 2:在块接口中添加参数并设置 AT 覆盖
双击进入 FB 块,展开 “块接口” 区域,如图所示。在 “Input”(输入)区域添加一个参数,例如命名为 “A”,数据类型设置为 int。接着,在参数 “A” 下面的一行,在 “数据类型” 这一列手动输入 “AT”。
此时,系统会自动生成一个新的参数 “Input_1”,其数据类型默认为 int。将 “Input_1” 的数据类型修改为 “Array [0..15] of Bool”,然后编译该 FB 块。编译完成后可以看到,参数 “A” 和 “Input_1” 的偏移量都是 0.0,这表明它们指向同一个数据地址,只是以不同的数据类型呈现。
按照同样的方法,可以在 “Output”(输出)区域创建参数 “B” 和对应的 AT 覆盖参数 “Output_1”,这样就能够对参数 “A” 和 “B” 进行位操作了。
步骤 3:处理优化的块访问情况
如果 FB 块需要保留 “优化的块访问”(即勾选该选项),则需要在 “保持性” 一列中选择 “在 IDB 中设置”,之后才能使用 AT 参数覆盖功能。
此外,对于标准访问的 FB 块输入参数,还可以使用结构体(Struct)进行覆盖。例如,一个 DWord 类型的参数可以被一个包含字、字节和布尔值的结构体覆盖,通过这种方式可以更灵活地对不同数据段进行操作。
步骤 4:调用 FB 块
在 OB1 中调用创建好的 FB 块时,FB 块的管脚不会显示 AT 覆盖生成的参数(如 Input_1 和 Output_1),如图 所示,这些参数仅在块内部用于数据访问。
三、AT 覆盖参数的顺序与对应关系
当使用 AT 覆盖参数后,需要明确参数之间的地址对应关系,以确保正确访问数据。例如,在 FB1 的接口区创建一个 DWord 类型的参数 var1,并创建一个 Array [0..31] of Bool 类型的 AT 覆盖参数 var2。在主程序 OB1 中调用 FB1,
并为 var1 赋值实参为 MD10(DWord 类型),此时 var2 与 var1(即 MD10)的对应关系如下:
var2[0] | M10.0 | MB10 |
var2[7] | M10.7 | |
var2[8] | M11.0 | MB11 |
var2[15] | M11.7 | |
var2[16] | M12.0 | MB12 |
var2[23] | M12.7 | |
var2[24] | M13.0 | MB13 |
var2[31] | M13.7 |
var2 [0] 对应 M10.0,var2 [1] 对应 M10.1……var2 [7] 对应 M10.7;var2 [8] 对应 M11.0,以此类推,var2 [31] 对应 M13.7。这种对应关系是由数据的存储结构决定的,低位在前,高位在后。
四、AT 覆盖参数的注意事项和规则
在使用 AT 覆盖参数时,需要遵循一定的规则和注意事项,以避免出现错误。
- 适用范围:在 LAD、FBD 和 SCL 编程语言中都允许使用参数覆盖;可以在 FB、FC 块中使用,但 S7-1200 的 OB 块是优化块,不支持 AT 功能;无法覆盖库中声明为接口参数的块,也无法覆盖接口中声明为参数的结构化 PLC 参数。
- 数据宽度:覆盖参数的数据宽度必须小于等于被覆盖参数的数据宽度,否则会导致数据访问越界。
- 数据类型限制:不可以覆盖 VARIANT 数据类型的参数;多重实例声明不能覆盖;Bool、Byte、SINT、USInt 和 Char 不能使用 PLC 数据类型、数组、结构体的参数覆盖;如果被覆盖参数是字符串、字节数组、字符数组等,其长度应与偶数个字节数对应。
- FB 与 FC 的差异:对于 FC 块使用 AT 覆盖时,覆盖参数和被覆盖参数的数据长度必须相同;而 FB 块在不同接口(如 Input、Output、Temp 等)对数据类型的组合有不同规则,具体可参考表 2。
- 其他限制:无法通过片段访问对覆盖参数进行寻址。
覆盖参数 | 被覆盖参数 | |||||
基本数据类型 | 结构化数据类型 | Any 指针 | DB_ANY | |||
FB | Input | 基本数据类型 | √ | √ | √ | |
结构化数据类型 | √ | √ | √ | √ | ||
Any 指针 | √ | |||||
Temp | 基本数据类型 | √ | √ | |||
结构化数据类型 | √ | √ | √ | |||
Any 指针 | √ | |||||
Static、Output | 基本数据类型 | √ | √ | √ | ||
结构化数据类型 | √ | √ | √ | |||
Any 指针 | ||||||
InOut | 基本数据类型 | √ | √ | |||
结构化数据类型 | √ | |||||
Any 指针 | ||||||
FC | Temp | 基本数据类型 | √ | √ | ||
结构化数据类型 | √ | √ | √ | |||
Any 指针 | √ | |||||
Input、Output、InOut | 基本数据类型 | √ | √ | |||
结构化数据类型 | √ | |||||
Any 指针 |
如果在程序中无法实现 AT 覆盖的需求,可以考虑使用片段访问,或者使用 “SCATTER”(分散)和 “GATHER”(聚集)指令来处理数据。
通过 AT 覆盖参数的功能,S7-1200 能够灵活地对声明参数内的数据区域进行访问,实现了不同数据类型之间的便捷转换和操作,在工业控制程序编写中具有很高的实用价值。在实际应用中,需要严格遵循相关规则和注意事项,确保程序的正确性和稳定性。