在温度控制系统中,加热与冷却双输出结构常见于精密恒温设备(如恒温箱、反应釜、洁净室空调系统)。若加热阀与冷却阀在控制信号重叠时同时开启,将导致能量对冲:热源与冷源直接对抗,不仅浪费能源、加剧设备磨损,还可能引发温度震荡、超调甚至失控。死区逻辑(Dead Band Logic) 是防止此类冲突的核心机制——它不依赖外部硬件互锁,而是通过软件策略在控制器内部为加热与冷却输出划定互斥区间。
一、为什么需要死区?先看一个典型失控场景
假设某恒温水浴槽设定温度为 37.0°C,当前实测温度为 36.8°C。PID控制器计算出的控制量为 +12%(正向偏差,需加热)。此时加热阀开度指令为 12%,冷却阀应为 0%。
但若温度短暂波动至 37.1°C(如开门扰动),控制器输出可能变为 -8%(负向偏差,需冷却),冷却阀开度指令 8%,加热阀应关至 0%。
问题在于:当温度在 36.95°C 与 37.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)如何科学设定?三个硬约束
死区不是越大越好。过宽会导致温度静差增大、响应迟钝;过窄则无法抑制抖动。必须同时满足以下三个条件:
-
覆盖传感器噪声带宽
若温度传感器精度为±0.1°C,采样周期为1s,实测数据标准差为0.07°C,则死区下限应 ≥2 × 0.07 = 0.14°C(取整0.2°C)。 -
大于执行机构最小有效动作量
气动调节阀的定位器通常有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 × ΔT→C ≈ 240 kJ/°C→Q_5已足够致变。故5%开度对应的有效温度调节能力约为0.15°C。死区宽度至少取0.3°C(2倍冗余)。 -
小于工艺允许的最大稳态误差
医疗恒温设备要求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。
-
创建中间表达式标签
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 -
创建 PID 输出标签
u_dead(调用内置 PID 模块,输入为e_dead) -
创建加热输出
Valve/Heat_Output:u = system.tag.read("Control/u_dead").value max(u, 0) -
创建冷却输出
Valve/Cool_Output:u = system.tag.read("Control/u_dead").value max(-u, 0)
✅ 验证方法:在趋势图中并列显示
PV、SP、Valve/Heat_Output、Valve/Cool_Output。当PV在36.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
七、必须做的四项现场验证测试
- 台阶响应测试:将
PV人为阶跃偏离SP0.4°C,观察阀门动作延迟是否 ≤2s,且无双动。 - 噪声注入测试:在
PV信号上叠加±0.15°C随机噪声(用仿真器),确认u_H与u_C全程为0。 - 边界穿越测试:缓慢调节
PV从36.7°C升至37.3°C,记录u_H从0→X%和u_C从0→Y%的精确切换点,验证死区中心是否严格对准SP。 - 断电恢复测试:断电重启控制器,检查死区参数是否掉失(需固化至非易失存储)。
八、常见失效原因与修复清单
| 现象 | 根本原因 | 修复操作 |
|---|---|---|
| 阀门仍偶发双动 | 死区设在 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)(t 为 u_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,即可稳定运行。
死区逻辑不是补丁,而是温度控制系统的呼吸节律。它用一段沉默,换来整个系统的从容与寿命。

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