5.4 PID控制原理与应用
本节将介绍PID控制的原理和PLC实现方法,PID是工业控制中最重要的闭环控制算法
学习目标
- 理解PID控制的基本原理
- 掌握P、I、D各参数的作用
- 学会PID参数的整定方法
- 能够在PLC中实现PID控制
- 掌握温度PID控制系统设计
1. PID控制原理
1.1 开环控制与闭环控制
开环控制(无反馈):
┌─────────────────────────────────────────────────────────────┐
│ │
│ 设定值 ──→ 控制器 ──→ 执行器 ──→ 被控对象 ──→ 输出 │
│ │
│ 特点:简单,但无法补偿干扰 │
│ 例如:定时器控制加热时间 │
│ │
└─────────────────────────────────────────────────────────────┘
闭环控制(有反馈):
┌─────────────────────────────────────────────────────────────┐
│ │
│ 设定值 ──→⊕──→ 控制器 ──→ 执行器 ──→ 被控对象 ──→ 输出 │
│ ↑- │ │
│ │ │ │
│ └──────── 传感器 ←────────────────────┘ │
│ 反馈 │
│ │
│ 特点:能自动补偿干扰,保持输出稳定 │
│ 例如:温度PID控制 │
│ │
└─────────────────────────────────────────────────────────────┘1.2 PID控制器概念
PID = Proportional(比例)+ Integral(积分)+ Derivative(微分)
PID控制器结构:
┌─────────────────────────────────────────────────────────────┐
│ │
│ ┌─────────────┐ │
│ ┌───→│ P(比例) │───┐ │
│ │ └─────────────┘ │ │
│ │ ┌─────────────┐ │ ┌─────┐ │
│ 误差 ──┼───→│ I(积分) │───┼───→│ Σ │──→ 输出 │
│ e(t) │ └─────────────┘ │ └─────┘ │
│ │ ┌─────────────┐ │ │
│ └───→│ D(微分) │───┘ │
│ └─────────────┘ │
│ │
│ 误差 e(t) = 设定值(SP) - 测量值(PV) │
│ │
└─────────────────────────────────────────────────────────────┘1.3 PID数学公式
PID控制公式:
┌─────────────────────────────────────────────────────────────┐
│ │
│ 连续形式: │
│ 1 t de(t) │
│ u(t) = Kp × [e(t) + ─── ∫ e(τ)dτ + Td × ────] │
│ Ti 0 dt │
│ │
│ 离散形式(PLC实现): │
│ T k Td │
│ u(k) = Kp × [e(k) + ─── × Σ e(j) + ─── × (e(k)-e(k-1))] │
│ Ti j=0 T │
│ │
│ 参数说明: │
│ Kp - 比例增益 │
│ Ti - 积分时间 │
│ Td - 微分时间 │
│ T - 采样周期 │
│ e - 误差 │
│ │
└─────────────────────────────────────────────────────────────┘【停顿总结1】 已完成约500字,介绍了:
- 开环控制与闭环控制的区别
- PID控制器的基本概念(比例+积分+微分)
- PID控制器的结构框图
- PID数学公式(连续形式和离散形式)
继续填充P、I、D各部分的详细作用:
2. 比例控制(P)
2.1 比例控制原理
比例控制特性:
┌─────────────────────────────────────────────────────────────┐
│ │
│ 公式:P输出 = Kp × e(t) │
│ │
│ 输出与误差成正比: │
│ • 误差大 → 输出大 → 快速调节 │
│ • 误差小 → 输出小 → 缓慢调节 │
│ │
│ 响应曲线: │
│ 输出 │
│ ↑ 设定值 │
│ │ ──────────────────────── │
│ │ ╱ │
│ │ ╱ ← 纯P控制响应 │
│ │ ╱ │
│ │╱ 稳态误差(无法消除) │
│ └────────────────────────────→ 时间 │
│ │
└─────────────────────────────────────────────────────────────┘2.2 Kp参数影响
| Kp值 | 响应速度 | 超调量 | 稳态误差 | 稳定性 |
|---|---|---|---|---|
| 过小 | 慢 | 小 | 大 | 稳定 |
| 适中 | 适中 | 适中 | 存在 | 稳定 |
| 过大 | 快 | 大 | 小 | 可能振荡 |
不同Kp值的响应对比:
┌─────────────────────────────────────────────────────────────┐
│ │
│ 输出 │
│ ↑ 设定值 │
│ │ ────────────────────────────── │
│ │ ╭──╮ │
│ │ ╱ ╲ ╭─╮ │
│ │ ╱ ╲╯ ╲──── Kp大(快速但振荡) │
│ │ ╱ ────── Kp适中(较好) │
│ │╱ ─────────── Kp小(慢,误差大) │
│ └────────────────────────────────→ 时间 │
│ │
└─────────────────────────────────────────────────────────────┘3. 积分控制(I)
3.1 积分控制原理
积分控制特性:
┌─────────────────────────────────────────────────────────────┐
│ │
│ 公式:I输出 = (Kp/Ti) × ∫e(t)dt │
│ │
│ 积分作用: │
│ • 累积误差,消除稳态偏差 │
│ • 只要有误差存在,积分项就会增长 │
│ • 直到误差为零,积分停止变化 │
│ │
│ 积分消除稳态误差: │
│ 输出 │
│ ↑ 设定值 │
│ │ ────────────────────────────── │
│ │ ╭─────────────────────── PI控制(无稳态误差) │
│ │ ╱ │
│ │ ╱ ─────────────────────── P控制(有稳态误差) │
│ │ ╱ │
│ │ ╱ │
│ └────────────────────────────────→ 时间 │
│ │
└─────────────────────────────────────────────────────────────┘3.2 Ti参数影响
| Ti值 | 积分作用 | 消除误差速度 | 超调量 | 稳定性 |
|---|---|---|---|---|
| 过小 | 太强 | 快 | 大 | 易振荡 |
| 适中 | 适中 | 适中 | 适中 | 稳定 |
| 过大 | 太弱 | 慢 | 小 | 稳定 |
| ∞ | 无 | 不消除 | - | - |
3.3 积分饱和问题
积分饱和(Windup)现象:
┌─────────────────────────────────────────────────────────────┐
│ │
│ 当执行器饱和时,积分项继续累积,导致: │
│ │
│ 输出 │
│ ↑ 执行器上限 │
│ │ ═══════════════════════════════ │
│ │ 积分累积区域 │
│ │ ╱─────────────╲ │
│ │ ╱ ╲ │
│ │ ╱ ╲ ← 超调严重 │
│ │ ╱ ╲ │
│ └──────────────────────────────→ 时间 │
│ │
│ 解决方法: │
│ 1. 积分限幅:限制积分项的最大值 │
│ 2. 条件积分:误差小于阈值时才积分 │
│ 3. 积分分离:误差大时停止积分 │
│ │
└─────────────────────────────────────────────────────────────┘【停顿总结2】 已完成约1000字,新增内容:
- 比例控制(P)的原理和Kp参数影响
- 积分控制(I)的作用——消除稳态误差
- Ti参数对系统的影响
- 积分饱和问题及解决方法
继续填充微分控制和PID参数整定:
4. 微分控制(D)
4.1 微分控制原理
微分控制特性:
┌─────────────────────────────────────────────────────────────┐
│ │
│ 公式:D输出 = Kp × Td × de(t)/dt │
│ │
│ 微分作用: │
│ • 根据误差变化率进行调节 │
│ • 预测误差趋势,提前调节 │
│ • 抑制超调,加快稳定 │
│ │
│ 微分的"预测"作用: │
│ │
│ 误差 │
│ ↑ │
│ │ ╲ │
│ │ ╲ ← 误差正在减小 │
│ │ ╲ 微分输出为负 │
│ │ ╲ 提前减小控制量 │
│ │ ╲ │
│ └──────────────────────────→ 时间 │
│ │
└─────────────────────────────────────────────────────────────┘4.2 Td参数影响
| Td值 | 微分作用 | 抑制超调 | 抗干扰 | 稳定性 |
|---|---|---|---|---|
| 0 | 无 | 无 | 差 | - |
| 适中 | 适中 | 好 | 好 | 稳定 |
| 过大 | 太强 | 过度 | 放大噪声 | 可能振荡 |
4.3 微分的局限性
微分对噪声敏感:
┌─────────────────────────────────────────────────────────────┐
│ │
│ 真实信号(含噪声): │
│ ╭╮ ╭╮ │
│ ╱╲╱╲╱╲───── │
│ ╱ │
│ ╱ │
│ │
│ 微分后(噪声被放大): │
│ │ │ │ │
│ │ │ │ │ ← 噪声被放大 │
│ ──┼─┼─┼─┼──── │
│ │ │ │ │
│ │
│ 解决方法: │
│ 1. 对测量值先滤波再微分 │
│ 2. 使用不完全微分 │
│ 3. 对设定值微分而非误差微分 │
│ │
└─────────────────────────────────────────────────────────────┘4.4 PID各项作用总结
| 参数 | 主要作用 | 副作用 | 调节方向 |
|---|---|---|---|
| Kp | 加快响应 | 产生稳态误差 | 大→快响应 |
| Ti | 消除稳态误差 | 增加超调 | 小→快消除 |
| Td | 抑制超调 | 放大噪声 | 大→强抑制 |
5. PID参数整定方法
5.1 试凑法
试凑法步骤:
┌─────────────────────────────────────────────────────────────┐
│ │
│ 步骤1:先整定P │
│ ├─设Ti=∞,Td=0(只用P) │
│ ├─从小到大调Kp,直到响应较快但不振荡 │
│ └─记录此时的Kp值 │
│ │
│ 步骤2:加入I │
│ ├─保持Kp,设Td=0 │
│ ├─从大到小调Ti,观察稳态误差消除速度 │
│ ├─Ti太小会振荡,太大消除误差慢 │
│ └─选择合适的Ti值 │
│ │
│ 步骤3:加入D(如需要) │
│ ├─保持Kp、Ti │
│ ├─从小到大调Td,观察超调抑制效果 │
│ ├─Td太大会放大噪声 │
│ └─选择合适的Td值 │
│ │
│ 步骤4:微调 │
│ └─根据实际效果微调各参数 │
│ │
└─────────────────────────────────────────────────────────────┘5.2 Ziegler-Nichols临界比例法
Z-N临界比例法步骤:
┌─────────────────────────────────────────────────────────────┐
│ │
│ 步骤1:设Ti=∞,Td=0,只用P控制 │
│ │
│ 步骤2:逐渐增大Kp,直到系统出现等幅振荡 │
│ 记录此时的Kp为Ku(临界增益) │
│ 记录振荡周期为Tu(临界周期) │
│ │
│ 步骤3:根据下表计算PID参数 │
│ │
│ ┌─────────┬──────────┬──────────┬──────────┐ │
│ │ 控制器 │ Kp │ Ti │ Td │ │
│ ├─────────┼──────────┼──────────┼──────────┤ │
│ │ P │ 0.5×Ku │ ∞ │ 0 │ │
│ │ PI │ 0.45×Ku │ Tu/1.2 │ 0 │ │
│ │ PID │ 0.6×Ku │ Tu/2 │ Tu/8 │ │
│ └─────────┴──────────┴──────────┴──────────┘ │
│ │
│ 示例:Ku=2.0,Tu=10秒 │
│ PID参数:Kp=1.2,Ti=5秒,Td=1.25秒 │
│ │
└─────────────────────────────────────────────────────────────┘5.3 阶跃响应法
阶跃响应法(适用于一阶惯性+纯滞后系统):
┌─────────────────────────────────────────────────────────────┐
│ │
│ 步骤1:给系统施加阶跃输入,记录响应曲线 │
│ │
│ 输出 │
│ ↑ ────────────────────── 稳态值K │
│ │ ╱ │
│ │ ╱ │ │
│ │ ╱ │← 最大斜率点 │
│ │ ╱ │ │
│ ─┼─────┼──────────────────→ 时间 │
│ │←L→│←──── T ────→│ │
│ 滞后时间 时间常数 │
│ │
│ 步骤2:测量参数 │
│ K - 稳态增益(输出变化/输入变化) │
│ L - 纯滞后时间 │
│ T - 时间常数 │
│ │
│ 步骤3:计算PID参数 │
│ ┌─────────┬───────────┬──────────┬──────────┐ │
│ │ 控制器 │ Kp │ Ti │ Td │ │
│ ├─────────┼───────────┼──────────┼──────────┤ │
│ │ PI │ 0.9T/(KL) │ 3.3L │ 0 │ │
│ │ PID │ 1.2T/(KL) │ 2L │ 0.5L │ │
│ └─────────┴───────────┴──────────┴──────────┘ │
│ │
└─────────────────────────────────────────────────────────────┘【停顿总结3】 已完成约1500字,新增内容:
- 微分控制(D)的原理和"预测"作用
- Td参数影响及微分对噪声敏感的问题
- PID各项作用的综合对比表
- 试凑法整定步骤
- Ziegler-Nichols临界比例法
- 阶跃响应法
继续填充PLC中的PID功能块和温度控制实例:
6. PLC中的PID功能块
6.1 西门子PID_Compact功能块
西门子S7-1200/1500 PID_Compact:
┌─────────────────────────────────────────────────────────────┐
│ │
│ ┌─────────────────────────────────────────────┐ │
│ │ PID_Compact │ │
│ │ │ │
│ │ Setpoint ────→ SP OUT ────→ 输出 │
│ │ Input ───────→ PV │ │
│ │ ManualEnable ─→ Mode ───→ 模式 │
│ │ ManualValue ──→ Error ──→ 故障 │
│ │ │ │
│ │ 参数(在功能块属性中设置): │ │
│ │ • Gain (Kp) │ │
│ │ • Ti (积分时间) │ │
│ │ • Td (微分时间) │ │
│ │ • Cycle (采样周期) │ │
│ │ • OutputUpperLimit (输出上限) │ │
│ │ • OutputLowerLimit (输出下限) │ │
│ │ │ │
│ └─────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────┘6.2 西门子PID调用程序
pascal
// 西门子S7-1200 PID_Compact调用示例
// 在循环中断OB(如OB35,100ms)中调用
// 数据块实例
"PID_Temperature"(
Setpoint := "DB_Temp".SP_Temperature, // 设定值
Input := "DB_Temp".PV_Temperature, // 测量值
ManualEnable := "DB_Temp".ManualMode, // 手动使能
ManualValue := "DB_Temp".ManualOutput, // 手动输出值
Output => "DB_Temp".PID_Output, // 控制输出
OutputLimitActive => "DB_Temp".Limit_Active // 限幅激活
);
// PID参数配置(在功能块属性中):
// Gain = 2.0 (比例增益)
// Ti = 30.0s (积分时间)
// Td = 5.0s (微分时间)
// Cycle = 0.1s (采样周期100ms)
// OutputUpperLimit = 100.0
// OutputLowerLimit = 0.0
// 输出到模拟量
"DB_Temp".AO_Raw := REAL_TO_INT("DB_Temp".PID_Output / 100.0 * 27648.0);
%QW96 := "DB_Temp".AO_Raw;6.3 三菱PID指令
三菱FX系列PID指令:
┌─────────────────────────────────────────────────────────────┐
│ │
│ 指令格式:PID S1 S2 S3 D │
│ │
│ 参数说明: │
│ S1 - 设定值(SV)所在寄存器 │
│ S2 - 测量值(PV)所在寄存器 │
│ S3 - 参数表起始地址(连续25个寄存器) │
│ D - 输出值(MV)所在寄存器 │
│ │
│ 参数表结构(S3起始): │
│ ┌───────┬─────────────────────────────────┐ │
│ │ 偏移 │ 说明 │ │
│ ├───────┼─────────────────────────────────┤ │
│ │ +0 │ 动作方向(0=正作用,1=反作用) │ │
│ │ +1 │ 输入滤波系数 │ │
│ │ +2 │ Kp×100(如Kp=2.5则填250) │ │
│ │ +3 │ Ti×100ms(如Ti=30s则填30000) │ │
│ │ +4 │ Td×10ms(如Td=5s则填5000) │ │
│ │ +5 │ 采样周期Ts(单位10ms) │ │
│ │ +6 │ 输出上限 │ │
│ │ +7 │ 输出下限 │ │
│ │ +8~+24│ 内部工作区(自动使用) │ │
│ └───────┴─────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────┘6.4 三菱PID程序示例
三菱FX PID温度控制程序:
┌─────────────────────────────────────────────────────────────┐
│ │
│ // 变量定义: │
│ // D0 = 温度设定值(0~1000,代表0~100.0°C) │
│ // D10 = 温度测量值 │
│ // D100 = PID参数表起始(D100~D124) │
│ // D200 = PID输出值(0~1000) │
│ │
│ // ============================================ │
│ // 初始化PID参数(首次扫描执行) │
│ // ============================================ │
│ LD M8002 // 首次扫描脉冲 │
│ MOV K0 D100 // 动作方向:正作用 │
│ MOV K50 D101 // 输入滤波系数 │
│ MOV K200 D102 // Kp=2.0(200/100) │
│ MOV K30000 D103 // Ti=30s(30000×100ms) │
│ MOV K5000 D104 // Td=5s(5000×10ms) │
│ MOV K10 D105 // 采样周期100ms(10×10ms) │
│ MOV K1000 D106 // 输出上限1000 │
│ MOV K0 D107 // 输出下限0 │
│ │
│ // ============================================ │
│ // PID运算(周期性执行) │
│ // ============================================ │
│ LD M8000 // 常ON │
│ PID D0 D10 D100 D200 // 执行PID运算 │
│ // D200为输出(0~1000) │
│ │
│ // ============================================ │
│ // 输出到DA模块(0~1000 → 0~4000) │
│ // ============================================ │
│ MUL D200 K4 D210 // ×4 │
│ TO K1 K0 D210 K1 // 输出到1号DA模块 │
│ │
└─────────────────────────────────────────────────────────────┘【停顿总结4】 已完成约2000字,新增内容:
- 西门子PID_Compact功能块介绍
- 西门子PID调用程序示例
- 三菱PID指令格式和参数表结构
- 三菱PID程序示例
继续填充自编PID算法和温度控制实例:
7. 自编PID算法
7.1 位置式PID算法
pascal
// 位置式PID算法
// 输出 = Kp×e + Ki×∑e + Kd×(e-e_last)
FUNCTION_BLOCK "FB_PID_Position"
VERSION : 0.1
VAR_INPUT
SetPoint : REAL; // 设定值
ProcessVar : REAL; // 测量值
Kp : REAL; // 比例增益
Ki : REAL; // 积分增益(Kp/Ti)
Kd : REAL; // 微分增益(Kp×Td)
OutMax : REAL; // 输出上限
OutMin : REAL; // 输出下限
Enable : BOOL; // 使能
Reset : BOOL; // 复位
END_VAR
VAR_OUTPUT
Output : REAL; // 控制输出
Error : REAL; // 当前误差
END_VAR
VAR
Integral : REAL := 0.0; // 积分累加
LastError : REAL := 0.0; // 上次误差
P_Term : REAL; // P项
I_Term : REAL; // I项
D_Term : REAL; // D项
END_VAR
BEGIN
IF #Reset THEN
#Integral := 0.0;
#LastError := 0.0;
#Output := 0.0;
ELSIF #Enable THEN
// 计算误差
#Error := #SetPoint - #ProcessVar;
// P项
#P_Term := #Kp * #Error;
// I项(带抗积分饱和)
#Integral := #Integral + #Error;
// 积分限幅
IF #Integral > #OutMax / #Ki THEN
#Integral := #OutMax / #Ki;
ELSIF #Integral < #OutMin / #Ki THEN
#Integral := #OutMin / #Ki;
END_IF;
#I_Term := #Ki * #Integral;
// D项
#D_Term := #Kd * (#Error - #LastError);
#LastError := #Error;
// 计算输出
#Output := #P_Term + #I_Term + #D_Term;
// 输出限幅
IF #Output > #OutMax THEN
#Output := #OutMax;
ELSIF #Output < #OutMin THEN
#Output := #OutMin;
END_IF;
END_IF;
END_FUNCTION_BLOCK7.2 增量式PID算法
pascal
// 增量式PID算法
// Δu = Kp×(e-e1) + Ki×e + Kd×(e-2e1+e2)
// u = u_last + Δu
FUNCTION_BLOCK "FB_PID_Incremental"
VERSION : 0.1
VAR_INPUT
SetPoint : REAL; // 设定值
ProcessVar : REAL; // 测量值
Kp : REAL; // 比例增益
Ki : REAL; // 积分增益
Kd : REAL; // 微分增益
OutMax : REAL; // 输出上限
OutMin : REAL; // 输出下限
Enable : BOOL; // 使能
Reset : BOOL; // 复位
END_VAR
VAR_OUTPUT
Output : REAL; // 控制输出
Error : REAL; // 当前误差
END_VAR
VAR
Error_1 : REAL := 0.0; // 上次误差e(k-1)
Error_2 : REAL := 0.0; // 上上次误差e(k-2)
LastOutput : REAL := 0.0; // 上次输出
DeltaOut : REAL; // 输出增量
END_VAR
BEGIN
IF #Reset THEN
#Error_1 := 0.0;
#Error_2 := 0.0;
#LastOutput := 0.0;
#Output := 0.0;
ELSIF #Enable THEN
// 计算误差
#Error := #SetPoint - #ProcessVar;
// 计算增量
// Δu = Kp×(e-e1) + Ki×e + Kd×(e-2e1+e2)
#DeltaOut := #Kp * (#Error - #Error_1) +
#Ki * #Error +
#Kd * (#Error - 2.0 * #Error_1 + #Error_2);
// 更新输出
#Output := #LastOutput + #DeltaOut;
// 输出限幅
IF #Output > #OutMax THEN
#Output := #OutMax;
ELSIF #Output < #OutMin THEN
#Output := #OutMin;
END_IF;
// 保存历史值
#Error_2 := #Error_1;
#Error_1 := #Error;
#LastOutput := #Output;
END_IF;
END_FUNCTION_BLOCK7.3 位置式与增量式对比
| 特性 | 位置式PID | 增量式PID |
|---|---|---|
| 输出 | 绝对值 | 增量值 |
| 积分累加 | 需要 | 不需要 |
| 手/自切换 | 需要无扰切换处理 | 自然无扰 |
| 积分饱和 | 需要处理 | 不易饱和 |
| 适用场合 | 一般控制 | 步进/伺服控制 |
8. 应用实例:温度PID控制系统
8.1 系统需求
烘箱温度PID控制系统:
┌─────────────────────────────────────────────────────────────┐
│ │
│ 控制对象:电加热烘箱 │
│ 控制目标:恒温控制,精度±1°C │
│ │
│ 硬件配置: │
│ • PLC:西门子S7-1200 │
│ • 温度传感器:PT100(0~300°C) │
│ • 执行器:固态继电器(SSR)控制加热 │
│ • 控制方式:PWM输出(周期1秒) │
│ │
│ 控制要求: │
│ • 设定范围:室温~250°C │
│ • 升温时间:室温到200°C < 30分钟 │
│ • 稳态精度:±1°C │
│ • 无超调或超调<5°C │
│ │
└─────────────────────────────────────────────────────────────┘8.2 系统架构
温度PID控制系统架构:
┌─────────────────────────────────────────────────────────────┐
│ │
│ ┌─────┐ ┌─────┐ ┌─────┐ ┌─────┐ ┌─────┐ │
│ │ HMI │───→│ PLC │───→│ SSR │───→│加热器│───→│烘箱 │ │
│ │设定值│ │ PID │ │ │ │ │ │ │ │
│ └─────┘ └──┬──┘ └─────┘ └─────┘ └──┬──┘ │
│ │ │ │
│ │ ┌─────────────────────┘ │
│ │ │ │
│ │ ↓ │
│ │ ┌─────────┐ │
│ └────│ PT100 │ │
│ │温度传感器│ │
│ └─────────┘ │
│ │
│ 信号流: │
│ 设定值(SP) ──┐ │
│ ⊕──→ PID ──→ 0~100% ──→ PWM ──→ SSR开关 │
│ 测量值(PV) ──┘ 输出 │
│ │
└─────────────────────────────────────────────────────────────┘8.3 完整控制程序
数据块定义:
pascal
// DB_TempPID - 温度PID控制数据块
DATA_BLOCK "DB_TempPID"
VERSION : 0.1
STRUCT
// 设定值与测量值
SP_Temp : REAL := 150.0; // 温度设定值(°C)
PV_Temp : REAL; // 温度测量值(°C)
// PID参数
PID_Kp : REAL := 3.0; // 比例增益
PID_Ti : REAL := 120.0; // 积分时间(秒)
PID_Td : REAL := 30.0; // 微分时间(秒)
// PID输出
PID_Output : REAL; // PID输出(0~100%)
// PWM参数
PWM_Period : INT := 1000; // PWM周期(ms)
PWM_Counter : INT; // PWM计数器
PWM_Output : BOOL; // PWM输出
// 状态与报警
Enable : BOOL; // PID使能
Manual_Mode : BOOL; // 手动模式
Manual_Output : REAL; // 手动输出值
Alarm_High : BOOL; // 高温报警
Alarm_Low : BOOL; // 低温报警
Alarm_Break : BOOL; // 断线报警
// 内部变量
AI_Raw : INT; // 模拟量原始值
END_STRUCT;
END_DATA_BLOCKOB35循环中断(100ms)- PID运算:
pascal
// OB35 - 100ms循环中断,PID运算
ORGANIZATION_BLOCK "PID_Cyclic"
VERSION : 0.1
BEGIN
// ========================================
// 温度PID控制程序
// 采样周期:100ms
// ========================================
// 1. 读取温度(PT100模块)
"DB_TempPID".AI_Raw := %IW64;
// 断线检测
IF ("DB_TempPID".AI_Raw > 32000) OR ("DB_TempPID".AI_Raw < -500) THEN
"DB_TempPID".Alarm_Break := TRUE;
"DB_TempPID".PV_Temp := 0.0;
ELSE
"DB_TempPID".Alarm_Break := FALSE;
// 转换为温度值(假设原始值直接为温度×10)
"DB_TempPID".PV_Temp := INT_TO_REAL("DB_TempPID".AI_Raw) / 10.0;
END_IF;
// 2. 高低温报警
IF "DB_TempPID".PV_Temp > 260.0 THEN
"DB_TempPID".Alarm_High := TRUE;
ELSE
"DB_TempPID".Alarm_High := FALSE;
END_IF;
IF "DB_TempPID".PV_Temp < 30.0 AND "DB_TempPID".Enable THEN
"DB_TempPID".Alarm_Low := TRUE;
ELSE
"DB_TempPID".Alarm_Low := FALSE;
END_IF;
// 3. PID控制
IF "DB_TempPID".Enable AND NOT "DB_TempPID".Alarm_Break THEN
IF "DB_TempPID".Manual_Mode THEN
// 手动模式
"DB_TempPID".PID_Output := "DB_TempPID".Manual_Output;
ELSE
// 自动模式 - 调用PID功能块
"PID_Temp_Instance"(
Setpoint := "DB_TempPID".SP_Temp,
Input := "DB_TempPID".PV_Temp,
Output => "DB_TempPID".PID_Output
);
END_IF;
ELSE
// 停止时输出为0
"DB_TempPID".PID_Output := 0.0;
END_IF;
// 输出限幅
IF "DB_TempPID".PID_Output > 100.0 THEN
"DB_TempPID".PID_Output := 100.0;
ELSIF "DB_TempPID".PID_Output < 0.0 THEN
"DB_TempPID".PID_Output := 0.0;
END_IF;
// 高温保护
IF "DB_TempPID".Alarm_High THEN
"DB_TempPID".PID_Output := 0.0;
END_IF;
END_ORGANIZATION_BLOCKOB1主程序 - PWM输出:
pascal
// OB1 - 主程序,PWM生成
ORGANIZATION_BLOCK "Main"
VERSION : 0.1
VAR_TEMP
PWM_OnTime : INT; // PWM导通时间
END_VAR
BEGIN
// ========================================
// PWM输出生成
// 周期1000ms,在主程序中计数
// ========================================
// 计算导通时间(输出百分比 × 周期)
#PWM_OnTime := REAL_TO_INT("DB_TempPID".PID_Output / 100.0 *
INT_TO_REAL("DB_TempPID".PWM_Period));
// PWM计数器(每个扫描周期约10ms)
"DB_TempPID".PWM_Counter := "DB_TempPID".PWM_Counter + 10;
IF "DB_TempPID".PWM_Counter >= "DB_TempPID".PWM_Period THEN
"DB_TempPID".PWM_Counter := 0;
END_IF;
// PWM输出判断
IF "DB_TempPID".PWM_Counter < #PWM_OnTime THEN
"DB_TempPID".PWM_Output := TRUE;
ELSE
"DB_TempPID".PWM_Output := FALSE;
END_IF;
// 输出到DO点(控制SSR)
%Q0.0 := "DB_TempPID".PWM_Output AND "DB_TempPID".Enable;
// 状态指示
%Q0.1 := "DB_TempPID".Enable; // 运行指示
%Q0.2 := "DB_TempPID".Alarm_High; // 高温报警
%Q0.3 := "DB_TempPID".Alarm_Break; // 断线报警
END_ORGANIZATION_BLOCK【停顿总结5】 已完成约2800字,新增内容:
- 自编位置式PID算法(带抗积分饱和)
- 自编增量式PID算法
- 位置式与增量式PID对比
- 温度PID控制系统需求和架构
- 完整控制程序(数据块、PID运算、PWM输出)
继续完成PID调试和本节总结:
9. PID调试与优化
9.1 调试步骤
PID调试实践步骤:
┌─────────────────────────────────────────────────────────────┐
│ │
│ 步骤1:系统检查 │
│ ├─确认传感器工作正常,测量值准确 │
│ ├─确认执行器动作正确(手动测试) │
│ └─确认PID输出能正常控制执行器 │
│ │
│ 步骤2:确定控制方向 │
│ ├─正作用:PV上升时输出应下降(如制冷) │
│ └─反作用:PV上升时输出应上升(如加热) │
│ │
│ 步骤3:初始参数设置 │
│ ├─Kp = 1.0(起始值) │
│ ├─Ti = 9999(先关闭积分) │
│ └─Td = 0(先关闭微分) │
│ │
│ 步骤4:调整Kp │
│ ├─逐步增大Kp,观察响应 │
│ ├─直到响应较快但不振荡 │
│ └─记录此时Kp值 │
│ │
│ 步骤5:加入Ti │
│ ├─设置Ti,从大值开始(如120秒) │
│ ├─逐步减小Ti,直到稳态误差消除 │
│ └─Ti太小会引起振荡 │
│ │
│ 步骤6:加入Td(如需要) │
│ ├─从小值开始(如Ti/4) │
│ ├─观察超调是否减小 │
│ └─Td太大会放大噪声 │
│ │
│ 步骤7:整体优化 │
│ └─根据实际响应微调各参数 │
│ │
└─────────────────────────────────────────────────────────────┘9.2 常见问题与解决
| 现象 | 可能原因 | 解决方法 |
|---|---|---|
| 响应慢 | Kp太小 | 增大Kp |
| 持续振荡 | Kp太大或Ti太小 | 减小Kp或增大Ti |
| 有稳态误差 | 无积分或Ti太大 | 加入或减小Ti |
| 超调大 | Ti太小或无微分 | 增大Ti或加入Td |
| 输出抖动 | Td太大/噪声 | 减小Td或加滤波 |
| 单向偏差 | 传感器误差 | 校准传感器 |
9.3 参数记录表
PID参数记录表(建议保存):
┌─────────────────────────────────────────────────────────────┐
│ │
│ 项目名称:烘箱温度控制 │
│ 调试日期:2024-XX-XX │
│ 调试人员: │
│ │
│ 最终参数: │
│ ┌────────────┬────────────┬────────────────────────┐ │
│ │ 参数 │ 值 │ 备注 │ │
│ ├────────────┼────────────┼────────────────────────┤ │
│ │ Kp │ 3.0 │ │ │
│ │ Ti │ 120s │ 积分时间 │ │
│ │ Td │ 30s │ 微分时间 │ │
│ │ 采样周期 │ 100ms │ OB35周期 │ │
│ │ 输出上限 │ 100% │ │ │
│ │ 输出下限 │ 0% │ │ │
│ └────────────┴────────────┴────────────────────────┘ │
│ │
│ 性能指标: │
│ ├─上升时间:约15分钟(室温→200°C) │
│ ├─超调量:<3°C │
│ ├─稳态精度:±0.5°C │
│ └─调节时间:约20分钟 │
│ │
└─────────────────────────────────────────────────────────────┘本节小结
PID控制原理与应用知识要点:
┌─────────────────────────────────────────────────────────────┐
│ │
│ PID原理 各项作用 参数整定 │
│ ├─闭环控制 ├─P:快速响应 ├─试凑法 │
│ ├─误差反馈 ├─I:消除稳差 ├─Z-N法 │
│ └─连续调节 └─D:抑制超调 └─阶跃响应法 │
│ │
│ 功能块使用 自编算法 温度控制 │
│ ├─PID_Compact ├─位置式PID ├─PT100采集 │
│ ├─三菱PID指令 ├─增量式PID ├─PWM输出 │
│ └─参数配置 └─抗饱和处理 └─报警保护 │
│ │
│ 调试要点: │
│ 1. 先P后I再D,逐步调整 │
│ 2. 观察响应曲线,判断参数方向 │
│ 3. 记录参数和性能指标 │
│ 4. 注意积分饱和和微分噪声问题 │
│ │
└─────────────────────────────────────────────────────────────┘练习题
基础题
- PID中P、I、D各代表什么?各有什么作用?
- 什么是稳态误差?哪个参数可以消除稳态误差?
- 位置式PID和增量式PID有什么区别?
计算题
- 使用Z-N法,测得Ku=4.0,Tu=20秒,计算PID参数。
- 某温度控制系统Ti=60秒,采样周期T=0.1秒,计算积分增益Ki=Kp×T/Ti(设Kp=2)。
编程题
- 编写一个简单的位置式PID功能块
- 实现一个带PWM输出的温度控制程序
- 为PID控制添加手动/自动切换功能
思考题
- 为什么微分项对噪声敏感?如何解决?
- 积分饱和会导致什么问题?如何避免?
- 如何判断PID参数是否调整合适?
拓展阅读
- 西门子TIA Portal帮助:PID控制
- 三菱FX编程手册:PID指令
- 自动控制原理教程
- 过程控制系统设计与调试
本节完