一、系统背景
医院污水消毒是阻断病原微生物传播的关键环节。GB 18466-2005要求排放口总余氯控制在0.5-1.5mg/L(综合医院直排标准),范围窄、要求高。传统人工检测和投加方式存在余氯波动大、药剂浪费、夜间失控等问题。本文设计一套基于边缘控制器(IntBoxIO)的余氯闭环控制系统,实现余氯自动控制和远程监控。
二、系统架构
┌─────────────────────────────────────┐
│ 云平台/手机小程序 │
│ MQTT over TLS │ 报警推送 │
└──────────────┬──────────────────────┘
│ 4G
┌──────────────┴──────────────────────┐
│ 边缘控制器(IntBoxIO) │
│ Modbus采集 │ PID运算 │ 逻辑控制 │
│ 本地存储 │ 断网续传 │ 报警判断 │
└──┬──────────┬──────────┬────────────┘
│RS485 │4-20mA │继电器
┌──┴──┐ ┌───┴───┐ ┌───┴────┐
│余氯仪│ │流量计 │ │加氯泵 │
│pH │ │液位计 │ │风机水泵│
└─────┘ └───────┘ └────────┘
三、硬件选型
• 边缘控制器:1×RS485,4G,7-36VDC,-35~75℃
• 余氯仪:恒电压法,4-20mA输出,量程0-2mg/L,精度±0.05mg/L
• 流量计:电磁流量计,Modbus RTU输出
• 加氯泵:电磁隔膜计量泵,支持4-20mA或脉冲控制
• pH计:复合电极,4-20mA输出
四、控制算法设计
采用前馈+反馈复合控制:
class ChlorineControl:
def init(self):
# PID参数
self.kp = 0.3
self.ki = 0.05
self.kd = 0.01
self.integral = 0
self.last_error = 0

    # 前馈参数
    self.dose_ratio = 30.0  # 单位投加量 g/m³
    self.max_dose = 500.0   # 最大投加量 g/h
    self.min_dose = 10.0    # 最小投加量 g/h
    
    # 余氯设定
    self.setpoint = 1.0     # 目标余氯 mg/L
    self.deadband = 0.1     # 死区 mg/L
    
    # 报警限
    self.low_alarm = 0.5
    self.high_alarm = 1.5
    
def calculate(self, flow, chlorine, dt=30):
    """
    前馈+反馈计算加氯量
    flow: 进水流量 m³/h
    chlorine: 实测余氯 mg/L
    dt: 控制周期 秒
    """
    # 前馈:按流量比例计算基础投加量
    feedforward = flow * self.dose_ratio
    
    # 反馈:PID修正
    error = self.setpoint - chlorine
    
    if abs(error) < self.deadband:
        # 在死区内,只保持前馈
        self.integral *= 0.95  # 积分衰减
        feedback = self.kp * error + self.integral * self.ki
    else:
        self.integral += error * dt
        self.integral = max(-100, min(100, self.integral))  # 积分限幅
        derivative = (error - self.last_error) / dt
        feedback = (self.kp * error + 
                   self.ki * self.integral + 
                   self.kd * derivative)
    
    self.last_error = error
    
    # 合成输出
    output = feedforward + feedback
    output = max(self.min_dose, min(self.max_dose, output))
    
    return output

def check_alarm(self, chlorine, pump_status):
    """报警判断"""
    alarms = []
    if chlorine < self.low_alarm:
        alarms.append("余氯过低")
    if chlorine > self.high_alarm:
        alarms.append("余氯过高")
    if chlorine < 0.1 and pump_status:
        alarms.append("余氯为零,加氯系统故障")
    return alarms

五、边缘控制器主程序
import minimalmodbus
import time
import json
import paho.mqtt.client as mqtt

class HospitalSewageController:
def init(self):
self.chlorine_ctrl = ChlorineControl()
self.setup_modbus()
self.setup_mqtt()
self.data_buffer = []

def setup_modbus(self):
    # 余氯仪 RS485
    self.chlorine_meter = minimalmodbus.Instrument('/dev/ttyS1', 1)
    self.chlorine_meter.serial.baudrate = 9600
    # 流量计
    self.flow_meter = minimalmodbus.Instrument('/dev/ttyS1', 2)
    
def setup_mqtt(self):
    self.mqtt = mqtt.Client()
    self.mqtt.username_pw_set("device_id", "secret")
    self.mqtt.connect("cloud.example.com", 1883)
    self.mqtt.loop_start()
    
def read_sensors(self):
    """读取传感器数据"""
    try:
        chlorine = self.chlorine_meter.read_register(0, 2) * 0.01  # mg/L
        flow = self.flow_meter.read_register(0, 1) * 0.1  # m³/h
        ph = self.chlorine_meter.read_register(2, 2) * 0.01
        return {"chlorine": chlorine, "flow": flow, "ph": ph}
    except Exception as e:
        print(f"传感器读取失败: {e}")
        return None
        
def control_dose_pump(self, dose_gph):
    """控制加氯泵(4-20mA对应0-500g/h)"""
    ma = 4.0 + (dose_gph / 500.0) * 16.0
    ma = max(4.0, min(20.0, ma))
    # 通过DA模块输出4-20mA
    self.write_analog(0, int((ma - 4) / 16 * 4095))
    
def run(self):
    while True:
        data = self.read_sensors()
        if data:
            # 计算加氯量
            dose = self.chlorine_ctrl.calculate(
                data["flow"], data["chlorine"])
            self.control_dose_pump(dose)
            
            # 报警检查
            alarms = self.chlorine_ctrl.check_alarm(
                data["chlorine"], pump_status=True)
            
            # 本地存储
            record = {
                "ts": int(time.time()),
                **data,
                "dose": dose,
                "alarms": alarms
            }
            self.data_buffer.append(record)
            
            # MQTT上传
            self.mqtt.publish(
                "hospital/sewage/realtime",
                json.dumps(record), qos=1)
            
            # 报警立即推送
            for alarm in alarms:
                self.mqtt.publish(
                    "hospital/sewage/alarm",
                    json.dumps({"alarm": alarm, **record}),
                    qos=2)
        
        time.sleep(30)  # 30秒控制周期

if name == “main”:
controller = HospitalSewageController()
controller.run()
六、可靠性设计

  1. 看门狗: 边缘控制器(IntBoxIO)内置硬件看门狗,程序异常时自动重启
  2. 断网续传: 网络中断时数据存入本地SQLite,恢复后自动补传
  3. 传感器故障容错: 余氯仪通信故障时,自动切换到流量比例控制模式
  4. 备用泵切换: 加氯泵故障(无电流反馈)时自动启动备用泵
  5. 应急模式: 远程下发应急指令,加氯量提升至正常值2倍
    七、应用效果
    在广东某综合医院(300床,200m³/d)部署后:
    • 余氯合格率从68%提升至97%
    • 次氯酸钠用量从月均150kg降至95kg,节省37%
    • 未发生环保超标事件
    • 后勤巡检从每天2次减至每2天1次
    八、总结
    本系统基于边缘计算实现医院污水余氯闭环控制,前馈+反馈复合算法保证了余氯稳定,边缘侧独立运行确保了断网安全,MQTT上云实现了远程监控和报警。系统架构简洁、成本可控,适合在各级医疗机构推广。

更多推荐