Skip to content

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字,介绍了:

  1. 开环控制与闭环控制的区别
  2. PID控制器的基本概念(比例+积分+微分)
  3. PID控制器的结构框图
  4. 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字,新增内容:

  1. 比例控制(P)的原理和Kp参数影响
  2. 积分控制(I)的作用——消除稳态误差
  3. Ti参数对系统的影响
  4. 积分饱和问题及解决方法

继续填充微分控制和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字,新增内容:

  1. 微分控制(D)的原理和"预测"作用
  2. Td参数影响及微分对噪声敏感的问题
  3. PID各项作用的综合对比表
  4. 试凑法整定步骤
  5. Ziegler-Nichols临界比例法
  6. 阶跃响应法

继续填充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字,新增内容:

  1. 西门子PID_Compact功能块介绍
  2. 西门子PID调用程序示例
  3. 三菱PID指令格式和参数表结构
  4. 三菱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_BLOCK

7.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_BLOCK

7.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_BLOCK

OB35循环中断(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_BLOCK

OB1主程序 - 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字,新增内容:

  1. 自编位置式PID算法(带抗积分饱和)
  2. 自编增量式PID算法
  3. 位置式与增量式PID对比
  4. 温度PID控制系统需求和架构
  5. 完整控制程序(数据块、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. 注意积分饱和和微分噪声问题                              │
│                                                             │
└─────────────────────────────────────────────────────────────┘

练习题

基础题

  1. PID中P、I、D各代表什么?各有什么作用?
  2. 什么是稳态误差?哪个参数可以消除稳态误差?
  3. 位置式PID和增量式PID有什么区别?

计算题

  1. 使用Z-N法,测得Ku=4.0,Tu=20秒,计算PID参数。
  2. 某温度控制系统Ti=60秒,采样周期T=0.1秒,计算积分增益Ki=Kp×T/Ti(设Kp=2)。

编程题

  1. 编写一个简单的位置式PID功能块
  2. 实现一个带PWM输出的温度控制程序
  3. 为PID控制添加手动/自动切换功能

思考题

  1. 为什么微分项对噪声敏感?如何解决?
  2. 积分饱和会导致什么问题?如何避免?
  3. 如何判断PID参数是否调整合适?

拓展阅读

  • 西门子TIA Portal帮助:PID控制
  • 三菱FX编程手册:PID指令
  • 自动控制原理教程
  • 过程控制系统设计与调试

本节完

本教程由 AI (Claude Opus 4.5) 生成,仅供学习参考