『7x24小时有问必答』
      点击蓝字

PLC自动化汇
关注我们

5. FB_高级PID控制器 - 精密过程控制模块

功能概述

用于实现温度、压力、流量、液位等过程变量的精确闭环控制,集成高级功能如抗积分饱和、无扰切换、设定值斜坡等。

核心特性

完整PID算法比例、积分、微分分离计算
抗积分饱和防止积分项过度累积
无扰切换手动/自动模式平滑过渡
设定值斜坡避免设定值突变冲击
微分滤波减少噪声干扰
实时监控各分量输出和性能指标
FUNCTION_BLOCK  "FB_高级PID"VAR_INPUT       // 模式选择      ib_自动模式 : Bool;  // TRUE=自动,FALSE=手动      ir_手动输出值 : Real;  // 手动输出值      ib_复位积分器 : Bool;  // 复位积分器(上升沿)

       // 过程变量      ir_设定值 : Real;  // 设定值 (SP)      ir_过程变量 : Real;  // 过程变量 (PV)

       // PID参数      ir_比例增益 : Real :=  1.0;  // 比例增益      ir_积分时间 : Real :=  10.0;  // 积分时间(秒)      ir_微分时间 : Real :=  0.0;  // 微分时间(秒)      ir_微分滤波器时间常数 : Real :=  0.1;  // 微分滤波器时间常数

       // 限制参数      ir_输出下限 : Real :=  0.0;  // 输出下限      ir_输出上限 : Real :=  100.0;  // 输出上限      ir_PV量程下限 : Real :=  0.0;  // PV量程下限      ir_PV量程上限 : Real :=  100.0;  // PV量程上限      ir_SP变化下限 : Real :=  0.0;  // SP变化下限      ir_SP变化上限 : Real :=  100.0;  // SP变化上限

       // 高级功能使能      ib_抗积分饱和使能 : Bool := TRUE;  // 抗积分饱和使能      ib_无扰切换使能 : Bool := TRUE;  // 无扰切换使能      ib_微分作用于PV : Bool := TRUE;  // 微分作用于PV(而非误差)      ib_SP斜坡使能 : Bool := FALSE;  // SP斜坡使能

       // SP斜坡参数      ir_SP变化率 : Real :=  1.0;  // SP变化率 (单位/秒)END_VAR
VAR_OUTPUT       // 控制器输出      or_控制器输出 :  Real;  // 控制器输出      ob_输出受限标志 :  Bool;  // 输出受限标志

       // 状态信息      ob_实际自动状态 :  Bool;  // 实际自动状态      or_当前误差 :  Real;  // 当前误差      or_比例项 :  Real;  // 比例项      or_积分项 :  Real;  // 积分项      or_微分项 :  Real;  // 微分项

       // 性能指标      or_绝对误差积分 :  Real;  // 绝对误差积分      or_平方误差积分 :  Real;  // 平方误差积分      or_时间加权绝对误差积分 :  Real;  // 时间加权绝对误差积分

       // 诊断信息      e_控制器状态 :        (            状态_手动,            状态_自动,            状态_跟踪,            状态_故障      );      s_状态信息 :  String[100];END_VAR
VAR      // 内部计算变量      mr_标准化SP : Real; // 标准化SP      mr_标准化PV : Real; // 标准化PV      mr_斜坡后SP : Real; // 斜坡后的SP

      mr_上次误差 : Real; // 上一次误差      mr_上次PV : Real; // 上一次PV      mr_上次微分项 : Real; // 上一次微分项

      mr_偏置项 : Real; // 偏置项(用于无扰切换)      mr_跟踪值 : Real; // 跟踪值

      // 定时控制      fb_采样定时器 : TON;      mr_采样时间 : Real; // 实际采样时间(秒)      mr_上次采样时间 : Real;

      // 抗积分饱和      mb_饱和状态 : Bool;      mr_饱和限制 : Real;

      // SP斜坡控制      mr_上次SP : Real;      fb_斜坡定时器 : TON;

      // 复位边缘检测      mb_复位边缘 : Bool;

      // 性能计算      fb_性能定时器 : TON;      mr_累计时间 : Real;END_VAR
// 边缘检测mb_复位边缘 := ib_复位积分器 AND NOT mb_复位边缘;

