自动水位控制程序的编写需遵循 “信号采集→逻辑判断→指令输出→故障保护” 的闭环逻辑,结合 Modbus 通讯与液位调节规则,实现水泵的精准控制。以下是分层级的编写思路,从核心框架到细节实现,兼顾 “启停控制” 和 “PID 变频控制” 两种场景。
一、程序整体框架(模块化设计)
为提高程序可读性和维护性,采用模块化拆分,将不同功能分配到不同组织块(OB)和功能块(FB/FC),核心框架如下:
| 组织块 / 功能块 | 作用 | 核心内容 |
|---|---|---|
| OB1(主循环) | 总入口 | 调用各功能块,执行核心逻辑(100ms 周期) |
| FC100(AI 采集与标度转换) | 信号预处理 | 读取液位传感器模拟量,转换为实际水位值 |
| FC101(控制逻辑判断) | 核心决策 | 启停控制 / PID 调节,输出水泵运行指令和频率 |
| FC102(Modbus 通讯) | 指令下发 / 状态读取 | 调用 MB_CLIENT,向 ACS510 写控制字 / 频率,读故障状态 |
| FC103(故障检测与保护) | 安全保障 | 传感器故障、变频器故障检测,触发停机 / 报警 |
| OB82(诊断中断) | 硬件故障处理 | AI 模块故障、通讯模块故障的紧急停机 |
二、核心步骤拆解(从基础到进阶)
步骤 1:信号采集与预处理(FC100)
核心目标:将传感器的 4-20mA 模拟量信号,转换为直观的 “实际水位值”,并做滤波处理避免干扰。
编写思路:
伪代码示例:
plaintext
// 1. 读取 AI 原始值 AI_Raw := "SM1231 AI".AI0; // 2. 标度转换 IF AI_Raw < 5530 THEN // 传感器断线 Water_Level := 0.0; Sensor_Fault := TRUE; ELSIF AI_Raw > 27648 THEN // 传感器短路 Water_Level := 5.0; Sensor_Fault := TRUE; ELSE Water_Level := (AI_Raw - 5530) / 22118.0 * 5.0; Sensor_Fault := FALSE; END_IF; // 3. 滑动滤波(保留最近5次值) Filter_Buffer[4] := Filter_Buffer[3]; Filter_Buffer[3] := Filter_Buffer[2]; Filter_Buffer[2] := Filter_Buffer[1]; Filter_Buffer[1] := Filter_Buffer[0]; Filter_Buffer[0] := Water_Level; Water_Level_Filtered := (Filter_Buffer[0]+Filter_Buffer[1]+Filter_Buffer[2]+Filter_Buffer[3]+Filter_Buffer[4])/5.0;
步骤 2:控制逻辑判断(FC101)
分 “基础启停控制” 和 “进阶 PID 变频控制” 两种逻辑,可通过手动 / 自动切换按钮选择模式。
子步骤 2.1:基础启停控制(适合小量程、低精度场景)
核心逻辑:基于高低水位阈值,输出 “水泵启停指令” 和 “固定频率”。编写思路:
子步骤 2.2:进阶 PID 变频控制(适合大范围、高精度场景)
核心逻辑:以 “目标水位” 为给定值,“滤波后水位” 为反馈值,通过 PID 调节输出水泵频率,精准稳定水位。编写思路:
步骤 3:Modbus 通讯指令输出(FC102)
核心目标:将 “水泵运行指令” 和 “频率给定值” 通过 Modbus RTU 写入 ACS510,同时读取变频器状态 / 故障,形成闭环。编写思路:
伪代码示例(写操作):
plaintext
// 边沿触发写指令 Pump_Run_Edge := R_TRIG(Pump_Run); // 上升沿检测 // 调用 MB_CLIENT 写指令 MB_CLIENT_REQ := Pump_Run_Edge; MB_CLIENT_ADDR := 1; MB_CLIENT_MODE := 1; MB_CLIENT_DATA_ADDR := 40001; MB_CLIENT_DATA_LEN := 2; MB_CLIENT_DATA_PTR := &VW200; MB_CLIENT_PORT := 1; // 赋值控制字和频率 IF Pump_Run THEN VW200 := 1; // 运行控制字 VW202 := Pump_Freq_Set; ELSE VW200 := 0; // 停止控制字 VW202 := 0; END_IF; // 通讯故障判断 IF MB_CLIENT_ERROR THEN Comm_Fault := TRUE; Pump_Run := 0; // 通讯故障时停机 END_IF;
步骤 4:故障检测与保护(FC103)
核心目标:识别传感器、变频器、通讯故障,触发停机和报警,保障系统安全。编写思路:
伪代码示例:
plaintext
// 故障汇总 Total_Fault := Sensor_Fault OR Drive_Fault OR Comm_Fault; // 故障停机 IF Total_Fault THEN Pump_Run := 0; Fault_Alarm := 1; // 记录故障时间(读取系统时钟) Fault_Time := GET_LOCAL_TIME(); ELSE // 故障消除后延时复位报警 Fault_Alarm_Delay := TON(Fault_Alarm_Delay, 5000); // 5s 延时 IF Fault_Alarm_Delay.Q THEN Fault_Alarm := 0; END_IF; END_IF;

