Codesys使用ST语言实现离散PID模型的仿真(非自带PID模型)

1、序言

要实现恒压供水,恒温控制,恒转速等技术要求,在PLC控制中,一般我们通过通讯或者模拟量采集的方式获取数据,而这些数据的采集都需要一定的时间,数据内容都是离散的,也无法获取连续的数据参数,因此,我们在编程设计时,需要用到PID的离散数学模型。离散PID数学模型的理论分析在之前的博客中已有介绍,参考文章地址:

https://blog.csdn.net/qq_19979629/article/details/123380138

Codesys本身自带PID指令,目前由于学习时间较短,还没将指令研究透,所以暂决定自行编写PID模型先测试功能,哈!

本文主要通过Codesys软件,采用ST语言编写离散PID模型,并通过软件自带的仿真功能,对建立的PID模型进行验证,通过调整各个参数来验证模型以及调整的效果。

2、模型的建立

离散PID模型表达式如下:

              Codesys使用ST语言实现离散PID模型的仿真(非自带PID模型)_第1张图片

要建立此模型,需要一个设定一个采样时间T,codesys的maintask默认循环时间为20ms,一般不做修改,本文采用10ms作为PID的采样周期(有兴趣的朋友可以调整采样周期自行调试。)用一个0.01s的定时器即可,给一个设定值SV,一个当前实际值PV,历史实际值用数组PVt表示,偏差值用err表示,由于存在积分和微分环节,err采用数组表示,定义一个100的数组,记录最近100次的偏差值,而为了方便查看,分别给用KP,KI,KD作为比例,积分,微分的系数,那么这个PID模型的参数就有如下关系:

PVt[1]=PVt[0];(通过周期循环,将历史实际值挨个写入数组中记录)

PVt[0]=PV;(将当前实际值赋值给PVt[0])

err[k]=SV-PVt[k];(偏差值数组计算)

sum=sum(err[0],err[99]);(求和计算,积分运算使用)

PID=KP*err[0]+KI*sum/100+KD*(err[0]-err[1]);(PID运算表达式)

PV=PV+PID;(实际值运算,本文用模拟测试阶跃响应,实际值函数较简单)

在工业现场,实际值一般通过传感器测量得到,而调整值与实际值之间存在固定的函数关系,以恒压供水为例,压力值F通过压力传感器测试,根据水压公式,F=₰gh,可以倒推出液位高度h,而控制高度通过调整进水速度和出水速度,而出水速度一般为恒定值,那么就只需要控制进水速度即可,也就是说相对本文案例,现场的实际值运算要通过增加函数关系转换成需要调节的值PV,再进行运算。

以上内容比例和积分参考了姚復梁姚工的博客,《不用浮点实现pid_如何用plc软件编写pid算法》且部分内容在程序中借鉴和使用。

3、程序编写

程序涉及到数学运算以及数组等数据处理,因此使用ST语言编写最为方便,根据第二节的内容,其实编写的程序也不复杂,主要通过数组记录历史偏差值,通过数组变换实时更新,设定值通过周期的变化,让PID调整一直运行,程序内容如下:

3.1、变量表

Codesys使用ST语言实现离散PID模型的仿真(非自带PID模型)_第2张图片

 3.2、ST语言程序

Codesys使用ST语言实现离散PID模型的仿真(非自带PID模型)_第3张图片Codesys使用ST语言实现离散PID模型的仿真(非自带PID模型)_第4张图片Codesys使用ST语言实现离散PID模型的仿真(非自带PID模型)_第5张图片

程序说明:

a、PID采样周期0.01s,历史实际值PVt[k]实时记录,每个采样周期记录一个数据,数据保存方式:当前数据记录在PVt[0],第一个周期1来时,先将PVt[0]的数据传给PVt[1],再将当前数据记录在PVt[0],依次保存100个,当数据超过100个时,之前的数据就自动被覆盖,即数组保存的是最近100个采样周期的数据。

b、积分运算用到了求和,本文采用for循环,因此每次求和前需要将原求和值sum清零,否则sum值会一直累加。

c、其他程序内容较简单,自行理解,不做过多解释。

 4、运行及仿真

创建一个跟踪,将SV和PV添加到变量里边,如图所示

Codesys使用ST语言实现离散PID模型的仿真(非自带PID模型)_第6张图片 Codesys使用ST语言实现离散PID模型的仿真(非自带PID模型)_第7张图片

