文章目录

加热/冷却双输出:如何用死区逻辑防止加热和冷却阀门同时动作

发布于 2026-03-20 19:57:51 · 浏览 3 次 · 评论 0 条

在温度控制系统中,加热与冷却双输出结构常见于精密恒温设备(如恒温箱、反应釜、洁净室空调系统)。若加热阀与冷却阀在控制信号重叠时同时开启,将导致能量对冲:热源与冷源直接对抗,不仅浪费能源、加剧设备磨损,还可能引发温度震荡、超调甚至失控。死区逻辑(Dead Band Logic) 是防止此类冲突的核心机制——它不依赖外部硬件互锁,而是通过软件策略在控制器内部为加热与冷却输出划定互斥区间。


一、为什么需要死区?先看一个典型失控场景

假设某恒温水浴槽设定温度为 37.0°C,当前实测温度为 36.8°C。PID控制器计算出的控制量为 +12%(正向偏差,需加热)。此时加热阀开度指令为 12%,冷却阀应为 0%

但若温度短暂波动至 37.1°C(如开门扰动),控制器输出可能变为 -8%(负向偏差,需冷却),冷却阀开度指令 8%,加热阀应关至 0%

问题在于:当温度在 36.95°C37.05°C 之间高频抖动时,PID输出会在 ±3% 区间反复穿越零点。若控制器未加死区,加热阀与冷却阀将在毫秒级内交替开关——一次抖动就可能触发“加热开→冷却开→加热关→冷却关”循环,造成阀门频繁动作、执行器过热、管道水锤、温度毛刺超 ±0.3°C。

死区的本质,是人为设置一段“无动作温度带”,让控制器在该带内不驱动任何输出,从而强制消除零点振荡。


二、死区逻辑的三种实现层级(按可靠性排序)

层级 实现位置 可靠性 维护难度 是否推荐
1. 控制器底层固件级 PLC/DCS 的 PID 功能块内部参数(如 Rockwell Logix 的 DEADBAND 参数、Siemens S7-1500 的 DB 输入) ★★★★★ ✅ 首选
2. 控制算法层(软件死区) 在 PID 输出后、输出分配前插入死区函数:if |output| < DB then output = 0 ★★★★☆ ✅ 推荐(通用性强)
3. 输出分配层(硬逻辑互锁) 分别判断加热/冷却需求,用 AND 门强制“加热使能 ∧ ¬冷却使能” ★★☆☆☆ 高(易漏判边界) ❌ 不推荐(治标不治本)

强烈推荐使用第2种方式:它完全解耦于具体硬件,可移植至任意支持自定义脚本的控制器(如 Codesys、Ignition、Node-RED),且便于调试与参数化。


三、死区宽度(DB)如何科学设定?三个硬约束

死区不是越大越好。过宽会导致温度静差增大、响应迟钝;过窄则无法抑制抖动。必须同时满足以下三个条件:

  1. 覆盖传感器噪声带宽
    若温度传感器精度为 ±0.1°C,采样周期为 1s,实测数据标准差为 0.07°C,则死区下限应 ≥ 2 × 0.07 = 0.14°C(取整 0.2°C)。

  2. 大于执行机构最小有效动作量
    气动调节阀的定位器通常有 0.5–1.0% 的不灵敏区。若阀门行程 0–100% 对应 0–100°C 温度变化,则 1% 行程 ≈ 1°C。但实际工程中,< 3% 开度常无法克服填料摩擦——因此死区对应的温度宽度应 ≥ 3% × 100°C = 3.0°C?错!这是典型误区。
    正确换算:需根据阀的流量特性与系统热容反推。例如:冷却水阀开度 5% 时,单位时间带走热量为 Q_5 = 0.2 kW;而系统热惯性时间常数 τ = 120 s。要使温度变化 ≤ 0.1°C,需 ΔQ × τ ≤ C × ΔTC ≈ 240 kJ/°CQ_5 已足够致变。故 5% 开度对应的有效温度调节能力约为 0.15°C死区宽度至少取 0.3°C(2倍冗余)

  3. 小于工艺允许的最大稳态误差
    医疗恒温设备要求 37.0 ± 0.2°C,则死区引起的最大静差不得超过 0.2°C。因此死区温度宽度必须 ≤ 0.2°C

