温度 PID 控制
1. 设备简介
温度 PID 控制是工业过程控制的入门课, 典型应用于工业烤箱、注塑机料筒、恒温槽、化工反应釜、热处理炉, 覆盖塑料、食品、电子、医药、建材等多个行业。本案例以单回路 0~400 °C 电加热炉为对象, 3 kW 电加热管 + SSR 固态继电器驱动, 稳态精度要求 ±0.5 °C, 升温超调 < 2 °C, PID 周期 100 ms (OB35 中断), 并集成主备 PT100 传感器冗余、超温硬联锁、冷却电磁阀自动介入、趋势曲线数据记录 (30 天) 等可靠性功能, 目标是替代传统温控仪方案并加入远程运维能力。
2. 项目模块组成
- 机械部分: 加热炉 + 加热管 + 主/备 PT100 + 冷却电磁阀
- 电气部分: 研华工控机 + 汇川 4AD + 2DA + 1616END + SSR 40A + 3 kW 加热管
- 软件部分: OB35 PID 中断 + OB1 主循环 + FB_PIDLoop + FB_SensorRedundancy + DB_TempRecipe
3. 机械装配架构
炉体内腔对称安装主/备两只 PT100 热电阻, 主传感器靠近热源侧, 备传感器位于对侧。3 kW 陶瓷加热管底部布置, SSR 控制通断。当温度超过设定值 +5 °C 时打开冷却电磁阀引入外部冷风, 防止超调烧料。炉体外部包裹硅酸铝保温棉降低热损耗。
4. 程序架构
OB35 每 100 ms 执行 PID 计算与主备传感器差值判断, 输出 0100% 占空比后通过 2DA 转 010 V 驱动 SSR。OB1 处理启停、超温联锁、冷却阀开启逻辑, 以及趋势数据上报。PID 参数 (Kp/Ti/Td) 与设定值保存在 DB_TempRecipe, Retain 持久化。
5. 硬件选型 BOM
| 品牌 | 型号 | 数量 | 单价 (¥) | 用途 |
|---|---|---|---|---|
| 研华 | MIO-5272 工控机 | 1 | 3,000 | 主控 |
| 汇川 | AM600-4AD | 1 | 780 | 4 路 AI (PT100 兼容) |
| 汇川 | AM600-2DA | 1 | 680 | 2 路 AO (0~10V) |
| 汇川 | AM600-1616END | 1 | 850 | DI/DO |
| 国产通用 | PT100 三线制 | 2 | 150 | 主 + 备传感器 |
| 正泰 | SSR-40DA 固态继电器 | 1 | 80 | 加热开关 |
| 国产通用 | DN15 电磁阀 | 1 | 200 | 冷却水 |
| 国产通用 | 3 kW 陶瓷加热管 | 1 | 300 | 加热源 |
| 明纬 | LRS-100-24 | 1 | 120 | 24V |
6. IO 模块配置
6.1 选择 IO 模块
IDE 项目树 > IO 设备 > 右键 > 添加 IO 设备 依次扫描添加:
- 从站 1: 汇川 AM600-4AD (4AI PT100)
- 从站 2: 汇川 AM600-2DA (2AO 0~10V)
- 从站 3: 汇川 AM600-1616END (DI/DO)
在 从站属性 > PDO 配置 中为 4AD 选择 PT100 三线制模式, 量程 0~400 °C。
6.2 IO 地址分配
| 地址 | 模块 | 信号 | 用途 |
|---|---|---|---|
| %IW100 | 从站 1 | AI_TempMain | 主 PT100 |
| %IW102 | 从站 1 | AI_TempBackup | 备 PT100 |
| %QW100 | 从站 2 | AO_HeatPower | 加热功率 0~10V |
| %IX0.0 | 从站 3 | SB_Start | 启动 |
| %IX0.1 | 从站 3 | SB_Stop | 停止 (常闭) |
| %IX0.2 | 从站 3 | SB_EStop | 急停 (常闭) |
| %QX0.0 | 从站 3 | DO_HeatEnable | SSR 使能 |
| %QX0.1 | 从站 3 | DO_CoolValve | 冷却阀 |
| %QX0.2 | 从站 3 | HL_Heat | 加热指示灯 |
| %QX0.3 | 从站 3 | HL_Alarm | 报警灯 |
6.3 IO 用途分工
- PLC 主控: PID 算法 + 主备切换 + 超温联锁, 全部在 PLC 内完成
- 模拟量独立通道: 主/备 PT100 分占 2 个 AI 通道, 物理隔离避免单点故障
- 安全链: 超温联锁独立于 PID 执行, 超过阈值直接切使能, 不经 PID
- 上位联动: OPC UA 上传温度趋势 + Webhook 推送微信群
7. 核心数据结构
TYPE UDT_TempLoop:
STRUCT
rTempActual : REAL; // 当前温度
rTempBackup : REAL; // 备传感器温度
rTempSet : REAL := 150.0; // 设定值
rKp : REAL := 5.0;
rTi : REAL := 30.0;
rTd : REAL := 2.0;
rOutput : REAL; // PID 输出 0~100
rAlarmHigh : REAL := 200.0;
bAutoMode : BOOL := TRUE;
rManualOut : REAL;
bEnable : BOOL;
bSensorFault: BOOL;
END_STRUCT
END_TYPE
VAR_GLOBAL RETAIN
gRec_Temp : UDT_TempLoop;
END_VAR
8. 核心程序代码
FB_SensorRedundancy — 主备切换:
FUNCTION_BLOCK FB_SensorRedundancy
VAR_INPUT
wRawMain, wRawBackup : INT;
END_VAR
gRec_Temp.rTempActual := INT_TO_REAL(wRawMain) / 27648.0 * 400.0;
gRec_Temp.rTempBackup := INT_TO_REAL(wRawBackup) / 27648.0 * 400.0;
// 差值 > 20 °C 判主故障, 切备用
gRec_Temp.bSensorFault :=
ABS(gRec_Temp.rTempActual - gRec_Temp.rTempBackup) > 20.0;
IF gRec_Temp.bSensorFault THEN
IF gRec_Temp.rTempActual < -5.0 OR gRec_Temp.rTempActual > 410.0 THEN
gRec_Temp.rTempActual := gRec_Temp.rTempBackup;
END_IF;
END_IF;
FB_PIDLoop — PID 主逻辑 (OB35 100 ms):
FUNCTION_BLOCK FB_PIDLoop
VAR
fbPID : PID_COMPACT;
END_VAR
// 超温硬联锁: 不经 PID
IF gRec_Temp.rTempActual > gRec_Temp.rAlarmHigh THEN
gRec_Temp.bEnable := FALSE;
END_IF;
IF gRec_Temp.bAutoMode AND gRec_Temp.bEnable THEN
fbPID(
Setpoint := gRec_Temp.rTempSet,
Input := gRec_Temp.rTempActual,
Kp := gRec_Temp.rKp,
Ti := gRec_Temp.rTi,
Td := gRec_Temp.rTd,
OutputMin := 0.0, OutputMax := 100.0
);
gRec_Temp.rOutput := fbPID.Output;
ELSIF NOT gRec_Temp.bAutoMode AND gRec_Temp.bEnable THEN
gRec_Temp.rOutput := gRec_Temp.rManualOut;
ELSE
gRec_Temp.rOutput := 0.0;
END_IF;
FB_MainControl — 输出与冷却:
// AO 映射 0~100% → 0~27648 (0~10V)
AO_HeatPower := REAL_TO_INT(gRec_Temp.rOutput / 100.0 * 27648.0);
DO_HeatEnable := gRec_Temp.rOutput > 5.0 AND gRec_Temp.bEnable;
// 超过设定值 +5 °C 打开冷却阀 (防超调烧料)
DO_CoolValve := gRec_Temp.rTempActual > (gRec_Temp.rTempSet + 5.0)
AND gRec_Temp.bEnable;
HL_Heat := DO_HeatEnable;
HL_Alarm := gRec_Temp.rTempActual > gRec_Temp.rAlarmHigh
OR gRec_Temp.bSensorFault;
9. 运行与调试
- 仿真 Runtime 验证: 仿真中给
rTempActual输入阶跃值, 观察 PID 输出是否收敛 - Ziegler-Nichols 整定: 先关闭积分 (Ti=99999), 逐步增大 Kp 到等幅振荡, 按公式反算 Kp/Ti/Td
- 下载到 Runtime: IDE "部署" → 选 Runtime IP → 下载 PLC 程序
- 在线监控: 打开温度趋势图, 观察升温曲线是否平滑, 稳态波动是否在 ±0.5 °C
- 强制测试: 强制
AI_TempBackup = 0(模拟备传感器故障), 验证bSensorFault置位 - 常见排查: 稳态振荡 → Kp 过大; 无法到达设定值 → Ti 过大或 SSR 故障; 超调过大 → Td 过小
10. 用到的 Darra 功能
| 功能模块 | 本案例用到的 | 说明 |
|---|---|---|
| PLC 编程 | SCL + OB35 周期中断 | IEC 61131-3 |
| 工艺对象 | PID_COMPACT 内置 | 无需外购温控仪 |
| HMI | 趋势曲线 + 手机远程 + 配方下发 | 多地实时监控 |
| 通讯 | EtherCAT + OPC UA | 现场总线 + MES 对接 |
| 数据记录 | 1 秒/点 × 30 天 | 温度历史追溯 |
| 服务 | 设备远程运维 + 故障微信推送 | 客户报故障前先发现 |
11. 项目总结
- 实测指标: 从 25 °C 升至 150 °C 用时 8 分钟, 超调 1.2 °C, 稳态 ±0.3 °C, 连续 7 天无漂移
- 扩展方向:
- 升级多回路版本 (4~8 区 PID), 对接注塑机料筒/挤出机机头温控
- 增加 AI 自整定: 根据历史数据自动推荐 Kp/Ti/Td, 省去手工整定
- 对接 MES 配方下发, 不同工艺自动切换温度设定