一、自制 PID 适用场景
CP1H 内置 PID 指令功能固定,无法自定义输出限幅、分阶段积分分离、抗积分饱和、分段参数;
换热站温控、恒压补水、阀门调节需要自定义逻辑;
方便移植到无 PID 指令的小型 PLC,完全可视化每一步运算;
支持手动 / 自动无扰切换、自定义死区、斜坡输出。
二、PID 基础离散公式
标准离散位置型 PID:
\(u(k)=K_p\left[e(k)+\frac{T}{T_i}\sum_{i=0}^k e(i)+\frac{T_d}{T}\left[e(k)-e(k-1)\right]\right]\)拆解三部分:
比例项 P:\(K_p \times e(k)\)
积分项 I:\(K_p \times \frac{T}{T_i} \times \sum e\) (误差累加)
微分项 D:\(K_p \times \frac{T_d}{T} \times [e(k)-e(k-1)]\)
变量定义:
\(e(k)=SP-PV\):当前偏差(设定值 - 实际值)
SP:目标设定值
PV:现场采集反馈值(温度 / 压力)
T:PLC 采样周期(固定 100ms)
\(K_p\):比例系数
\(T_i\):积分时间 (s)
\(T_d\):微分时间 (s)
\(u(k)\):PID 输出(0~4000,对应 4~20mA 模拟量 AQ100)
三、寄存器规划(CP1H D 区保持寄存器)
表格
| D 寄存器 | 含义 | 说明 |
|---|---|---|
| D0 | SP 设定值 | 目标温度 / 压力 |
| D1 | PV 过程值 | AI 采集实际反馈 |
| D2 | e (k) 当前偏差 | SP-PV |
| D3 | e (k-1) 上一次偏差 | 微分计算用 |
| D4 | 偏差累加和 ∑e | 积分项累计 |
| D5 | Kp 比例系数 | 放大 100 倍,D5=250 → Kp=2.5 |
| D6 | Ti 积分时间 (s) | 单位秒 |
| D7 | Td 微分时间 (s) | 单位秒 |
| D8 | 采样周期 T (ms) | 固定 100ms=D8=100 |
| D10 | P 项运算结果 | 比例输出 |
| D11 | I 项运算结果 | 积分输出 |
| D12 | D 项运算结果 | 微分输出 |
| D13 | PID 总原始输出 | P+I+D |
| D14 | 输出下限限幅 | 最小输出 400(4mA) |
| D15 | 输出上限限幅 | 最大输出 4000(20mA) |
| D16 | 最终限幅后 PID 输出 | 写入 AQ100 |
| D20 | 自动 / 手动标志 | D20=1 自动 PID,0 手动 |
| D21 | 手动输出值 | 手动模式直接赋值输出 |
继电器标志
P_100ms:100ms 周期脉冲,固定 PID 采样触发
W0.00:PID 运算总启动(自动模式)
W0.01:积分饱和上限标志
W0.02:积分饱和下限标志
四、关键换算公式(PLC 整数运算,无浮点数)
欧姆龙 CP1H 梯形图仅支持整数,全部放大 100 倍运算避免小数丢失精度:
比例项
\(P = Kp \times e(k) \div 100\)2. 积分系数 \(Ki = Kp \times T \div (Ti \times 100)\)
\(I = Ki \times \sum e\)3. 微分系数 \(Kd = Kp \times Td \div (T \times 100)\)
\(D = Kd \times [e(k)-e(k-1)]\)
五、完整梯形图逻辑分步解析
网络 1:模式切换、采样周期触发
plaintext
LD D20 AND P_100ms OUT W0.00 // 100ms执行一次PID运算
说明:自动模式下,每 100ms 执行一轮完整 PID 计算,保证采样周期固定。
网络 2:计算当前偏差 e (k)=SP-PV
plaintext
LD W0.00 MOV D2,D3 // 保存上一次偏差 e(k)→e(k-1) SUB D0,D1,D2 // D2=SP(D0)-PV(D1) 新偏差
网络 3:比例项 P 计算
plaintext
LD W0.00 MUL D2,D5,D10 // D10=e(k)*Kp DIV D10,#100,D10 // 除以100还原小数 → 比例输出
网络 4:积分累加 ∑e,积分分离 / 抗积分饱和核心
plaintext
LD W0.00 ADD D2,D4,D4 // D4 = D4+e(k) 偏差累加 // 积分上限判断,防止正向饱和 LD D4 > #50000 OUT W0.01 MOV #50000,D4 // 积分下限判断,防止负向饱和 LD D4 < #-50000 OUT W0.02 MOV #-50000,D4
抗积分饱和逻辑:累加和限制 ±50000,避免大幅偏差时积分无限累积,超调严重。
网络 5:积分项 I 运算
plaintext
LD W0.00 // Ki = Kp*T/(Ti*100) MUL D5,D8,D100 // Kp*T MUL D6,#100,D101 // Ti*100 DIV D100,D101,D102// Ki系数 MUL D4,D102,D11 // I=Ki*∑e
网络 6:微分项 D 计算
plaintext
LD W0.00 SUB D2,D3,D103 // e(k)-e(k-1) 偏差变化量 // Kd = Kp*Td/(T*100) MUL D5,D7,D104 MUL D8,#100,D105 DIV D104,D105,D106// Kd系数 MUL D103,D106,D12 // D项输出
网络 7:P+I+D 求和,原始 PID 输出
plaintext
LD W0.00 ADD D10,D11,D13 ADD D13,D12,D13 // D13 = P+I+D
网络 8:输出上下限幅(适配 4~20mA 模拟量 0~4000)
plaintext
LD W0.00 // 超过上限4000强制限幅 LD D13 > D15 MOV D15,D16 // 低于下限400强制限幅 LD D13 < D14 MOV D14,D16 // 区间内直接输出 LD D14 ≤ D13 ≤ D15 MOV D13,D16
网络 9:自动 / 手动无扰切换
plaintext
// 自动模式输出PID计算值 LD D20=#1 MOV D16,AQ100 // 手动模式输出手动给定值D21 LD D20=#0 MOV D21,AQ100
网络 10:上电初始化(清除积分累加,防止开机冲击)
plaintext
LD P_First_Cycle MOV #0,D4 // 清空积分和∑e MOV #0,D3 // 清空上一次偏差
六、进阶优化功能(换热站必备扩展逻辑)
1. 积分分离(大幅减小超调,温控核心)
当偏差绝对值大于阈值(例:|e|>10℃),关闭积分,只执行 PD 调节;小偏差再投入积分:
plaintext
LD ABS(D2) > #10 MOV #0,D11 // I项清零,积分失效
2. 输出死区,阀门微小抖动抑制
PID 输出变化小于 50 时,不更新模拟量,防止电动阀频繁微小动作磨损:
plaintext
SUB D16,AQ100,D110 LD ABS(D110) < #50 MOV AQ100,D16 // 维持原有输出不变
3. 微分先行(只对 PV 微分,抑制设定值突变冲击)
常规 PID 对 SP 突变会产生巨大微分冲击(如温度设定突然上调 10℃阀门瞬间全开);微分先行改为仅对实际 PV 做微分,工业换热站首选改良 PID:只需修改微分运算,用本次 PV - 上次 PV 代替偏差差:D103 = D1_当前 PV - D108_上次 PV
4. 分段 PID 参数(冬季 / 夏季两套 Kp、Ti)
利用 PLC 内部时钟判断时段,自动切换 D5/D6/D7 参数,适配昼夜供暖气候补偿。
七、仿真与调试步骤
初始参数推荐(换热站温度控制)D5=200(Kp=2.0),D6=80(Ti=80s),D7=5(Td=5s),D8=100ms
离线仿真:手动修改 D0 设定、D1 反馈,监控 D10/D11/D12/PID 输出变化
现场调试顺序:先开 P,加大 Kp 至小幅震荡;再开 I 消除静差;最后加 D 抑制超调
观察 D4 积分累加值,若持续饱和,增大 Ti 或增加积分分离阈值
八、与 CP1H 内置 PID 指令对比
表格
| 项目 | 自制梯形图 PID | CP1H 内置 PID 指令 PID (190) |
|---|---|---|
| 逻辑自由度 | 完全自定义,积分分离、微分先行、无扰切换自由写 | 固定算法,修改逻辑受限 |
| 运算精度 | 整数运算,需手动缩放 | 自带浮点数运算 |
| 采样周期 | 自由设定,P_100ms/P_1s 均可 | 固定周期设置 |
| 资源占用 | 占用 D 区寄存器多,梯形图网络多 | 单条指令,占用资源极少 |
| 适用场景 | 复杂工艺、需要特殊抗超调逻辑(换热站) | 简单恒温恒压,快速开发 |
九、常见故障排查
输出持续饱和不动:积分累加 D4 超限,检查抗积分饱和逻辑;增大 Ti
阀门高频抖动:微分项 D 过大,减小 D7 微分时间,增加输出死区
存在静态温差消除不了:积分失效,检查积分累加 D4 是否正常增减
设定值改动瞬间阀门剧烈动作:未做微分先行,对 SP 微分产生冲击
PID 完全无运算:确认 W0.00 是否 100ms 周期持续导通、自动标志 D20=1
十、补充:增量式 PID 简要说明
上述程序为位置式 PID,直接输出阀门开度;增量式只输出本次输出变化量 Δu,适合步进阀、变频器,无积分饱和风险,公式:
\(\Delta u=K_p\left[(e_k-e_{k-1})+\frac{T}{T_i}e_k+\frac{T_d}{T}(e_k-2e_{k-1}+e_{k-2})\right]\)只需替换 P/I/D 运算网络,寄存器增加 D3 保存 e (k-2) 即可。

