在工业自动化控制领域,单容液位控制是最基础也最具代表性的控制场景之一。我十年前刚入行时接触的第一个实战项目就是某化工厂的酸碱中和罐液位控制,用的正是S7-200+组态王这套经典组合。这么多年过去了,这套方案依然活跃在各类中小型工控现场,其稳定性和性价比经受住了时间考验。
这次要拆解的是某食品厂原料储罐的液位控制系统,核心需求很明确:
特别说明:S7-200的模拟量输入模块EM231需要设置DIP开关匹配信号类型,本例中设置为电流输入模式(开关1-3 OFF)
scl复制// 模拟量转换公式(STEP7-Micro/WIN)
// 实际液位值 = (AIW0 - 6400) / (32000 - 6400) * 2000 mm
采用模块化编程风格,主要功能块包括:
scl复制// FC1: 模拟量预处理
VAR_INPUT
RawValue : INT; // AIW原始值
END_VAR
VAR_OUTPUT
Filtered : REAL; // 滤波后工程值
END_VAR
// 移动平均滤波(5次采样)
Filtered := (RawValue + Last4Values[0] + Last4Values[1]
+ Last4Values[2] + Last4Values[3]) / 5.0;
// 更新历史值队列
Last4Values[3] := Last4Values[2];
Last4Values[2] := Last4Values[1];
Last4Values[1] := Last4Values[0];
Last4Values[0] := RawValue;
scl复制// 调用西门子标准PID功能块FB41
"PID_CONTROL"(
COM_RST := Manual_Mode, // 手动时复位PID
PV_IN := Actual_Level, // 过程变量(液位)
SP_INT := Setpoint, // 设定值
GAIN := 2.0, // 比例增益
TI := 30.0, // 积分时间(s)
TD := 5.0, // 微分时间(s)
LMN := Valve_Output); // 控制输出
ini复制[Alarm]
; 组态王报警设置文件片段
HighLevel=1800|液位超高报警|3|I0.1
LowLevel=200|液位低报警|2|I0.2
通过组态王的"报表模板"功能,可以设置:
| 现象 | 可能原因 | 解决方案 |
|---|---|---|
| 液位显示跳变 | 信号干扰 | 检查屏蔽线接地,AI模块加滤波 |
| PID振荡 | 参数过激 | 先设Ti=∞,Td=0,逐步调P |
| 通讯中断 | 波特率不匹配 | 确认PLC/组态王均为9.6kbps |
这套系统在某酱油发酵车间连续运行了7年,期间只更换过一次液位计的密封圈。最近回访时发现他们新增了Modbus TCP通讯接口,把数据接入了厂级MES系统,证明这个基础架构具有良好的扩展性。对于刚接触工控的新手,建议先用这套经典组合练手,把基础控制逻辑吃透后再接触更复杂的系统。