跟我一起玩200 smart PLC
关于数据的排序1
前面几次做了几个所谓的数据排序的程序,实际上严格意义上说是找数据的最小值,或者是找数据的最大值,其中,最小值或者最大值的数据将被覆盖掉,当然,你可以先操作一步,将待排列的数据转存出来后,再进行一次数据的比较。
在“找答案”或“论坛”上,时不时的看到对类似问题的一些提问和讨论,一直来想做一个类似于第三方PLC指令的那个数据的排序程序,记得第三方PLC编程指令中有一个 “SORT” 指令,该指令通过找行与列的定义数据范围,实现范围内的数据并按顺序排列。
编程思路:
假设,有10个数据,首地址为VW100开始的10个地址连续的数据,通过设置的定时中断SMB34(中断事件10)= 10 mS间隔定时时间,当中断10次后(相当于0.1秒)待排列的10组数据完成数据排列。
1) 首先,调用定时中断,SMB34 = 10(mS),连接中断并开中断,在主程序中调用
2) 在定时连接的中断中编辑:
A) 定义中断次数寄存器在VB0中记录
B) 启用指针&VB100,并启用地址VW100和VW102中的指针地址
C) 比较这2个数据的大小,如果小于,则数据不调换并将指针下移到VW104,准备下一个中断再比较;如果大于,则数据调换数据地址寄存器,同时,仍然执行指针下移一个地址区,准备下一个中断到来后再比较
D)数据地址的调换:首先,将指针*AC1的数据暂时存放在AC0,这样原指针*AC1中的数据被“清空”,然后方便*AC2的数据放入*AC1中,最后,把刚刚暂时存放在AC0累加器中的数据返还给*AC1实现数据的交换
E) 当中断10次到达后,指针返回到原位置,清空中断次数,为下一次数据排列做好准备
程序:
在“数据块”定义好一串数据,任意的自定义数据,图示:
在子程序中定义定时中断SMB = 10(mS),连接中断子程序INT_0,中断事件号10,开中断,图示:
在定时中断中编辑数据排序程序,图示:
为方便监控新建一个“状态图表”,监控上述数据排序程序是否能够满足最初的程序思想要求,将编辑的程序编译、保存、下载到cpu中启动监控,图示:
程序运行的结果符合初始的编程要求。当然,如果控制要求需要降幂排序,仅仅只修改数据比较的内容即可。每次当看到状态图表中显示出结果结束程序的验证时,总会想起那句手工编程的魅力在于编程前有充足的准备编程思路,对每条指令的理解及子程序调用、特殊标志位的应用,望这段小程序能够提供给编程者做一些类似的参考。