在Codesys中用ST语言编写程序实现PID算法程序

Codesys下ST语言编程实现PID算法实战教程

一、PID介绍

PID 是 Proportional(比例)、Integral(积分)、Differential(微分)的首字母缩写;是一种结合比例、积分和微分三种环节于一体的闭环控制算法。PID 控制的实质是对目标值和实际值误差进行比例、积分、微分运算后的结果用来作用在输出上。

  • 比例 (P)

比例控制是最简单的一种控制方式,成比例的反应控制系统中输入与输出的偏差信号,只要偏差一旦产生,就立即产生控制的作用来减小产生的误差。比例控制器的输出与输入成正比关系,能够迅速的反应偏差,偏差减小的速度取决于比例系数 Kp,Kp 越大偏差减小的就越快,但是极易引起震荡;Kp 减小发生震荡的可能性减小,但是调节的速度变慢,单纯的比例控制存在不能消除的静态误差,这里就需要积分来控制。

  • 积分(I)

在比例控制环节产生了静态误差,在积分环节中,主要用于就是消除静态误差提高系统的无差度。积分作用的强弱,取决于积分时间常数 Ti,Ti 越大积分作用越弱,反之则越强。积分控制作用的存在与偏差 e(t) 的存在时间有关,只要系统存在着偏差,积分环节就会不断起作用,对输入偏差进行积分,使控制器的输出及执行器的开度不断变化,产生控制作用以减小偏差。在积分时间足够的情况下,可以完全消除静差,这时积分控制作用将维持不变。Ti 越小,积分速度越快,积分作用越强。积分作用太强会使系统超调加大,甚至使系统出现振荡。

  • 微分(D)

微分环节的作用是反应系统偏差的一个变化趋势,也可以说是变化率,可以在误差来临之前提前引入一个有效的修正信号,有利于提高输出响应的快速性, 减小被控量的超调和增加系统的稳定性,虽然积分环节可以消除静态误差但是降低了系统的响应速度,所以引入微分控制器就显得很有必要,尤其是具有较大惯性的被控对象使用 PI 控制器很难得到很好的动态调节品质,系统会产生较大的超调和振荡,这时可以引入微分作用。在偏差刚出现或变化的瞬间,不仅根据偏差量作出及时反应(即比例控制作用),还可以根据偏差量的变化趋势(速度)提前给出较大的控制作用(即微分控制作用),将偏差消灭在萌芽状态,这样可以大大减小系统的动态偏差和调节时问,使系统的动态调节品质得以改善。微分环节有助于系统减小超调,克服振荡,加快系统的响应速度,减小调节时间,从而改善了系统的动态性能,但微分时间常数过大,会使系统出现不稳定。微分控制作用一个很大的缺陷是容易引入高频噪声,所有在干扰信号比较严重的流量控制系统中不宜引入微分控制作用。

二、PID公式说明

PID的流程本质上是通过误差信号控制被控量,而控制器本身就是比例、积分、微分三个环节的加和

请添加图片描述

连续性PID的公式如下
u ( t ) = K ∗ p ⋅ e ( t ) + K ∗ i ⋅ ∫ ∗ 0 t e ( τ )   d τ + K ∗ d ⋅ d e ( t ) d t u(t) = K*_p \cdot e(t) + K_*i \cdot \int*_{0}^{t} e(\tau) \, d\tau + K_*d \cdot \frac{de(t)}{dt} u(t)=Kpe(t)+Ki0te(τ)dτ+Kddtde(t)

  • (u(t)) 是时间 (t) 的控制输出。

  • (K*p)、(Ki) 和 (K_d) 分别是比例、积分和微分常数。

  • (e(t)) 是时间 (t) 的误差,计算方式为设定值与测量过程变量的差异。

  • 积分项涉及过去误差随时间的累积。

  • 微分项表示误差的变化率。 PID控制器的每个组成部分(比例、积分和微分)对整体控制作用有不同的贡献,调整这些常数对于实现所需的系统响应至关重要。

在实际的工程中,我们的Codesys控制器是按照扫描周期去执行程序的,是离散时间的系统控制,因此必须把公式转成离散化模型,这样控制器才可以进行计算。

