技术论坛

 跟我一起玩200 smart PLC 关于数据的排序

返回主题列表
作者 主题
WWCWWC
至圣

经验值: 72011
发帖数: 8043
精华帖: 145
楼主    2017-05-17 09:26:22
主题:跟我一起玩200 smart PLC 关于数据的排序 精华帖 

跟我一起玩200 smart PLC

关于数据的排序

   之前,看到过论坛上的大侠们做过一些关于数据的排序程序段子,最让我记忆犹新的是阿鸣老师发帖的那个“冒泡法”程序。其中心思想是利用指针的地址偏移及循环指令特性,将一组准备好了的数据逐个循环轮询一次,每一个数据都进行一次比较,如果大于了怎么样,小于了又怎么样的处理。前几天论坛上又见到类似的问题,由季侠热心地回复了编程思路,不知道那位网友是否已经做出了该数据排序的程序。

   今天晚上闲来无事,想起了那个问题,打算再做一次。因为这个程序差不多已经成为比较经典的程序段子,编程思路与前面的前辈们比起来显得不成熟的多了,难免的一些失误,或者不足之处望包涵。

假设,有10个数据(估计做这样的程序都是以10个数据来比较排序的,可能是出于常人的习惯思维),数据地址假设是VW100开始的,具体数据如下表所示:

编程思路:

1)  初始化所需要调用的数据区数据,这步对于多次调用该程序段非常重要。

2)  定义数据排序起始指针地址,&VB100取指针的起始地址。

3)  利用循环指令,做9个数据的循环,因为是10个数据比较9次循环就完全可以将全部的数据比较完成逐个进行数据的比较。

4)  第一次,循环中先将2个数据比较,如果比较数据的结果VW100大于VW102,则,交换数据存储地址的数据,反之,不交换数据。

5)  无论怎样均指针下移一个字的地址区后,循环返回到循环起始,再取小的数据与第三个数据进行比较,比较结果仍然按第3步方式进行排序。

6)  同样的方式,直到循环9次,循环指令9次数到达后,跳出循环指令,并将比较结果单独存放到指定的地址VW200中。

如果编辑的程序运行结果VW200的数据地址中是48,说明程序是按编程思路是可行的,当然如果把这个程序稍加修改,也可以做成自己的数据排序库文件,以方便今后遇见类似的程序复制调用之需要,或者稍加修改后,将比较结果的最大数据存放在VW200中,编程思路就是这样的过程。

为了方便比较数据,特在软件系统块中编辑了表中的数据,图示:


在主程序中编辑数据排序程序:为压缩页面将程序转换为STL语言方式显示


为检测程序的比较运行结果,新建一个“状态图表”将程序编译、保存、下载到cpu,启动M0.0 = 1,监控这些数据的变化规律,图示:


程序运行的结果VW200 = 48符合当初的控制要求,当然结果取指针的首地址VW100也是可以的。

实际上,类似的程序很方便做比较最大数或者最小数,区别仅仅是将取指针数据的比较的指令稍加变换,图示:


重新编译、保存程序,并将修改后的程序下载到cpu,验证结果,图示:


验证结果VW200 = 120仍然符合比较最大数据的需要。反过来看,如果需要比较更多的数据,仅仅只需要将所需要的数据录入后,通过按比较数据的个数减1的方式启用循环指令,类似的“冒泡法”比较编程适用于一串连续的数据区比较结果,所谓的“冒泡法”实际就是循环指令的循环。该程序适宜于那些风机、泵类运行时间数据的比较,来判断所需要启动风机、泵的其中一个优先启动条件。

注:

   如果需要将此类型的程序做成自己的库文件形式或多次调用,则在调用该程序段前必须先进行数据区的初始化操作,然后录入新的数据再进行比较,以免引起数据处理时的结果错乱。比如,利用M0.0的上升沿初始化数据区,下降沿进行数据的比较等方式。


RENHQ
至圣

经验值: 69053
发帖数: 12266
精华帖: 59
1楼    2017-05-18 09:06:40
主题:回复:跟我一起玩200 smart PLC 关于数据的排序

感谢分享

数据多了使用for循环不知道对PLC扫描周期影响大不大啊

Q群:https://jq.qq.com/?k=9BDuEgf6
WWCWWC
至圣

经验值: 72011
发帖数: 8043
精华帖: 145
3楼    2017-05-18 09:15:14
主题:回复:跟我一起玩200 smart PLC 关于数据的排序

如果循环指令嵌套深了有可能,尽量规避循环指令同时多个执行,当然,如果特殊情况下,还可以调用看门狗指令来弥补调用循环指令对程序工作机制所可能带来的一些错误报警。

您收到0封站内信:
×
×
信息提示
很抱歉!您所访问的页面不存在,或网址发生了变化,请稍后再试。