发布于 2016-10-30 12:42:13
5楼
就实际使用的情况来说,我不建议你不要单单用运行累计来判断优先权。最好的方法还是传统的按顺序轮询启停,然后再定时轮换。
说起来简单但程序逻辑也比较啰嗦,顺序大概如下:
1、建立三个全局数组,数组1存储可用泵的编号按启动优先权排列(比如数组1[0]为下次要开的泵,数组1[1]为下下次开的泵);数组2存储当次泵运行时间累计按[0~7]对应泵1到8,用来判断泵当次运行时间是否超过设定的定时轮换时间从而停最长当次运行时间的泵;数组3存储泵休息时间用来放置频繁开泵;数组4存储泵总运行时间用来做为工人定期维护参考。
2、维护数组1。每个程序周期开始时把有故障、正在运行、手动模式、休息中的泵编号从数组1中清零,跟着把后面的所有可用泵序号往前移1位覆盖掉刚才清零的序号,接着把没有问题可用的泵序号放到数组末尾就完成数组1可用泵按启动顺序排序了(简单来说数组1就是个可以自动维护的队列,先入列的泵序号最先输出来启动)。
3、维护数组2、3。每个程序周期把数组2中正在运行泵当次运行时间+1,把停止的泵运行时间清零。每个泵停止下降沿把数组3中对应泵信息时间重置为最大设定时间,停止后开始每秒周期判断如果大于0则-1。
4、每个增减泵周期(建议每5秒为一个周期)判断是否增减泵投入。根据实际与设定压力PID结果判断、根据当次左右时间是否超过定时轮换时间判断是要增加泵还是减少泵投入。a.如果要增加泵则先判断数组1是否还有可用的泵,如果有则拿出最上面的泵出来开起来但需延时后才输出,如果没有则方式本次判断不增也不减泵。b.如果减泵同理先判断数组1中有无可用泵,没有则不减泵,如果还有则先开泵延时几秒后再停掉当前运行时间最长的泵。
5、一些小处理。连续开泵信号给出后延时2秒再开不能太大也不能太长;每个泵停止后尽量需要30~300秒休息时间;定时判断标志5秒比较适合,可以用定时中断,可以用时间减,如果要求不高也可以用定时器,也可以考虑用时钟(必须判断秒一直不动时赋初始值让时钟跑起来)。至于定时轮换时间就看现场情况了。原则上所有设定值都要考虑上下限防止用户乱设导致各种预想不到的后果。