离散型PID控制器的基本公式如下:
u [ k ] = K p ⋅ e [ k ] + K i ⋅ ∑ i = 0 k e [ i ] + K d ⋅ ( e [ k ] − e [ k − 1 ] ) u[k] = K_p \cdot e[k] + K_i \cdot \sum_{i=0}^{k} e[i] + K_d \cdot (e[k] - e[k-1]) u[k]=Kpe[k]+Kii=0ke[i]+Kd(e[k]e[k1])

  • (u[k]) 是时间步 (k) 的控制输出。
  • (K_p)、(K_i) 和 (K_d) 分别是比例、积分和微分常数。
  • (e[k]) 是时间步 (k) 的误差,计算方式为设定值与测量过程变量的差异。
  • 积分项涉及过去误差的累积,通常通过对误差进行累加求和得到。
  • 微分项表示当前误差与上一步误差的差异。

离散型PID控制器的每个组成部分对于控制离散时间系统具有不同的影响,调整这些常数以适应系统需求至关重要。

三、Codesys用ST语言实现PID算法流程

1 平台说明

  • 操作系统 : Windows10
  • 编程软件: Codesys v3.5 SP19
  • 编程语言:ST

2 工程创建流程

(1) 新建Codesys工程,依次点击【文件】—【新建工程】—【标准工程】— 输入名称,如下图所示

请添加图片描述

(2) 设备可以任意选,这里选择【CODESYS Control Win V3】,编程语言选择【结构化文本(ST)】,点击【确定】

请添加图片描述

(3) 右键点击【Application】—【添加对象】—【Pou】

请添加图片描述

(4) 【名称】为FB_PID , 【类型(T)】为功能块 ,【实现语言】为结构化文本(ST) .

请添加图片描述

(5) 在功能块FB_PID中,编写程序 实现PID功能

请添加图片描述

3、使用Codesys的trace功能进行仿真,如下所示

请添加图片描述

四、补充说明

1、积分分离的PID控制算法

当被控量与设定值偏差较大时,取消积分作用; 当被控量接近给定值时,引入积分控制,以消除静差,提高精度与稳定速度。

//实时误差值过大时,积分系数为0
IF (rCurrent_Error > 100) THEN 
	rKi := 0;
END_IF

2、抗积分饱和的PID控制算法

​ 所谓积分饱和现象是指若系统存在一个方向的偏差,PID控制器的输出由于积分作用的不断累加而加大,从而导致u(k)达到极限位置。此后若控制器输出继续增大,u(k)也不会再增大,即系统输出超出正常运行范围而进入了饱和区。一旦出现反向偏差,u(k)逐渐从饱和区退出。进入饱和区愈深则退饱和时间愈长。此段时间内,执行机构仍停留在极限位置而不能随着偏差反向立即做出相应的改变,这时系统就像失去控制一样,造成控制性能恶化。这种现象称为积分饱和现象或积分失控现象
  防止积分饱和的方法之一——抗积分饱和法,该方法的思路是在计算u(k)时,首先判断上一时刻的控制量u(k-1)是否已经超出了极限范围: 若u(k-1)>umax,则只累加负偏差; 若u(k-1)<umin,则只累加正偏差。避免了控制量长时间在饱和区。

//如果当前值超过最大,则只积累负偏差
IF  rCurrentValue > rMaxValue THEN 
	IF rCurrent_Error < 0 THEN 
		rIntergral := rIntergral + rCurrent_Error;
	END_IF
END_IF
//如果当前值小于最小,则只积累正偏差
IF  rCurrentValue < rMinValue THEN 
	IF rCurrent_Error > 0 THEN 
		rIntergral := rIntergral + rCurrent_Error;
	END_IF
END_IF

3、变积分的PID控制算法

​ 变积分PID的基本思想是设法改变积分项的累加速度,使其与偏差大小相对应:偏差越大,积分越慢; 偏差越小,积分越快。具体实现思路为:

//如果大于150 系数为0
IF rCurrent_Error > 150 THEN 
	rRation := 0;
//如果在120和150 成比例变化
ELSIF rCurrent_Error > 120 AND rCurrent_Error<150  
	rRation := (150.0- rCurrent_Error) / 30.0;
ELSE //如果小于120,系数为1
	rRation := 1.0;
END_IF
//最终改变rKi
rKi := rKi * rRation;

五、代码下载和B站完整视频教程

为更好的理解在Codesys中用ST语言编写PID算法,已经录制成详细的视频教程,并包括源代码以及FB_PID的使用事项。

请添加图片描述
在这里插入图片描述
请添加图片描述

  • 39
    点赞
  • 54
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值