01S7-1200 使用数组实现间接寻
在 S7 - 1200 的编程领域,数组间接寻址是一项极具价值的技术。自固件版本 V2.0 起,S7 - 1200 允许使用变量作为数组下标,这使得数组成为实现间接寻址的不二之选。通过灵活改变下标变量的值,我们能够实现多种多样的功能。
数组间接寻址主要涵盖以下几种类型:DB 中的数组、块接口、Static 和 Temp 的数组、字符串字符间接寻址、I 和 Q 的数组、FB 多重背景的数组以及 DB_ANY 的数组。接下来,我们将分别对这些类型展开详细介绍。
在编程实践中,数组间接寻址通常与 SCL(Structured Control Language)配合使用,特别是在涉及 FOR 循环等循环结构的场景中。不过,这并不代表 LAD(Ladder Diagram)无法实现数组间接寻址,在之前的数组相关内容中我们已经提到,LAD 同样支持变址操作。
021. 普通数组变量:探寻最值筛选之道
普通数组变量一般在 DB 块中直接定义,或者在块接口中定义,常见的静态变量数组就是其中一种。下面我们通过一个实例来讲解如何从数组中找出最大值和最小值,并将它们剔除后按原顺序存入另一个数组。具体步骤如下:
步骤一:数组定义
首先,我们需要定义两个数组。其中一个数组用于存储原始数据,它就像是一个装满各种物品的仓库,里面的数据未经处理;另一个数组则用于存储筛选后的数据,这个数组将在后续操作中装入我们精心挑选的数据。
步骤二:遍历找最值
运用循环结构对原始数据数组进行遍历。这个过程就像是在仓库中逐个检查物品,通过比较,找出其中的最大值和最小值。这两个值在整个数据集合中具有特殊的地位,我们需要将它们识别出来。
步骤三:剔除最值并存储
将找到的最大值和最小值从原始数据中剔除,然后把剩余的数据按照原来的顺序存入筛选后的数组。这一步骤就像是把仓库中不需要的 “大件” 和 “小件” 拿走,只留下我们需要的物品,并重新整理摆放。
步骤四:完成筛选
完成上述步骤后,筛选后的数组就包含了剔除最大值和最小值之后的数据。整个过程可以参考图 1 - 4。需要注意的是,这里给出的例程仅供参考,读者若要采纳,需自行承担风险。
v 以下例程仅供参考。读者如欲采纳,风险自担。
[img=588.739990234375,295.66998291015625]https://mmbiz.qpic.cn/mmbiz_png/iakiceSlibZkOBK8vOcib4QJjRIRSmlibtQYXYiboyTqrribgDkDg9X3cWCLY6UtJzpMeACoQMQX7B4REq0QM2jHkDWSg/640?wx_fmt=png[/img]
图 1. 定义 FC 块接口
[img=623.340087890625,507.80999755859375]https://mmbiz.qpic.cn/mmbiz_png/iakiceSlibZkOBK8vOcib4QJjRIRSmlibtQYXNpUBe5pLrk3gH8ICq5WQZicJASRwSP0lIf8CtUHz2LM6Jiax4MLRLnaA/640?wx_fmt=png[/img]
图 2. 编写程序
[img=557.010009765625,95.0]https://mmbiz.qpic.cn/mmbiz_png/iakiceSlibZkOBK8vOcib4QJjRIRSmlibtQYXQ0UKSKXMqyDpxNfUrGQsDq2faviazWj0HbO4kLIVG671NJgGgEyciafg/640?wx_fmt=png[/img]
图 3. 调用块
[img=530.010009765625,365.010009765625]https://mmbiz.qpic.cn/mmbiz_png/iakiceSlibZkOBK8vOcib4QJjRIRSmlibtQYXNHRBHq2mholPr5q1JibJ9Yn4CvJ2qtGJgaayN3VFBksl0sHMonoHUUg/640?wx_fmt=png[/img]
图 4. 监视结果
032. 字符串字符间接寻址:字符处理的奇妙之旅
在默认设置下,字符串类型 String 和 WString 有着特定的字符预设。String 类型默认包含 254 个字符,而 WString 类型更为强大,最多可扩展到 16382 个字符。这些字符可以通过索引进行访问,这种访问方式类似于数组中的变址寻址,不过要特别注意,字符的索引是从 1 开始的。
我们来看一个例子,假如我们想要移除 String [8] 数组中除了 0 - 9 和 A - F(以及 a - f)之外的所有字符,并将处理后的结果转换为一个 DWord 变量,可以按照以下步骤操作:
步骤一:初始化变量
首先初始化一个 DWord 变量,这个变量就像是一个空盒子,准备用来存放我们处理后的字符结果。
步骤二:字符遍历
对 String [8] 数组中的每个字符进行遍历,就像逐个检查字符串数组这个 “字符链” 上的每一个环节。
步骤三:条件检查
使用条件语句来检查每个字符是否在 0 - 9 或 A - F(以及 a - f)范围内。这一步就像是在字符的世界里设置了一道筛选门,只有符合条件的字符才能通过。
步骤四:字符添加
如果字符符合条件,就将其添加到之前初始化的 DWord 变量中。这就像是把通过筛选的字符放进我们准备好的 “盒子” 里。
步骤五:完成转换
经过上述步骤,DWord 变量最终将包含转换后的字符序列。在实际编程过程中,务必确保处理字符串的大小和范围在定义的界限内,避免出现错误。整个过程可以参考图 5 - 8。由于 FC 无法定义带长度的字符串参数接口,这里我们使用 FB。同样,此例程仅供参考,采纳需谨慎。
另外,如果对字符串不进行处理直接进行 ATH 转换,结果如图 9 所示,所有不合规的字符都将转换为 0。
以下例程仅供参考。读者如欲采纳,风险自担。
[img=635.010009765625,331.0099792480469]https://mmbiz.qpic.cn/mmbiz_png/iakiceSlibZkOBK8vOcib4QJjRIRSmlibtQYX7cpkUehzI0zorTnScib25fHR6qnl4XVePlHmuiaTTsEf2SW22fsD98Dg/640?wx_fmt=png[/img]
图 5. 定义 FB 块接口
[img=592.280029296875,374.6099853515625]https://mmbiz.qpic.cn/mmbiz_png/iakiceSlibZkOBK8vOcib4QJjRIRSmlibtQYXqX6ow7qULKjcobctHicTSPtNXW9qSbAwkQbsU5BxvVMrgrRHyqOZc8A/640?wx_fmt=png[/img]
图 6. 编写程序
[img=556.010009765625,114.00001525878906]https://mmbiz.qpic.cn/mmbiz_png/iakiceSlibZkOBK8vOcib4QJjRIRSmlibtQYXL9a1JXVSU6T3P7Fof6TIlrlhHWgdgKUHKuFwEfhz7Dy3iaOZZyPcRKg/640?wx_fmt=png[/img]
图 7. 调用块
[img=449.0099792480469,98.0]https://mmbiz.qpic.cn/mmbiz_png/iakiceSlibZkOBK8vOcib4QJjRIRSmlibtQYX63N0BLu9YRHWEKuyIdEJYFziaBFZZ6C5nbytv2wsiaxmz27hicTockU1A/640?wx_fmt=png[/img]
图 8. 监视结果
注:如果对字符串不处理直接进行 ATH 转换,结果如图 9 所示。所有的不合规的字符都转换为 0。
[img=447.0099792480469,98.0]https://mmbiz.qpic.cn/mmbiz_png/iakiceSlibZkOBK8vOcib4QJjRIRSmlibtQYXaACibt8oxJFmia7dIcD5A4Pq8SFY0fvFial7GnhB4TMpDmWpCk0rCpcLQ/640?wx_fmt=png[/img]
图 9. 监视结果
04I、Q 的数组:新特性带来的便利之法
在 PLC 的变量表中,I 和 Q 在通常情况下不能直接定义为数组。但是,从 CPU V4.0 固件版本开始,情况发生了变化。I 和 Q 可以定义为 PLC 数据类型,进而可以在 PLC 数据类型中定义数组。这一变化使得 I 和 Q 变量实际上成为了数组数据类型,极大地方便了间接寻址操作,不再需要使用 PEEK 指令。
例如,当我们需要对从 IW100 开始的 16 个模拟量进行标定时,可以按照以下方法操作:
步骤一:定义 PLC 数据类型
首先定义一个 PLC 数据类型,在这个数据类型中包含一个数组。这个数组就像是一个专门为模拟量数据打造的 “存储容器”,用于存放我们要处理的模拟量数据。
步骤二:直接访问数组
在程序中,可以直接访问这个数组,无需使用 PEEK 指令手动访问内存地址。这种方式大大简化了程序的编写和维护工作,提高了代码的可读性和可维护性。
不过,在实际应用中,要特别注意确保数组的大小和数据类型与要处理的数据保持一致,否则可能会出现错误。整个过程可以参考图 10 - 14。这里的例程同样仅供参考,使用时需谨慎。
[img=616.9400634765625,219.94000244140625]https://mmbiz.qpic.cn/mmbiz_png/iakiceSlibZkOBK8vOcib4QJjRIRSmlibtQYXK9NoIVlDB9j0gIJUl788rDxJv43T8DCPTZ9mHeP6eibw1lElBfKsaGQ/640?wx_fmt=png[/img]
图 10. 编写程序
[img=465.0099792480469,142.0]https://mmbiz.qpic.cn/mmbiz_png/iakiceSlibZkOBK8vOcib4QJjRIRSmlibtQYXDjia7sxicCzTSQenMvwZu3pDAibQsqdtVkbCuebfLvSTwDqDupvawb2iaQ/640?wx_fmt=png[/img]
图 11. 定义 PLC 数据类型
[img=417.0099792480469,462.010009765625]https://mmbiz.qpic.cn/mmbiz_png/iakiceSlibZkOBK8vOcib4QJjRIRSmlibtQYX48ZCeuRrictDnnEKJ5AWj2lzfJmHhaD4SSd4wGBTXnYPuZcP8LvCKYA/640?wx_fmt=png[/img]
图 12. 定义 PLC 变量
[img=342.010009765625,99.0]https://mmbiz.qpic.cn/mmbiz_png/iakiceSlibZkOBK8vOcib4QJjRIRSmlibtQYXJ2vfQJr1dTBDgGWibiaXo97zDd5Zk2uQHzfKPibkUY4CywFKaTuxIkClA/640?wx_fmt=png[/img]
图 13. 定义数据块
[img=558.010009765625,135.0]https://mmbiz.qpic.cn/mmbiz_png/iakiceSlibZkOBK8vOcib4QJjRIRSmlibtQYXqw2JsaOQyibN2q0tDCOFpGktqY69ZjoiatDMEUCxUyUr7hnP0SUWY5xA/640?wx_fmt=png[/img]
图 14. 调用程序
|