

近期在调试一套工业环境监控系统时,遇到了关于Modbus连接保持的问题。现场部署了一批网口温湿度变送器,PoE取电、Modbus TCP上云,同时利旧接入存量RS485探头,并开启了SNMP和UDP Trap服务。这次落地的是某市级档案馆的消毒净化一体机联动项目——设备不再只是"恒温恒湿机组+独立净化器"的简单叠加,而是一台集成了制冷/加热、加湿/除湿、紫外线消毒、等离子净化、PM2.5过滤、VOC催化分解六个功能模块的一体机。如何让这些模块在DA/T 42-2022规范约束下协调工作,同时避免功能互斥和能源浪费,这篇从联动逻辑设计、参数调优到实际运行数据完整拆解。
┌─────────────────────────────────────────────────────────────────┐
│ 消毒净化一体机功能模块 │
│ │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────────────────┐ │
│ │ 温控模块 │ │ 湿控模块 │ │ 消毒净化模块 │ │
│ │ · 压缩机 │ │ · 加湿器 │ │ · UV紫外线灯管(2×36W) │ │
│ │ · 电加热 │ │ · 除湿再热 │ │ · 等离子发生器 │ │
│ │ · 冷凝风机 │ │ · 转轮除湿 │ │ · PM2.5高效过滤(G4+H11)│ │
│ │ · 蒸发风机 │ │ · 加湿水泵 │ │ · 活性炭+VOC催化 │ │
│ └─────────────┘ └─────────────┘ │ · 臭氧浓度监测 │ │
│ └─────────────────────────┘ │
│ │
│ 控制约束: │
│ · UV消毒时人员禁止进入(门磁联锁) │
│ · 等离子+臭氧监测联动(臭氧>0.1ppm自动关闭等离子) │
│ · 除湿与加湿互斥(同一时段只能激活一个) │
│ · 压缩机启动间隔≥3min(防液击) │
│ · 消毒模式与恒温恒湿模式可并行,但有优先级 │
└─────────────────────────────────────────────────────────────────┘地址 | 功能模块 | 描述 | 类型 | 读写 | 量程/精度 |
|---|---|---|---|---|---|
40001 | 监测 | 回风温度 | int16 | RO | ×0.01℃ |
40002 | 监测 | 回风湿度 | uint16 | RO | ×0.1%RH |
40003 | 监测 | PM2.5浓度 | uint16 | RO | μg/m³ |
40004 | 监测 | VOC浓度 | uint16 | RO | ppb |
40005 | 监测 | 臭氧浓度 | uint16 | RO | ×0.001ppm |
40006 | 监测 | 过滤器压差 | uint16 | RO | Pa |
42001 | 控制 | 压缩机启停 | bool | RW | 0=停/1=启 |
42002 | 控制 | 加热功率 | uint16 | RW | 0~1000(0~100%) |
42003 | 控制 | 加湿量 | uint16 | RW | 0~1000 |
42004 | 控制 | 除湿转轮转速 | uint16 | RW | 0~3000rpm |
42005 | 控制 | UV消毒使能 | bool | RW | 0=关/1=开 |
42006 | 控制 | 等离子使能 | bool | RW | 0=关/1=开 |
42007 | 控制 | 风机频率 | uint16 | RW | 0~500(Hz×10) |
42008 | 控制 | 工作模式 | uint16 | RW | 0=待机/1=恒温恒湿/2=消毒/3=净化/4=自动 |
42009 | 控制 | 门磁状态反馈 | bool | RO | 0=关/1=开 |
42010 | 控制 | 急停状态 | bool | RO | 0=正常/1=急停 |
42011 | 控制 | 消毒累计时间 | uint32 | RO | 小时 |
42012 | 控制 | 过滤器寿命 | uint16 | RO | % |
┌─────────────────────────────────────────────────────────────────┐
│ 工作模式状态机 │
│ │
│ ┌────────┐ ┌────────┐ ┌────────┐ ┌────────┐ │
│ │ 待机 │───►│ 恒温 │◄──►│ 消毒 │ │ 净化 │ │
│ │ (0) │ │ 恒湿 │ │ (2) │ │ (3) │ │
│ └────────┘ │ (1) │ └────────┘ └────────┘ │
│ ▲ └───┬───┘ │ │ │
│ │ │ │ │ │
│ └────────────┴──────────────┴──────────────┘ │
│ │ │
│ ┌────▼────┐ │
│ │ 自动 │ │
│ │ (4) │ │
│ └─────────┘ │
│ │
│ 优先级(高→低): │
│ 急停 > 待机 > 消毒(需门禁确认) > 恒温恒湿 > 净化 > 自动 │
│ │
│ 模式切换约束: │
│ · 消毒模式:门磁必须关闭 + 人员检测为0 + 臭氧<0.08ppm │
│ · 恒温恒湿模式:压缩机启动间隔≥3min │
│ · 净化模式:可与恒温恒湿并行运行 │
│ · 自动模式:根据时间计划+传感器阈值自动切换 │
└─────────────────────────────────────────────────────────────────┘温度控制回路:
回风温度 > 设定值 + 0.5℃ → 启动压缩机 → 调节膨胀阀开度
回风温度 < 设定值 - 0.5℃ → 启动电加热 → PID调节加热功率
回风温度 ∈ [设定值±0.5℃] → 维持当前输出(死区)
湿度控制回路:
回风湿度 > 设定值 + 3%RH → 启动转轮除湿 → PID调节转速
回风湿度 < 设定值 - 3%RH → 启动加湿器 → PID调节加湿量
回风湿度 ∈ [设定值±3%RH] → 维持当前输出(死区)
互斥保护:
除湿运行时 → 禁止加湿(硬件+软件双重联锁)
加湿运行时 → 禁止除湿
压缩机运行时 → 电加热限功率<30%(防冷热对冲)
风机联动:
任一执行器激活 → 风机自动启动(最低30Hz)
全部执行器关闭 → 延时5min后风机降频停机消毒模式触发条件(满足全部):
① 门磁状态 = 关闭
② 人员检测传感器 = 无人
③ 臭氧浓度 < 0.08ppm
④ 不在恒温恒湿高负载时段(压缩机未全速运行)
消毒执行序列:
T+0s → 关闭新风阀,切换内循环模式
T+10s → 风机提速至45Hz(确保气流均匀)
T+30s → UV紫外线灯管点亮(预热1min达到额定强度)
T+90s → 等离子发生器启动
T+持续 → 每5min检测臭氧浓度,>0.1ppm则关闭等离子
T+设定时间(默认120min) → 关闭UV和等离子
T+延时5min → 风机降频,恢复新风阀
净化模式(可与恒温恒湿并行):
PM2.5 > 75μg/m³ → 提升风机频率 + 确认过滤器未饱和
VOC > 500ppb → 激活活性炭+VOC催化模块
PM2.5 < 35且VOC < 200 → 恢复标准风量
过滤器维护联动:
压差 > 250Pa → 报警"过滤器堵塞"
寿命 < 10% → 报警"请更换过滤器"┌─────────────────────────────────────────────────────────────────┐
│ 自动模式日计划(可配置) │
├──────┬──────────┬───────────────────────────────────────────────┤
│ 时段 │ 模式 │ 说明 │
├──────┼──────────┼───────────────────────────────────────────────┤
│ 00:00│ 恒温恒湿 │ 夜间无人,维持18±1℃/50±5%RH │
│ │ +净化 │ 风机35Hz,PM2.5/VOC监控 │
├──────┼──────────┼───────────────────────────────────────────────┤
│ 06:00│ 恒温恒湿 │ 工作人员到岗前1小时,预冷/预热 │
│ │ (无消毒) │ 确保环境达标 │
├──────┼──────────┼───────────────────────────────────────────────┤
│ 08:00│ 恒温恒湿 │ 工作时间,正常调控 │
│ │ +净化 │ 人员活动产生VOC,持续净化 │
├──────┼──────────┼───────────────────────────────────────────────┤
│ 12:00│ 消毒模式 │ 午休时段(约1.5小时),人员离开后启动 │
│ │ +内循环 │ UV+等离子,消毒完成后自动恢复恒温恒湿 │
├──────┼──────────┼───────────────────────────────────────────────┤
│ 18:00│ 恒温恒湿 │ 下班后恢复夜间模式 │
│ │ +净化 │ 风机降频至30Hz │
├──────┼──────────┼───────────────────────────────────────────────┤
│ 22:00│ 消毒模式 │ 夜间深度消毒(2小时),无人状态 │
│ │ +内循环 │ 完成后恢复恒温恒湿待机 │
└──────┴──────────┴───────────────────────────────────────────────┘初始参数照搬了上一章恒温恒湿机组的整定值,但实际运行出现以下问题:
问题 | 现象 | 原因 |
|---|---|---|
温度振荡 | ±1.2℃波动 | Kp过大,一体机风量小、热惯性更大 |
湿度超调 | 从45%→55%需40min,过冲到58% | Ki过大,积分累积过多 |
除湿/加湿频繁切换 | 每10min切换一次 | 死区太小,未考虑传感器噪声 |
UV消毒时温度漂移 | 消毒期间温度上升0.8℃ | UV灯管发热未补偿 |
第一轮:降低Kp,增大死区
温度PID:Kp 2.0 → 1.2,死区 ±0.5℃ → ±0.8℃
湿度PID:Kp 1.5 → 0.8,死区 ±3%RH → ±5%RH
结果:振荡消除,但响应变慢(温度恢复需45min)第二轮:调整Ki/Kd比例,引入前馈
温度PID:Kp=1.2, Ki=0.02(↓), Kd=8.0(↑)
湿度PID:Kp=0.8, Ki=0.03(↓), Kd=3.0(↑)
增加前馈补偿:当设定值变化时,直接输出10%开度持续2min
结果:恢复时间缩短至25min,过冲<0.3℃第三轮:消毒热补偿 + 输出限幅优化
UV热补偿:检测UV开启状态,温度设定值自动-0.5℃补偿
输出变化率限制:单次变化≤5%(防止执行器频繁动作)
除湿/加湿切换延时:≥10min(防止振荡)
结果:稳定运行,各项指标达标回路 | Kp | Ki | Kd | 死区 | 采样周期 | 输出限幅 | 备注 |
|---|---|---|---|---|---|---|---|
温度 | 1.2 | 0.02 | 8.0 | ±0.8℃ | 30s | 0~100% | UV热补偿-0.5℃ |
湿度 | 0.8 | 0.03 | 3.0 | ±5%RH | 30s | 0~100% | 切换延时10min |
冷水阀 | 0.8 | 0.01 | 1.0 | - | 10s | 0~100% | 变化率≤5%/次 |
风机 | 0.3 | 0.005 | 0.5 | - | 60s | 30~50Hz | 最低30Hz |
class HVACPurifierPID:
"""一体机PID控制(含消毒热补偿)"""
def __init__(self):
self.temp_pid = PIDController(
params=PIDParams(Kp=1.2, Ki=0.02, Kd=8.0,
output_min=0.0, output_max=1000.0,
deadband=0.8, sample_time=30.0),
output_cb=self._set_cool_heat_output
)
self.hum_pid = PIDController(
params=PIDParams(Kp=0.8, Ki=0.03, Kd=3.0,
output_min=0.0, output_max=1000.0,
deadband=5.0, sample_time=30.0),
output_cb=self._set_hum_output
)
self.uv_active = False
self.last_hum_output_type = None # 'humidify' or 'dehumidify'
self.last_switch_time = 0
def _get_temp_setpoint(self):
"""获取温度设定值(含UV热补偿)"""
sp = get_setpoint("temperature") # 18.0
if self.uv_active:
sp -= 0.5 # UV灯管发热补偿
return sp
def _set_cool_heat_output(self, output):
"""冷水阀/加热输出(互斥)"""
if output > 500:
# 制冷
write_modbus_register(42001, 1) # 压缩机启动
write_modbus_register(42002, 0) # 加热关闭
write_modbus_register(42004, int((output - 500) * 2)) # 除湿转轮
else:
# 加热
write_modbus_register(42001, 0) # 压缩机关闭
write_modbus_register(42002, int(output * 2)) # 加热功率
write_modbus_register(42004, 0) # 除湿关闭
def _set_hum_output(self, output):
"""加湿/除湿输出(互斥+切换延时)"""
now = time.time()
if output > 500:
# 加湿
if self.last_hum_output_type == 'dehumidify':
if now - self.last_switch_time < 600: # 10min切换延时
return # 禁止切换
write_modbus_register(42003, int((output - 500) * 2))
write_modbus_register(42004, 0)
self.last_hum_output_type = 'humidify'
self.last_switch_time = now
else:
# 除湿
if self.last_hum_output_type == 'humidify':
if now - self.last_switch_time < 600:
return
write_modbus_register(42003, 0)
write_modbus_register(42004, int(output * 2))
self.last_hum_output_type = 'dehumidify'
self.last_switch_time = now
def control_loop(self):
"""主控制循环"""
while True:
# 读取状态
temp = read_modbus_register(40001) * 0.01
hum = read_modbus_register(40002) * 0.1
self.uv_active = read_modbus_coil(42005)
door_status = read_modbus_coil(42009)
emergency = read_modbus_coil(42010)
# 安全联锁
if emergency:
self._emergency_stop()
time.sleep(5)
continue
# 模式判断
mode = read_modbus_register(42008)
if mode == 0: # 待机
self._standby()
elif mode == 1: # 恒温恒湿
sp = self._get_temp_setpoint()
self.temp_pid.update(sp, temp)
self.hum_pid.update(get_setpoint("humidity"), hum)
elif mode == 2: # 消毒
if door_status:
write_modbus_coil(42005, False) # 门开则关闭UV
# 消毒期间温度维持
self.temp_pid.update(self._get_temp_setpoint(), temp)
elif mode == 3: # 净化
self._purify_mode(temp, hum)
elif mode == 4: # 自动
self._auto_mode(temp, hum)
time.sleep(1.0)
def _purify_mode(self, temp, hum):
"""净化模式"""
pm25 = read_modbus_register(40003)
voc = read_modbus_register(40004)
if pm25 > 75 or voc > 500:
write_modbus_register(42007, 450) # 风机45Hz
else:
write_modbus_register(42007, 350) # 风机35Hz
# 并行恒温恒湿
self.temp_pid.update(self._get_temp_setpoint(), temp)
self.hum_pid.update(get_setpoint("humidity"), hum)
def _auto_mode(self, temp, hum):
"""自动模式(根据时间计划切换)"""
hour = datetime.now().hour
minute = datetime.now().minute
# 消毒时段:12:00~13:30 和 22:00~00:00
if (hour == 12) or (hour == 22) or (hour == 23):
if not read_modbus_coil(42009): # 门关闭
write_modbus_register(42008, 2) # 切换到消毒模式
else:
write_modbus_register(42008, 1) # 恒温恒湿模式
self.temp_pid.update(self._get_temp_setpoint(), temp)
self.hum_pid.update(get_setpoint("humidity"), hum)
def _emergency_stop(self):
"""急停"""
for addr in [42001, 42002, 42003, 42004, 42005, 42006]:
write_modbus_register(addr, 0)
write_modbus_register(42007, 0)
self.temp_pid.set_enabled(False)
self.hum_pid.set_enabled(False)
def _standby(self):
"""待机"""
write_modbus_register(42001, 0)
write_modbus_register(42002, 0)
write_modbus_register(42003, 0)
write_modbus_register(42004, 0)
write_modbus_register(42005, 0)
write_modbus_register(42006, 0)
write_modbus_register(42007, 300) # 风机最低转速┌─────────────────────────────────────────────────────────────────┐
│ 消毒安全联锁 │
├─────────────────────────────────────────────────────────────────┤
│ 条件 │ 动作 │ 优先级 │
├────────────────────────────┼────────────────────────┼──────────┤
│ 门磁打开 │ 立即关闭UV+等离子 │ 最高 │
│ 臭氧>0.1ppm │ 关闭等离子,UV保持 │ 高 │
│ 臭氧>0.15ppm │ 关闭UV+等离子+停机 │ 最高 │
│ 人员检测>0 │ 禁止启动消毒 │ 高 │
│ 过滤器压差>300Pa │ 降频运行,报警 │ 中 │
│ 消毒累计时间>8000h │ UV灯管寿命报警 │ 低 │
│ 通信中断>3次 │ 保持当前状态,报警 │ 中 │
│ 急停按钮 │ 全部关闭 │ 最高 │
└────────────────────────────┴────────────────────────┴──────────┘def ozone_safety_monitor():
"""臭氧安全监控(独立线程,高频检测)"""
while True:
ozone_ppm = read_modbus_register(40005) * 0.001
if ozone_ppm > 0.15:
# 危险级别:关闭所有消毒设备
write_modbus_coil(42005, False) # UV关闭
write_modbus_coil(42006, False) # 等离子关闭
write_modbus_register(42007, 0) # 风机停机
trigger_alarm("OZONE_DANGER", f"臭氧浓度{ozone_ppm}ppm,已紧急停机")
elif ozone_ppm > 0.1:
# 警告级别:关闭等离子
write_modbus_coil(42006, False)
trigger_alarm("OZONE_WARNING", f"臭氧浓度{ozone_ppm}ppm,已关闭等离子")
time.sleep(2.0) # 2秒检测一次指标 | DA/T 42-2022 | 调优前 | 调优后 |
|---|---|---|---|
温度控制精度 | 14~24℃ | ±1.2℃ | ±0.4℃ |
湿度控制精度 | 45~60%RH | ±8%RH | ±2.5%RH |
恢复时间(±2℃扰动) | - | 45min | 22min |
过冲量 | - | 1.2℃/8%RH | 0.2℃/2.5%RH |
除湿/加湿切换频率 | - | 6次/小时 | 0次/小时 |
指标 | 标准 | 实测 |
|---|---|---|
UV照射强度(1m处) | ≥70μW/cm² | 85μW/cm² |
消毒120min后空气菌落 | ≤200 CFU/m³ | 45 CFU/m³ |
PM2.5过滤效率 | ≥95% | 99.2% |
VOC去除率(2h) | ≥80% | 87% |
臭氧安全 | <0.1ppm | 峰值0.06ppm |
消毒模式切换安全性 | 无泄漏 | 门磁触发<0.5s关闭 |
┌─────────────────────────────────────────────────────────────────┐
│ 30天连续运行统计(一体机#1,特藏库A) │
├─────────────────────────────────────────────────────────────────┤
│ 温度:均值18.0℃,偏差范围+0.4/-0.5℃,标准差0.15℃ │
│ 湿度:均值50.1%RH,偏差范围+2.4/-2.8%RH,标准差1.0%RH │
│ 消毒执行:每日2次,累计60次,成功率100% │
│ UV累计运行:120小时(灯管寿命剩余92%) │
│ 过滤器压差:当前85Pa(寿命剩余78%) │
│ 臭氧超限次数:0次 │
│ 急停触发:0次 │
│ 通信中断:3次(均<15s自动恢复) │
│ 系统可用性:99.97% │
└─────────────────────────────────────────────────────────────────┘档案库房、消毒净化一体机、恒温恒湿、联动控制、PID调优、UV消毒、等离子净化、臭氧安全、Modbus、门磁联锁、DA/T 42-2022、PM2.5、VOC、过滤器寿命、自动模式
消毒净化一体机的联动控制难点在于"多模块功能互斥与优先级仲裁"——通过状态机明确模式切换约束(门磁、人员、臭氧三重安全联锁),PID参数针对一体机大惯性特征保守整定并引入UV热补偿,除湿/加湿切换延时与输出变化率限制消除振荡,最终在DA/T 42-2022规范下实现恒温恒湿与消毒净化的安全并行与自动调度。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。