程序编译后进行仿真运行,仿真结果如下

4.1、单比例参数

设置KI=0,KD=0,调整KP,得到以下结果

Codesys使用ST语言实现离散PID模型的仿真(非自带PID模型)_第8张图片

KP=0.1

Codesys使用ST语言实现离散PID模型的仿真(非自带PID模型)_第9张图片

KP=0.5

Codesys使用ST语言实现离散PID模型的仿真(非自带PID模型)_第10张图片

KP=0.8

Codesys使用ST语言实现离散PID模型的仿真(非自带PID模型)_第11张图片 Codesys使用ST语言实现离散PID模型的仿真(非自带PID模型)_第12张图片 Codesys使用ST语言实现离散PID模型的仿真(非自带PID模型)_第13张图片

                      KP=1.2                                         KP=2                                   KP=3

对比KP数值变化的不同曲线结果,我们可以验证比例参数的作用

a、KP<1时,调整曲线没有超调,且KP越大,趋于稳定的速度越快,对比底下的时间轴:KP=0.1时,稳定时间约为3.3s,KP=0.5时,稳定时间约为500ms,KP=0.8时,稳定时间约为250ms

b、KP>1时,调整曲线出现超调,如KP=1.2,而KP=2时,系统震荡,KP=3时,实际值与设定值偏差越来越大,调节系统无法控制。

与理论分析结果基本一致。

4.2、比例+积分参数

在实际PID调整应用中,比例部分必不可少,因此本文先选择KP=0.8,调整KI参数,查看影响

Codesys使用ST语言实现离散PID模型的仿真(非自带PID模型)_第14张图片Codesys使用ST语言实现离散PID模型的仿真(非自带PID模型)_第15张图片

                             KP=0.8,KI=0.01                                                     KP=0.8,KI=0.001

 在选择KP=0.6,调整KI查看曲线结果

Codesys使用ST语言实现离散PID模型的仿真(非自带PID模型)_第16张图片Codesys使用ST语言实现离散PID模型的仿真(非自带PID模型)_第17张图片

                     KP=0.6,KI=0.01                                                     KP=0.6,KI=0.001

 对比KP=0.6,KP=0.8,KI=0.01,KI=0.001时的结果,我们可以发现:

四种情况都出现了超调,KI=0.001时超调量较小(对比纵坐标即可,KI=0.01时纵坐标从3-4,KI=0.001时,纵坐标从3.9-4),实际上,本文的模型是理想模型,根本不存在外部的干扰,且实际值也不存在测量等误差,因此不存在稳态误差,不需要引入积分环节。

与理论分析的结论也基本一致。

4.3、比例+微分参数

选择KP=0.8,调整KD的值,查看曲线结果

Codesys使用ST语言实现离散PID模型的仿真(非自带PID模型)_第18张图片

                                          KP=0.8,KD=0.2

 Codesys使用ST语言实现离散PID模型的仿真(非自带PID模型)_第19张图片    Codesys使用ST语言实现离散PID模型的仿真(非自带PID模型)_第20张图片

                 KP=0.8,KD=0.3                                                    KP=0.8,KD=0.5

 通过查看KD的变化结果,我们得到以下结论:

a、KP=0.8,KD=0.2时,曲线与KP=0.8曲线无明线变化,但通过时间轴坐标可以发现,单独KP=0.8时,稳定时间为250ms,KP=0.8,KD=0.2时,稳定时间为450ms,这就表明微分环节调整了动态的响应过程。

b、KP=0.8,KD=0.3时,曲线与KD=0.2时相比,有了明显的提前刹车的过程,且出现了轻微的超调。

c、KP=0.8,KD=0.5时,曲线提前刹车和超调都比较明显,与KD=0.3相比,若再调大KD,也可能导致系统出现震荡,甚至无法控制。

与理论分析也基本一致。

5、综述

通过CODESYS的ST语言编写的离散PID模型基本验证了之前博文的理论分析结果,对PID调节的三个参数的作用也进行了验证。

当然本文所建立的PID模型过于理想,没有干扰,没有测量误差,因此跟现场环境存在很大的差异,对于PID调节,仅能提供一点理论参考。后续考虑看能否在模型基础上增加干扰等因素再来查看调整效果。

 本文所涉及的程序可在以下地址下载:

CODESYS采用ST语言建立的离散PID模型,可仿真运行-机器学习文档类资源-CSDN文库

你可能感兴趣的:(制造,自动化)