系统稳定运行3年多。不时还有朋友咨询。就朋友们问的问题做个总结。
- 为什么程序里阀门开度是5%?答:这是厂家阀门的特征决定的。他们的阀门5%开度以下没法控制,并且时间观察下来,最新开度设到8%左右更加合理。
- 快调和慢调范围怎么确定?其实这个要根据实际情况来,这个跟进水和出水都有关联,系统运行1个月左右,就可以得出经验值了。主要目的是为了不对水管造成冲击,不仅仅是为了实际水位很准确。
- 数据采集是自己写的。网关应用之加压站监控
网关应用之 多协议转MQTT 以下是以前内容: S7-SCL 模糊阀门控制
用于水厂进水阀门控制
代码语言:javascript复制//1分钟脉冲
#T1(IN := #T2.Q,
PT := T#30s,
Q => #T1_state,
ET => #T1_TIME);
#T2(IN :=NOT #T1.Q,
PT := T#30S,
Q => #T2_STATE,
ET => #T2_Time);
#MinTrig(CLK:=#T1.Q,Q=>#"1minP"
);
//调节范围计算
#DownFast := #水位设定值 * (1.0 REAL#0.03); //相当于HiHi;现在用不着
#DownSlow := #水位设定值 * (1.0 REAL#0.02); //相当于Hi;到达就关阀
//#水位设定值
IF #水位设定值 * #微调范围 < 0.05 THEN //主要是避免死区太小,阀门频繁开闭
#UpSlow := #水位设定值 - 0.05; //相当于设定值是2米以下
ELSE
#UpSlow := #水位设定值 * (1.0 - #微调范围); //初始值是0.05
END_IF;
IF #水位设定值 * #快调范围 < 0.1 THEN //主要是避免调节区范围太小,阀门频繁开闭
#UpFast := #水位设定值 - 0.1; //
ELSE
#UpFast := #水位设定值 * (1.0 - #快调范围); //初始值是0.15
END_IF;
//模拟调试
IF #ModSim THEN
#水位值 := #水位模拟值;
ELSE
#水位值 := #水位实际值;
END_IF;
//清水阀 --- 自动开度 现场使用的比例阀,0--5%之间无法调节
REGION 阀门正常调节
IF #"1minP" AND #ManAutoModel THEN
IF #水位值 < #UpFast THEN //此区间阀门快速打开
IF #Q调节阀给定<0.7*#调节阀自动开度极限 THEN
#Q调节阀给定 := 0.7*#调节阀自动开度极限;
ELSE
#Q调节阀给定 := #Q调节阀给定 #快调值;
END_IF;
ELSIF #水位值 >= #UpFast AND #水位值 < #UpSlow THEN //慢速调整阀门开度
IF #Q调节阀给定 > 5 THEN //如果阀门本来就是打开就慢慢关闭到5%
#Q调节阀给定 := #Q调节阀给定-#慢调值;
ELSE //如果阀门本来是关闭就直接打开到5%<主要是从高水位降到低水位时>
#Q调节阀给定 := 5;
END_IF;
ELSIF #水位值 >= #UpSlow AND #水位值 <= #DownSlow THEN //此区间相当于死区;尽量保证阀门不动作;阀门开度为5%或者0
IF #Q调节阀给定 > 5 THEN
#Q调节阀给定 := 5; //2021优化,到达死区.如果阀门本来是打开状态就调整到阀门最小开度5%
END_IF;
ELSIF #水位值 > #DownSlow THEN
#Q调节阀给定 := 0.0;//2021年优化;超过就DownSlow就直接关阀<现场阀门关不死,打开全关之后水位一个小时还是会上升0.4米左右>
//并且现场的水位计超过3M,性能也不是很稳定
END_IF;
END_IF;
END_REGION
REGION 极端情况--自动状态下
IF #Q调节阀给定 < 5.0 AND #Q调节阀给定 > 0.0 THEN //需要打开阀门时,开度最小是5%
#Q调节阀给定 := 5.0; //开阀门时最少为5%,否则阀门会打不开,阀门会报警锁定.
END_IF;
IF #Q调节阀给定> #调节阀自动开度极限 OR #水位值<=#LOLO THEN //保证最大开度在范围内;保证LOLO时,快速打开阀门
#Q调节阀给定 := #调节阀自动开度极限;
END_IF;
END_REGION
//清水阀手动设定开度 把手动调整到自动之后.
IF NOT #ManAutoModel THEN
#Q调节阀给定 := #ManulOpenDegree;
END_IF;
//水位过高,直接关阀;避免满池子.
IF #水位值 >= #HIHI OR #Q调节阀给定 <= 0.0 THEN
#Q调节阀给定 := 0.0;
END_IF;
上面是WinFrm版本。下面是B/S版本