S7-1200 使用数组实现间接寻址
S7-1200 自固件版本V2.0 起便允许使用变量作为数组下标,数组成了实现间接寻址的Zui便捷手段。通过变动下标变量的值,可以完成多种功能。
数组间接寻址通常有这么几种
DB 中数组、或者块接口、Static、Temp 的数组
字符串字符间接寻址
I、Q 的数组、FB 多重背景的数组、DB_ANY 的数组
下面就这几种情况分别介绍。
在编程中,数组间接寻址通常与 SCL(Structured Control Language)一起使用,尤其是在需要循环结构如 FOR循环的情况下。这并不意味着 LAD(Ladder Diagram)无法实现数组间接寻址。正如在之前的数组说明中所提及的,LAD同样可以支持变址操作。
1. 普通数组变量
普通数组变量通常是在 DB块中直接定义的数组,或者在块接口中定义的,比如常见的静态变量数组。下面举例说明如何从数组中找出Zui大值和Zui小值,将它们剔除并按原顺序放入另一个数组。整个过程可以参考下面的步骤。
1. 定义两个数组,一个用于存储原始数据,另一个用于存储筛选后的数据。
2. 使用循环结构遍历原始数据数组,找出Zui大值和Zui小值。
3. 剔除Zui大值和Zui小值,并将剩余值按原顺序存入筛选后的数组。
4. 完成以上步骤后,筛选后的数组即包含剔除Zui大值和Zui小值后的数据。整个过程如图 1、2、3、4 所示。
以下例程仅供参考。读者如欲采纳,风险自担。
图 1. 定义 FC 块接口
图 2. 编写程序
图 3. 调用块
图 4. 监视结果
2. 字符串字符间接寻址
默认情况下,字符串类型 String 和 WString 都预设为包含 254 个字符。而 WString 类型Zui多可以扩展到16382 个字符。这些字符可以通过索引进行访问,类似于数组中的变址寻址。
请注意,字符的索引是从 1 开始的。
举例来说,如果我们想要移除 String[8] 数组中除了 0-9 和 A-F(以及a-f)之外的所有字符,并将处理后的结果转换为一个 DWord 变量,我们可以按照以下步骤进行:
1. 初始化一个 DWord 变量来存储结果。
2. 遍历 String[8] 数组中的每个字符。
3. 使用条件语句检查每个字符是否在 0-9 或 A-F(以及 a-f)范围内。
4. 如果是,将该字符添加到 DWord 变量中。
5. Zui后,DWord 变量将包含转换后的字符序列。
请记住,实际编程时需要确保处理字符串的大小和范围,以避免超出定义的界限。整个过程如图 5、6、7、8 所示。
因为 FC 无法定义带长度的字符串参数接口,使用 FB。
以下例程仅供参考。读者如欲采纳,风险自担。
图 5. 定义 FB 块接口
图 6. 编写程序
图 7. 调用块
图 8. 监视结果
注:如果对字符串不处理直接进行 ATH 转换,结果如图 9 所示。所有的不合规的字符都转换为 0。
图 9. 监视结果
3. I、Q 的数组
在 PLC 的变量表中,I 和 Q 通常不能直接定义为数组。从 CPU V4.0 固件版本开始,I 和 Q 可以定义为PLC 数据类型,从而可以在 PLC 数据类型中定义数组。这使得实际上 I 和 Q变量成为了数组数据类型,方便了间接寻址操作,无需再使用 PEEK 指令。
举例来说,如果我们需要对从 IW100 开始的 16 个模拟量进行标定,我们可以定义一个 PLC数据类型,其中包含一个数组来存储这些模拟量数据。在程序中直接访问该数组,而无需使用 PEEK指令来手动访问内存地址。
这种方式简化了程序的编写和维护,提高了代码的可读性和可维护性。在实际应用中,需要确保数组的大小和数据类型与处理的数据一致,以免发生错误。整个过程如图10、11、12、13、14 所示。
以下例程仅供参考。读者如欲采纳,风险自担。
图 10. 编写程序
图 11. 定义 PLC 数据类型
图 12. 定义 PLC 变量
图 13. 定义数据块
图 14. 调用程序