// 采样时间控制(固定周期采样)fb_采样定时器(IN := NOT fb_采样定时器.Q, PT := T#100MS);IF fb_采样定时器.Q THEN      mr_采样时间 := TIME_TO_REAL(T#100MS);

       // 计算实际采样时间(用于微分项)      IF mr_上次采样时间 >  0  THEN            mr_采样时间 :=  0.9  * mr_采样时间 +  0.1  * (TIME_TO_REAL(LOCAL_TIME) - mr_上次采样时间);      END_IF;      mr_上次采样时间 := TIME_TO_REAL(LOCAL_TIME);ELSE      RETURN;  // 未到采样时间,退出计算END_IF;

// 输入有效性检查IF (ir_PV量程上限 <= ir_PV量程下限) OR (mr_采样时间 <=  0) THEN      e_控制器状态 := 状态_故障;      s_状态信息 :=  '无效配置参数';      RETURN;END_IF;

// 过程变量标准化 (0-100%)mr_标准化PV := (ir_过程变量 - ir_PV量程下限) / (ir_PV量程上限 - ir_PV量程下限) *  100.0;
// 设定值限制和斜坡IF ib_SP斜坡使能 THEN       // 设定值斜坡      mr_斜坡后SP := mr_上次SP;      IF ir_设定值 > mr_上次SP THEN            mr_斜坡后SP := mr_上次SP + ir_SP变化率 * mr_采样时间;            IF mr_斜坡后SP > ir_设定值 THEN                  mr_斜坡后SP := ir_设定值;            END_IF;      ELSIF ir_设定值 < mr_上次SP THEN            mr_斜坡后SP := mr_上次SP - ir_SP变化率 * mr_采样时间;            IF mr_斜坡后SP < ir_设定值 THEN                  mr_斜坡后SP := ir_设定值;            END_IF;      END_IF;      mr_上次SP := mr_斜坡后SP;ELSE      mr_斜坡后SP := LIMIT(ir_SP变化下限, ir_设定值, ir_SP变化上限);END_IF;
// 设定值标准化 (0-100%)mr_标准化SP := (mr_斜坡后SP - ir_PV量程下限) / (ir_PV量程上限 - ir_PV量程下限) *  100.0;

// 误差计算or_当前误差 := mr_标准化SP - mr_标准化PV;

// 性能指标计算fb_性能定时器(IN := TRUE, PT := T#1S);IF fb_性能定时器.Q THEN      mr_累计时间 := mr_累计时间 +  1.0;      or_绝对误差积分 := or_绝对误差积分 + ABS(or_当前误差) * mr_采样时间;      or_平方误差积分 := or_平方误差积分 + (or_当前误差 * or_当前误差) * mr_采样时间;      or_时间加权绝对误差积分 := or_时间加权绝对误差积分 + mr_累计时间 * ABS(or_当前误差) * mr_采样时间;END_IF;
// 手动/自动模式处理IF NOT ib_自动模式 THEN       // 手动模式      e_控制器状态 := 状态_手动;      ob_实际自动状态 := FALSE;

       // 无扰切换准备:计算偏置项      IF ib_无扰切换使能 THEN            mr_偏置项 := ir_手动输出值 - (or_比例项 + or_积分项 + or_微分项);      ELSE            mr_偏置项 :=  0.0;      END_IF;

      or_控制器输出 := ir_手动输出值;      s_状态信息 :=  '手动模式 - 输出: '  + REAL_TO_STRING(or_控制器输出);

       // 复位积分项(如果请求)      IF mb_复位边缘 THEN            or_积分项 :=  0.0;            or_比例项 :=  0.0;            or_微分项 :=  0.0;      END_IF;

      RETURN;END_IF;
// 自动模式e_控制器状态 := 状态_自动;ob_实际自动状态 := TRUE;

// 比例项计算or_比例项 := ir_比例增益 * or_当前误差;

// 积分项计算(带抗饱和)IF ir_积分时间 >  0  THEN      or_积分项 := or_积分项 + (ir_比例增益 / ir_积分时间) * or_当前误差 * mr_采样时间;ELSE      or_积分项 :=  0.0;  // 积分时间无限大,取消积分作用END_IF;
// 抗积分饱和mb_饱和状态 := FALSE;IF ib_抗积分饱和使能 THEN       // 计算未受限的输出      mr_饱和限制 := ir_输出上限 - (or_比例项 + or_微分项 + mr_偏置项);      IF or_积分项 > mr_饱和限制 THEN            or_积分项 := mr_饱和限制;            mb_饱和状态 := TRUE;      END_IF;

      mr_饱和限制 := ir_输出下限 - (or_比例项 + or_微分项 + mr_偏置项);      IF or_积分项 < mr_饱和限制 THEN            or_积分项 := mr_饱和限制;            mb_饱和状态 := TRUE;      END_IF;END_IF;
