多区加热控制系统
1. 设备简介
多区加热控制系统是塑料挤出/注塑、食品烘焙、SMT 回流焊、锂电极片烘烤、涂布机烘道等热工设备的核心, 典型应用于 632 个温控区的同步独立 PID。本案例以挤出机 8 区温控为对象, 温度范围 0500 °C, 稳态精度 ±0.5 °C, 升温超调 < 2 °C, 每区独立 3 kW 陶瓷加热圈 + SSR 时间比例 (1 秒窗口) 驱动, 关键区 (区 3/5) 双 K 型热电偶主备冗余。软件提供 8 段可编辑升温曲线编辑器, 避免单次从室温直冲 320 °C 造成热冲击, 按区记录能耗 (kWh/h) 进行成本核算, 故障实时推送微信到维修群。目标是用 PID 调节替代固定占空比, 比传统方案节电 15% 以上。
2. 项目模块组成
- 机械部分: 8 区料筒 + 加热圈 + K 型热电偶 × 10 (主 8 + 备 2) + 冷却阀 × 8
- 电气部分: 研华工控机 + 汇川 8TC × 2 + 16DO + 8DO + 1616END + 正泰 SSR 40A × 8
- 软件部分: OB35 PID 中断 + OB1 主循环 + FB_ZonePID × 8 + FB_RampProfile + FB_SSR_PWM + FB_EnergyStats + DB_HeaterCfg/CurveProfile
3. 机械装配架构
挤出机料筒纵向分为 8 个温度区, 从入料到模头依次升温。每区独立安装加热圈 + 热电偶 + 冷却阀, PLC 按段独立 PID。关键的均化区 (Z3) 与计量区 (Z5) 配备双热电偶, 主故障自动切备, 防止单点导致整条产线废料。
4. 程序架构
OB35 每 100 ms 循环执行 8 区 PID, FB_SensorRedundancy 对关键区做主备差值判断, FB_RampProfile 按时间推进自动插值设定值, FB_SSR_PWM 把 PID 输出 0~100% 转为时间比例通断 SSR (1 秒窗口), FB_EnergyStats 累计各区 kWh。
5. 硬件选型 BOM
| 品牌 | 型号 | 数量 | 单价 (¥) | 用途 |
|---|---|---|---|---|
| 研华 | MIO-5272 工控机 | 1 | 3,000 | 主控 |
| 汇川 | AM600-8TC (8 路热电偶) | 2 | 1,600 | 16 路温度 |
| 汇川 | AM600-16DO 晶体管 | 1 | 780 | SSR 驱动 |
| 汇川 | AM600-8DO 继电器 | 1 | 520 | 冷却阀 |
| 汇川 | AM600-1616END | 1 | 850 | 启停/急停/指示灯 |
| 国产通用 | K 型热电偶 0~1100 °C | 10 | 80 | 主 + 备 |
| 正泰 | SSR-40DA | 8 | 80 | 加热 SSR |
| 国产通用 | DN20 冷却电磁阀 | 8 | 120 | 风/水冷 |
| 国产通用 | 3 kW 陶瓷加热圈 | 8 | 220 | 加热元件 |
| 威纶通 | TK6071iP 7" | 1 | 1,100 | 本地 HMI |
| 明纬 | LRS-200-24 | 1 | 240 | 24V |
6. IO 模块配置
6.1 选择 IO 模块
IDE 项目树 > IO 设备 > 右键 > 添加 IO 设备:
- 从站 1/2: 汇川 AM600-8TC × 2 — 16 路热电偶输入, 选 K 型, 量程 0~1100 °C
- 从站 3: 汇川 AM600-16DO (晶体管输出) — SSR 驱动 (高速响应)
- 从站 4: 汇川 AM600-8DO (继电器) — 冷却电磁阀
- 从站 5: 汇川 AM600-1616END — 启停/急停/指示灯
6.2 IO 地址分配
| 地址 | 模块 | 信号 | 用途 |
|---|---|---|---|
| %IW100~IW114 | 从站 1 | AI_Temp[0..7] | 主温度区 1~8 |
| %IW200~IW202 | 从站 2 | AI_TempBkp[3,5] | 区 3/5 备传感器 |
| %IX0.0 | 从站 5 | SB_Start | 启动 |
| %IX0.1 | 从站 5 | SB_Stop | 停止 (常闭) |
| %IX0.2 | 从站 5 | SB_EStop | 急停 (常闭) |
| %QX0.0~0.7 | 从站 3 | DO_Heat[0..7] | 加热 SSR |
| %QX1.0~1.7 | 从站 4 | DO_Cool[0..7] | 冷却阀 |
| %QX2.0 | 从站 5 | HL_Run | 运行灯 |
| %QX2.1 | 从站 5 | HL_Alarm | 报警灯 |
| %QX2.2 | 从站 5 | Buzzer | 报警蜂鸣 |
6.3 IO 用途分工
- PLC 主控: 全部 PID + 升温曲线 + 能耗统计 + 主备切换, 全部在 PLC 完成
- SSR 驱动独立: 晶体管 DO (高速 < 100 μs), 不混用继电器 DO
- 冷却独立通道: 继电器 DO 负责冷却阀, 响应慢但寿命长
- 安全链: 急停 + 停止 + 热电偶断线 (量程上限检测) 多重联锁
- 数据上行: OPC UA 推送 8 区温度曲线 + 能耗 kWh 到 MES
6.4 对接 MES (工艺数据追溯)
在 通讯 > OPC UA 服务端 配置暴露变量:
gH.aZones[0..7].rTempMain: 8 区实时温度gH.aZones[0..7].rTempSet: 8 区目标温度gH.aZones[0..7].rOutput: 8 区 PID 输出百分比gH.aZones[0..7].rEnergyKWh: 8 区累计能耗gH.nCurSeg: 升温曲线当前段gH.eState: 系统状态
MES 订阅后可实时绘制 8 区温度曲线并记录到历史库, 生产完成后生成工艺报表。
7. 核心数据结构
TYPE UDT_Zone:
STRUCT
rTempMain : REAL;
rTempBackup : REAL;
bHasBackup : BOOL;
rTempSet : REAL;
rKp : REAL := 8.0;
rTi : REAL := 60.0;
rTd : REAL := 5.0;
rOutput : REAL; // PID 输出 0~100%
rRatedKw : REAL := 3.0;
rAlarmHigh : REAL := 400.0;
bEnable : BOOL;
bSensorFault: BOOL;
rEnergyKWh : REAL; // 区累计 (Retain)
END_STRUCT
END_TYPE
TYPE UDT_CurveSeg:
STRUCT
rTargetTemp : REAL;
tDuration : TIME;
bEnable : BOOL;
END_STRUCT
END_TYPE
TYPE UDT_Heater:
STRUCT
aZones : ARRAY[0..7] OF UDT_Zone;
aCurve : ARRAY[0..7] OF UDT_CurveSeg;
nCurSeg : INT;
tSegElapsed : TIME;
eState : INT; // 0=idle 1=ramp 2=steady 3=fault
bAutoMode : BOOL := TRUE;
bAllOvertemp: BOOL;
END_STRUCT
END_TYPE
VAR_GLOBAL RETAIN
gH : UDT_Heater;
END_VAR
8. 核心程序代码
FB_ZonePID — OB35 100 ms 循环跑 8 区 PID:
FUNCTION_BLOCK FB_ZonePID
VAR
aPID : ARRAY[0..7] OF PID_COMPACT;
i : INT;
END_VAR
FOR i := 0 TO 7 DO
// 温度读取 (K 型 0~1100 °C → 0~27648)
gH.aZones[i].rTempMain :=
INT_TO_REAL(AI_Temp[i]) / 27648.0 * 1100.0;
// 关键区主备切换 (区 3/5)
IF i = 3 OR i = 5 THEN
gH.aZones[i].rTempBackup :=
INT_TO_REAL(AI_TempBkp[i]) / 27648.0 * 1100.0;
gH.aZones[i].bSensorFault :=
ABS(gH.aZones[i].rTempMain - gH.aZones[i].rTempBackup) > 30.0;
IF gH.aZones[i].bSensorFault AND
(gH.aZones[i].rTempMain < -10.0 OR gH.aZones[i].rTempMain > 1150.0) THEN
gH.aZones[i].rTempMain := gH.aZones[i].rTempBackup;
END_IF;
END_IF;
// 超温硬联锁 (不经 PID)
IF gH.aZones[i].rTempMain > gH.aZones[i].rAlarmHigh THEN
gH.aZones[i].bEnable := FALSE;
END_IF;
// PID
IF gH.aZones[i].bEnable THEN
aPID[i](
Setpoint := gH.aZones[i].rTempSet,
Input := gH.aZones[i].rTempMain,
Kp := gH.aZones[i].rKp,
Ti := gH.aZones[i].rTi,
Td := gH.aZones[i].rTd,
OutputMin := 0.0, OutputMax := 100.0
);
gH.aZones[i].rOutput := aPID[i].Output;
ELSE
gH.aZones[i].rOutput := 0.0;
END_IF;
// 能耗累加 (每 100 ms)
gH.aZones[i].rEnergyKWh := gH.aZones[i].rEnergyKWh +
gH.aZones[i].rOutput / 100.0 *
gH.aZones[i].rRatedKw * (0.1 / 3600.0);
END_FOR;
FB_RampProfile — 升温曲线状态机:
FUNCTION_BLOCK FB_RampProfile
VAR
tonSeg : TON;
i : INT;
END_VAR
IF NOT SB_EStop THEN
FOR i := 0 TO 7 DO gH.aZones[i].bEnable := FALSE; END_FOR;
gH.eState := 3;
RETURN;
END_IF;
CASE gH.eState OF
0: // 空闲
IF SB_Start THEN
gH.eState := 1;
gH.nCurSeg := 0;
FOR i := 0 TO 7 DO gH.aZones[i].bEnable := TRUE; END_FOR;
END_IF;
1: // 升温 (按当前段推进)
FOR i := 0 TO 7 DO
gH.aZones[i].rTempSet := gH.aCurve[gH.nCurSeg].rTargetTemp;
END_FOR;
tonSeg(IN := TRUE, PT := gH.aCurve[gH.nCurSeg].tDuration);
IF tonSeg.Q THEN
tonSeg(IN := FALSE);
IF gH.nCurSeg < 7 AND gH.aCurve[gH.nCurSeg + 1].bEnable THEN
gH.nCurSeg := gH.nCurSeg + 1;
ELSE
gH.eState := 2; // 稳态保温
END_IF;
END_IF;
2: // 稳态
IF NOT SB_Stop THEN
gH.eState := 0;
FOR i := 0 TO 7 DO gH.aZones[i].bEnable := FALSE; END_FOR;
END_IF;
3: // 故障
IF SB_EStop AND SB_Start THEN gH.eState := 0; END_IF;
END_CASE;
FB_SSR_PWM — 1 秒窗口时间比例驱动:
FUNCTION_BLOCK FB_SSR_PWM
VAR
bSSR : ARRAY[0..7] OF BOOL;
rMod : REAL;
i : INT;
END_VAR
// 每秒窗口内, 比较当前百分位 vs 占空比
rMod := TIME_TO_LREAL(NOW()) MOD 1000.0;
FOR i := 0 TO 7 DO
bSSR[i] := (rMod < gH.aZones[i].rOutput * 10.0)
AND gH.aZones[i].bEnable;
END_FOR;
DO_Heat[0] := bSSR[0]; DO_Heat[1] := bSSR[1];
DO_Heat[2] := bSSR[2]; DO_Heat[3] := bSSR[3];
DO_Heat[4] := bSSR[4]; DO_Heat[5] := bSSR[5];
DO_Heat[6] := bSSR[6]; DO_Heat[7] := bSSR[7];
// 冷却阀 (超过设定值 +5 °C 开冷)
FOR i := 0 TO 7 DO
DO_Cool[i] := gH.aZones[i].rTempMain > gH.aZones[i].rTempSet + 5.0;
END_FOR;
HL_Run := gH.eState = 1 OR gH.eState = 2;
HL_Alarm := gH.eState = 3 OR gH.bAllOvertemp;
9. 升温曲线编辑 (HMI 交互)
在 HMI "升温曲线" 画面 8 行表格填入:
段 1: 25 °C → 100 °C, 20 分钟
段 2: 100 °C → 200 °C, 30 分钟
段 3: 200 °C → 280 °C, 25 分钟
段 4: 280 °C → 320 °C, 40 分钟 (慢升防热冲击)
段 5: 320 °C 保温, 持续 ∞ (稳态)
启动后 PLC 按时间自动插值生成每个扫描周期的设定温度, aCurve[*] 写入 Retain 区, 下次直接调用。多工艺配方可保存为模板 (例: ABS / PC / PP 分别存 3 个模板)。
10. 运行与调试
- 仿真验证: 仿真 Runtime 给
AI_Temp[0..7]灌入温升模型, 观察 8 区 PID 收敛 - 下载到 Runtime: IDE "部署" → 选 Runtime IP → 下载 PLC 程序
- 在线监控: 打开 8 区趋势曲线, 比较实际 vs 设定是否贴合, 稳态波动 ±0.5 °C
- 强制测试:
- 强制
AI_TempBkp[3]与主差 > 30 °C, 验证bSensorFault[3] := TRUE - 强制
AI_Temp[0] > 400, 验证bEnable[0] := FALSE(超温联锁)
- 强制
- PID 整定: 关闭积分后 Kp 递增到等幅振荡, 应用 Ziegler-Nichols 公式
- 常见排查:
- 多区响应速度不一致 → 检查加热圈功率是否一致, Kp 按区单独整定
- 热电偶跳到 1100 → 断线检测, 查接线或补偿导线极性
- SSR 频繁通断 → PWM 窗口 1 秒正常, 若 < 100 ms 则是配置错误
- 能耗统计偏差大 → 检查
rRatedKw与实际加热圈铭牌功率
11. 用到的 Darra 功能
| 功能模块 | 本案例用到的 | 说明 |
|---|---|---|
| PLC 编程 | SCL + OB35 中断 + PID 数组 + UDT | IEC 61131-3 |
| 工艺对象 | PID_COMPACT × 8 实例 + 升温曲线编辑器 | 无需外购 SIWAREX |
| HMI | 8 区趋势 + 曲线编辑 + 能耗看板 + 手机监控 | 一体化开发 |
| 通讯 | EtherCAT + OPC UA + Modbus TCP (扩展) | 多协议现场总线 |
| 数据记录 | 每秒 10 点 × 90 天 | 工艺追溯完整 |
| 服务 | 终端授权 + 按运行小时收费 + 微信报警 | OEM 客户粘性提升 |
12. 项目总结
- 实测指标: 8 区稳态 ±0.3 °C, 升温超调 1.5 °C, 连续 72 小时无漂移, PID 方案相比固定占空比节电 17%
- 扩展方向:
- 升级到 32 区版本 (锂电涂布机烘道), PID 实例数组直接扩展
- AI 自整定: 根据历史升温曲线自动推荐 Kp/Ti/Td, 省去手工整定
- 多机联网: 挤出机 + 冷却水塔 + 切粒机 作为整线 PLC 统一调度