最终取值规则
$$ \text{DB}_{\text{temp}} = \max\left(2\sigma_{\text{sensor}},\ 2\delta_{\text{valve\_effective}},\ 0\right) \quad \text{且} \quad \text{DB}_{\text{temp}} \leq \text{允许静差} $$
其中 $\sigma_{\text{sensor}}$ 为实测温度噪声标准差,$\delta_{\text{valve\_effective}}$ 为阀门最小有效调节步进对应温度值。
:某半导体烘箱要求 120.0 ± 0.5°C,实测 $\sigma = 0.12°C$,经测试 2% 开度即可引起 0.18°C/min 降温速率 → $\delta = 0.09°C$ → $\text{DB}_{\text{temp}} = \max(0.24, 0.18) = 0.24°C$,取 0.3°C(工程习惯向上取整到 0.1°C 倍数)。


四、双输出死区逻辑的完整数学定义

设:

  • $SP$:设定温度(°C)
  • $PV$:过程变量(实测温度,°C)
  • $e = SP - PV$:温度偏差
  • $u_{\text{pid}}$:PID控制器原始输出(归一化至 -100%+100%
  • $\text{DB}$:死区宽度(温度单位,°C)
  • $K_{\text{scale}}$:偏差到输出的线性比例系数(例如 1°C 偏差对应 20% 输出,则 $K_{\text{scale}} = 20$)

步骤1:计算带死区的偏差
$$ e_{\text{dead}} = \begin{cases} e - \frac{\text{DB}}{2}, & e > +\frac{\text{DB}}{2} \\ 0, & |e| \leq \frac{\text{DB}}{2} \\ e + \frac{\text{DB}}{2}, & e < -\frac{\text{DB}}{2} \end{cases} $$

步骤2:生成死区后PID输出
$$ u_{\text{dead}} = \text{PID}(e_{\text{dead}}) $$

注:此处 PID 以 $e_{\text{dead}}$ 为输入,非原始 $e$。这是动态死区(推荐),优于静态截断。

步骤3:分配加热/冷却输出(关键!)
令 $u = u_{\text{dead}}$,则:

  • 加热输出 $u_H = \max(u,\ 0)$
  • 冷却输出 $u_C = \max(-u,\ 0)$

✅ 此分配确保:

  • 当 $u > 0$:$u_H = u$,$u_C = 0$(仅加热)
  • 当 $u < 0$:$u_H = 0$,$u_C = -u$(仅冷却)
  • 当 $|u| \leq 0$(即 $e_{\text{dead}} = 0$):$u_H = u_C = 0$(双关)

⚠️ 错误做法:先算 $u_{\text{pid}}$,再强行设 if u>0 then uH=u else uH=0 —— 这会保留零点抖动,死区失效。


五、手把手配置示例(以 Ignition SCADA 的 Expression Tag 为例)

目标:设定温度 SP = 37.0°C,实测温度 PV 来自标签 Temperature/PV,死区 DB = 0.3°C

  1. 创建中间表达式标签 e_dead

    pv = system.tag.read("Temperature/PV").value
    sp = 37.0
    db = 0.3
    e = sp - pv
    if e > db/2:
        e_dead = e - db/2
    elif e < -db/2:
        e_dead = e + db/2
    else:
        e_dead = 0.0
    e_dead
  2. 创建 PID 输出标签 u_dead(调用内置 PID 模块,输入为 e_dead

  3. 创建加热输出 Valve/Heat_Output

    u = system.tag.read("Control/u_dead").value
    max(u, 0)
  4. 创建冷却输出 Valve/Cool_Output

    u = system.tag.read("Control/u_dead").value
    max(-u, 0)

✅ 验证方法:在趋势图中并列显示 PVSPValve/Heat_OutputValve/Cool_Output。当 PV36.85–37.15°C 波动时,两个阀门输出必须全程为 0;一旦 PV 稳定低于 36.85°C,仅加热阀动作;高于 37.15°C,仅冷却阀动作。


六、高级技巧:自适应死区(应对工况变化)

固定死区在启停阶段或大扰动下易失效。例如:升温初期系统热容小,微小偏差即引发大输出;保温阶段热容大,同样偏差输出微弱。此时可启用自适应死区

  • 监测 |u_{\text{pid}}| 的滑动平均值(窗口 60s
  • 当平均输出 > 30%:进入“动态调节模式”,临时将 DB 缩小至 0.1°C(提升响应)
  • 当平均输出 < 5%:进入“保温模式”,将 DB 扩大至 0.5°C(抑制微扰)
# Ignition 表达式(自适应DB)
u_avg = system.tag.read("Control/u_Avg60s").value
base_db = 0.3
if u_avg > 30:
    db = 0.1
elif u_avg < 5:
    db = 0.5
else:
    db = base_db
db

七、必须做的四项现场验证测试

  1. 台阶响应测试:将 PV 人为阶跃偏离 SP 0.4°C,观察阀门动作延迟是否 ≤ 2s,且无双动。
  2. 噪声注入测试:在 PV 信号上叠加 ±0.15°C 随机噪声(用仿真器),确认 u_Hu_C 全程为 0
  3. 边界穿越测试:缓慢调节 PV36.7°C 升至 37.3°C,记录 u_H0→X%u_C0→Y% 的精确切换点,验证死区中心是否严格对准 SP
  4. 断电恢复测试:断电重启控制器,检查死区参数是否掉失(需固化至非易失存储)。

八、常见失效原因与修复清单

现象 根本原因 修复操作
阀门仍偶发双动 死区设在 PID 之后(即对 u_pid 截断),而非对偏差 e 将死区移至 PID 输入端,或改用 e_dead 作为 PID 输入
温度在死区内持续漂移 未启用积分抗饱和(IAE),PID 在死区期间持续积分累积 在 PID 块中启用 Integral Action Disable when Output Saturated,或手动置零 e_dead=0 时的积分项
冷却阀关闭延迟明显 冷却介质存在滞后(如冷冻水回路长),导致 u_C 归零后仍有冷量流入 增加冷却阀的“软关断”逻辑:u_C = max(-u, 0) × (1 - 0.1×t)tu_C 归零后持续时间,单位秒)
HMI 显示死区生效,但现场阀门抖动 控制器扫描周期 > 500ms,导致死区计算频次不足 将控制逻辑迁移至高速任务(如 Rockwell 的 10ms 任务槽),或改用硬件滤波(RC 电路)预处理 PV 信号

九、附:一份可直接导入 PLC 的 Structured Text(ST)代码片段(IEC 61131-3)

// 输入
sp : REAL := 37.0;          // 设定值
pv : REAL;                  // 过程值(来自AI模块)
db_temp : REAL := 0.3;      // 死区宽度(°C)

// 内部变量
e : REAL;                   // 原始偏差
e_dead : REAL;              // 死区后偏差
u_pid : REAL;               // PID原始输出
u_h : REAL;                  // 加热输出(0.0~100.0)
u_c : REAL;                  // 冷却输出(0.0~100.0)

// 死区逻辑(放在PID调用前)
e := sp - pv;
IF e > (db_temp / 2.0) THEN
    e_dead := e - (db_temp / 2.0);
ELSIF e < -(db_temp / 2.0) THEN
    e_dead := e + (db_temp / 2.0);
ELSE
    e_dead := 0.0;
END_IF;

// 调用标准PID功能块(输入e_dead)
PID_INST(IN:=e_dead, ...); // 其他参数依PLC型号填写
u_pid := PID_INST.OUT;

// 双输出分配
IF u_pid > 0.0 THEN
    u_h := u_pid;
    u_c := 0.0;
ELSIF u_pid < 0.0 THEN
    u_h := 0.0;
    u_c := -u_pid;
ELSE
    u_h := 0.0;
    u_c := 0.0;
END_IF;

// 输出至AO模块(归一化为0~10000码值)
AQ_Heat := INT(u_h * 100.0);   // 假设AO分辨率为16位
AQ_Cool := INT(u_c * 100.0);

✅ 将此代码嵌入主循环(OB1 或等效周期任务),扫描周期设为 100ms,即可稳定运行。


死区逻辑不是补丁,而是温度控制系统的呼吸节律。它用一段沉默,换来整个系统的从容与寿命。

评论 (0)

暂无评论,快来抢沙发吧!

扫一扫,手机查看

扫描上方二维码,在手机上查看本文