// 微分项计算IF ib_微分作用于PV THEN       // 微分作用于PV(减少设定值变化的冲击)      or_微分项 := -ir_比例增益 * ir_微分时间 * (mr_标准化PV - mr_上次PV) / mr_采样时间;ELSE       // 微分作用于误差      or_微分项 := ir_比例增益 * ir_微分时间 * (or_当前误差 - mr_上次误差) / mr_采样时间;END_IF;

// 微分滤波IF ir_微分滤波器时间常数 >  0  THEN      or_微分项 := (mr_采样时间 / (mr_采样时间 + ir_微分滤波器时间常数)) * or_微分项 +                               (ir_微分滤波器时间常数 / (mr_采样时间 + ir_微分滤波器时间常数)) * mr_上次微分项;END_IF;
// 保存当前值用于下一次计算mr_上次误差 := or_当前误差;mr_上次PV := mr_标准化PV;mr_上次微分项 := or_微分项;

// 输出计算or_控制器输出 := or_比例项 + or_积分项 + or_微分项 + mr_偏置项;

// 输出限制ob_输出受限标志 := FALSE;IF or_控制器输出 > ir_输出上限 THEN      or_控制器输出 := ir_输出上限;      ob_输出受限标志 := TRUE;ELSIF or_控制器输出 < ir_输出下限 THEN      or_控制器输出 := ir_输出下限;      ob_输出受限标志 := TRUE;END_IF;
// 状态信息s_状态信息 :=  '自动模式 - 比例: '  +  REAL_TO_STRING(or_比例项) +                          ' 积分: '  +  REAL_TO_STRING(or_积分项) +                          ' 微分: '  +  REAL_TO_STRING(or_微分项) +                          ' 输出: '  +  REAL_TO_STRING(or_控制器输出);// 复位处理IF mb_复位边缘 THEN      or_积分项 :=  0.0;      or_比例项 :=  0.0;      or_微分项 :=  0.0;      mr_上次误差 :=  0.0;      mr_上次PV := mr_标准化PV;      mr_偏置项 :=  0.0;      s_状态信息 :=  '控制器复位';END_IF;END_FUNCTION_BLOCK

应用场景

温度控制加热炉、烘箱)
压力控制空压机、液压系统)
流量控制(阀门、泵)
液位控制(水箱、反应釜)

注意事项

采样时间需根据过程时间常数设置,一般取过程时间常数的1/10~1/5
抗积分饱和功能在输出限幅时必须启用
无扰切换功能在手动/自动切换时避免输出跳变
设定值斜坡可避免对过程的冲击,但需合理设置变化率

调试指南

参数初始化:根据经验设置一组保守参数(如Kp较小,Ti较大)
手动模式测试:在手动模式下改变输出,观察过程变量变化
自动模式测试:切换到自动模式,给定小阶跃变化,观察响应
比例整定:先调整Kp,使系统有较快响应但无持续振荡
积分整定:调整Ti,消除稳态误差,但避免积分饱和
微分整定:调整Td,改善动态性能,减少超调
高级功能测试:测试抗积分饱和、无扰切换等功能
【 看完别滑走!需要你的支持!】
这篇干货文章花了大量时间整理,如果对你有帮助或启发,请一定:
  「评论区」  留下你的想法

  遇到了类似问题?有更好的方法?期待你分享见解!
  「转发」  给更多需要的人

  也许你身边的朋友,正被同样的问题困扰!
  「收藏」  随时回看复习

  知识点需要反复消化,码住不迷路!
每一次互动都是我们继续创作优质内容的动力!

感谢有你,一起进步!

---

---

推荐阅读:
分享让更多人看看
点赞
收藏
分享

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

上一主题上一主题         下一主题下一主题
QQ手机版小黑屋粤ICP备17165530号

关于我们·投诉举报· 用户帮助· 联系我们 · 本站服务 · 版权声明· 隐私政策 · 投搞指南

法律保护:PLC技术网,plcjs.com,plcjs.net等字样
Copyright 2010-2030. All rights reserved. 


微信公众号二维码 抖音二维码 百家号二维码 今日头条二维码哔哩哔哩二维码