分享

西门子 S7-1200PLC之数组间接寻址,给大家学习一下!

 PLC发烧友 2024-04-26 发布于广东

S7-1200 使用数组实现间接寻址

S7-1200 自固件版本 V2.0 起便允许使用变量作为数组下标,因此数组成了实现间接寻址的最便捷手段。通过变动下标变量的值,可以完成多种功能。

数组间接寻址通常有这么几种

DB 中数组、或者块接口、Static、Temp 的数组

字符串字符间接寻址

I、Q 的数组、FB 多重背景的数组、DB_ANY 的数组

下面就这几种情况分别介绍。

在编程中,数组间接寻址通常与 SCL(Structured Control Language)一起使用,尤其是在需要循环结构如 FOR 循环的情况下。然而,这并不意味着 LAD(Ladder Diagram)无法实现数组间接寻址。正如在之前的数组说明中所提及的,LAD 同样可以支持变址操作。

1. 普通数组变量

普通数组变量通常是在 DB 块中直接定义的数组,或者在块接口中定义的,比如常见的静态变量数组。下面举例说明如何从数组中找出最大值和最小值,然后将它们剔除并按原顺序放入另一个数组。整个过程可以参考下面的步骤。

1. 定义两个数组,一个用于存储原始数据,另一个用于存储筛选后的数据。
2. 使用循环结构遍历原始数据数组,找出最大值和最小值。         
3. 剔除最大值和最小值,并将剩余值按原顺序存入筛选后的数组。         
4. 完成以上步骤后,筛选后的数组即包含剔除最大值和最小值后的数据。整个过程如图 1、2、3、4 所示。

以下例程仅供参考。读者如欲采纳,风险自担。

图 1. 定义 FC 块接口

图 2. 编写程序

图 3. 调用块

图 4. 监视结果

2. 字符串字符间接寻址

默认情况下,字符串类型 String 和 WString 都预设为包含 254 个字符。而 WString 类型最多可以扩展到 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. 最后,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. 调用程序

章来源:

章来源:技成培训网原创,作者:胡志豪;未经授权禁止转载,违者必究!

    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多