作者:will666
本人从事的是污水与自来水行业。在自来水厂V型滤池的控制工艺中有一个重要的工艺就是滤池反冲洗工序,一般规模水厂有6-8个V型滤池,所有滤池共用一套反冲洗设备,同时只能给一个滤池反冲洗,如果此时有其他滤池发起反冲洗要求必须将其编号请求保存起来,以便在当前滤池反冲结束后执行下一个最早发起反冲要求的滤池。
基于以上工艺要求,使用FIFO堆栈可以很好的解决这个问题,当反冲请求到来时将其编号入栈保护,在允许反冲时将滤池编号从堆栈中弹出。基本所有PLC都有FIFO堆栈指令或程序块来完成堆栈操作,但是在滤池反冲调度实际应用中却有一下几个缺点:1、由于人为或仪表原因,滤池反冲洗请求可能会重复产生,如果每个滤池反冲请求上升沿都进行入栈操作将会在堆栈中出现重复的编号,影响反冲程序的执行,因此在入栈前必须检查堆栈内容,防止重复入栈;2、现有堆栈指令块用法较复杂,新手难以理解。为了实现堆栈功能,也有不少高手自己开发了堆栈功能块,但基本使用语句表开发,利用了指针功能,其他使用者更加难以理解。
为了解决以上问题,我用梯形图语言开发一种简单的堆栈程序,使用基本的move指令完成堆栈操作,虽然办法笨,执行效率不高,但因为梯形图语言简单易懂,且能避免重复入栈,可以很好地解决滤池反冲控制的调度问题。
下面以一个长度为6的堆栈为例简要说明堆栈的算法。程序共有5个参数:入栈脉冲、出栈脉冲、清零命令、入栈缓存、出栈缓存。
1、出栈算法:出栈脉冲到来——数据1 move 至出栈缓存——数据2 move 至数据1——以此类推直至数据6 move 至数据5,再将0 move 至数据6。
2、入栈算法:待入栈编号放入入栈缓存——入栈脉冲到来——判断数据1是否等于0或等于入栈缓存内容,如果等于0证明数据1即为栈底,将待入编号move给数据1;如果等于入栈缓存内容证明堆栈中已经有此编号,本次入栈属于重复入栈,仍将待入编号move给数据1。入栈缓存内容move至数据1后将0 move至入栈缓存。——与上一步相同判断数据2是否等于0或等于入栈缓存内容并执行相同操作直至数据6。
经入栈操作后如果是重复入栈会将本次入栈编号放置在原有编号位置,避免重复入栈;如果非重复入栈会将编号放置在栈底。
3、清零算法:清零命令到来——将0 move给所有数据。
以上算法均可以使用梯形图完成,且简单易懂,易于实现。