跳到主要内容

多区加热控制系统

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 工控机13,000主控
汇川AM600-8TC (8 路热电偶)21,60016 路温度
汇川AM600-16DO 晶体管1780SSR 驱动
汇川AM600-8DO 继电器1520冷却阀
汇川AM600-1616END1850启停/急停/指示灯
国产通用K 型热电偶 0~1100 °C1080主 + 备
正泰SSR-40DA880加热 SSR
国产通用DN20 冷却电磁阀8120风/水冷
国产通用3 kW 陶瓷加热圈8220加热元件
威纶通TK6071iP 7"11,100本地 HMI
明纬LRS-200-24124024V

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从站 1AI_Temp[0..7]主温度区 1~8
%IW200~IW202从站 2AI_TempBkp[3,5]区 3/5 备传感器
%IX0.0从站 5SB_Start启动
%IX0.1从站 5SB_Stop停止 (常闭)
%IX0.2从站 5SB_EStop急停 (常闭)
%QX0.0~0.7从站 3DO_Heat[0..7]加热 SSR
%QX1.0~1.7从站 4DO_Cool[0..7]冷却阀
%QX2.0从站 5HL_Run运行灯
%QX2.1从站 5HL_Alarm报警灯
%QX2.2从站 5Buzzer报警蜂鸣

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. 运行与调试

  1. 仿真验证: 仿真 Runtime 给 AI_Temp[0..7] 灌入温升模型, 观察 8 区 PID 收敛
  2. 下载到 Runtime: IDE "部署" → 选 Runtime IP → 下载 PLC 程序
  3. 在线监控: 打开 8 区趋势曲线, 比较实际 vs 设定是否贴合, 稳态波动 ±0.5 °C
  4. 强制测试:
    • 强制 AI_TempBkp[3] 与主差 > 30 °C, 验证 bSensorFault[3] := TRUE
    • 强制 AI_Temp[0] > 400, 验证 bEnable[0] := FALSE (超温联锁)
  5. PID 整定: 关闭积分后 Kp 递增到等幅振荡, 应用 Ziegler-Nichols 公式
  6. 常见排查:
    • 多区响应速度不一致 → 检查加热圈功率是否一致, Kp 按区单独整定
    • 热电偶跳到 1100 → 断线检测, 查接线或补偿导线极性
    • SSR 频繁通断 → PWM 窗口 1 秒正常, 若 < 100 ms 则是配置错误
    • 能耗统计偏差大 → 检查 rRatedKw 与实际加热圈铭牌功率

11. 用到的 Darra 功能

功能模块本案例用到的说明
PLC 编程SCL + OB35 中断 + PID 数组 + UDTIEC 61131-3
工艺对象PID_COMPACT × 8 实例 + 升温曲线编辑器无需外购 SIWAREX
HMI8 区趋势 + 曲线编辑 + 能耗看板 + 手机监控一体化开发
通讯EtherCAT + OPC UA + Modbus TCP (扩展)多协议现场总线
数据记录每秒 10 点 × 90 天工艺追溯完整
服务终端授权 + 按运行小时收费 + 微信报警OEM 客户粘性提升

12. 项目总结

  • 实测指标: 8 区稳态 ±0.3 °C, 升温超调 1.5 °C, 连续 72 小时无漂移, PID 方案相比固定占空比节电 17%
  • 扩展方向:
    1. 升级到 32 区版本 (锂电涂布机烘道), PID 实例数组直接扩展
    2. AI 自整定: 根据历史升温曲线自动推荐 Kp/Ti/Td, 省去手工整定
    3. 多机联网: 挤出机 + 冷却水塔 + 切粒机 作为整线 PLC 统一调度