发布于 2016-11-11 17:16:16
16楼
这种水泵按需投入的帖子很多的吧?搜索一下就有现成的例子了。
思路不算复杂,只是比较太啰嗦。
S7-300的话,用高级点的编程方式呗。
a.每个电机用一个结构来保存(状态字(运行、故障、待机、二次开延时、远程开、远程关、停用)、控制字(开机、关机、未控制)、总运行时间、当次运行时间、运行反馈延时、二次开时间)、为所有电机建立一个结构数组;
b.定义两个队列用来存储增、减泵顺序;
c.定义几个变量用来存储需 总可用数量、要投入数量、当前投入数量、定时轮换时间。
程序逻辑大概如下。
1.每个程序周期执行:
a.分别获取泵状态放到对应的电机结构[状态字]中;
b.根据实际DI输入以及[状态字]本身判断是否需要停对应的泵,并根据实际情况维护泵结构数据([控制字]改为未控制、[当次运行时间]清零);
c.根据[控制字]判断是否需要开对应的泵,且维护[状态字][控制字];
d.获取[总可用数量](待机状态)、计算[需投入数量](水位开关)、[当前投入数量](运行状态、远程开);
e.把所有[待机]状态的泵的[总运行时间]按小到大排序放到[增泵序列];
f.把所有正在[运行状]态的泵的[当次运行时间]按大到小排序放到[减泵序列];
2.每秒周期执行:
a.增泵(故障轮换、远程关、水位增高影响):[总可用数量] > 1,且[当前投入数量] < [需要投入数量],则把[增泵序列]中第一个泵[控制字]设置为开机,且把[运行反馈延时]设置为需要的运行反馈延时时间;
b.减泵(远程开、水位降低影响):[当前投入数量] > [需要投入数量],则把[减泵序列]中第一个泵[控制字]设置为关机,同时把[状态字]设置为[二次开延时]且把[二次开时间]设置为需要的延时时间;
c.维护运行时间:根据[状态字]是否需要维护四个运行时间[总运行时间]+1、[当次运行时间]+1、[运行反馈延时]-1;[二次开时间]-1;当[运行反馈延时]<=0时则把[状态字]改为停用;当[二次开延时]<=0时则把[状态字]改为待机;
d.定时轮换:判断每个泵的[当次运行时间]是否大于[定时轮换时间],且[总可用数量] > 1,则把[增泵序列]中第一个泵[控制字]设置为开机;
如果想更人性化一点,可以增加增泵、减泵延时时间周期来执行2a、2b两项。
手打了那么多,有点头晕了。如有错误请见谅。这个逻辑在其他品牌PLC上用过是正常使用的。