请教一下关于PID自整定的三个参数的计算方法

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了请教一下关于PID自整定的三个参数的计算方法相关的知识,希望对你有一定的参考价值。

最近想要实现 计算机程序+AD输出设备 来代替温控器做温度控制,关于P I D这三个参数的计算,异常的令人头疼,本人计算机专业,查了很多这方面资料,全是工业术语,根本看不懂,求高人用白话告诉我如何利用已知量求出这三个参数。加热箱的特性是:从室温加热到120度时断电,之后会惯性的增长到140度以后再向下降。加热箱是密闭的,靠加热片加热,自然冷却。

给你个Step 7写的PID控制的FC模块。带"_IN"与带"_OUT"的变量,如果前缀是一样的,要求连接同一个变量。

FUNCTION FC1 : VOID

VAR_INPUT
Run:BOOL; //True-运行,False-停止
Auto:BOOL; //True-自动,False-手动
ISW:BOOL; //True-积分有效,False-积分无效
DSW:BOOL; //True-微分有效,False-微分无效
SetMV:REAL; //手动时的开度设定值
SVSW:REAL; //当设定值低于SVSW时,开度为零
PV:REAL; //测量值
SV:REAL; //设定值
DeadBand:REAL; //死区大小
PBW:REAL; //比例带大小
IW:REAL; //积分带大小
DW:REAL; //微分带大小
dErr_IN:REAL; //误差累积
LastPV_IN:REAL; //上一控制周期的测量值
END_VAR

VAR_OUTPUT
MV:REAL; //输出开度
dErr_OUT:REAL; //误差累积
LastPV_OUT:REAL;//上一控制周期的测量值
END_VAR

VAR
Err:REAL; //误差
dErr:REAL; //误差累积
PBH:REAL; //比例带上限
PBL:REAL; //比例带下限
PVC:REAL; //测量值在一个控制周期内的变化率,即测量值变化速率
P:REAL; //比例项
I:REAL; //积分项
D:REAL; //微分项
END_VAR

IF Run=1 THEN
IF Auto=1 THEN
IF SV>=SVSW THEN
Err:=SV-PV;
PBH:=SV+PBW;
PBL:=SV-PBW;
IF PV<PBL THEN
MV:=1;
ELSIF PV>PBH THEN
MV:=0;
ELSE
P:=(PBH-PV)/(PBH-PBL); //计算比例项
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////以下为积分项的计算//////////////////////////////////////////////////////////////
IF ISW=1 THEN
dErr:=dErr_IN;
IF (PV<(SV-DeadBand)) OR (PV>(SV+DeadBand)) THEN
IF (dErr+Err)<(0-IW) THEN
dErr:=0-IW;
ELSIF (dErr+Err)>IW THEN
dErr:=IW;
ELSE
dErr:=dErr+Err;
END_IF;
END_IF;
I:=dErr/IW;
dErr_OUT:=dErr;
ELSE
I:=0;
END_IF;
/////////////////////////////////////////////以上为积分项的计算//////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////以下为微分项的计算//////////////////////////////////////////////////////////////
IF DSW=1 THEN
PVC:=LastPV_IN-PV;
D:=PVC/DW;
LastPV_OUT:=PV;
ELSE
D:=0;
END_IF;
/////////////////////////////////////////////以上为微分项的计算//////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
IF (P+I+D)>1 THEN
MV:=1;
ELSIF (P+I+D)<0 THEN
MV:=0;
ELSE
MV:=P+I+D;
END_IF;
END_IF;
ELSE
MV:=0;
END_IF;
ELSE
MV:=SetMV;
END_IF;
ELSE
MV:=0;
END_IF;

END_FUNCTION

进行整定时先进行P调节,使I和D作用无效,观察温度变化曲线,若变化曲线多次出现波形则应该放大比例(P)参数,若变化曲线非常平缓,则应该缩小比例(P)参数。比例(P)参数设定好后,设定积分(I)参数,积分(I)正好与P参数相反,曲线平缓则需要放大积分(I),出现多次波形则需要缩小积分(I)。比例(P)和积分(I)都设定好以后设定微分(D)参数,微分(D)参数与比例(P)参数的设定方法是一样的。

当初写这段程序的就是为了使用调功器来控制炉子的温度的,已经在我单位的调功器上运行成功了,还有就是我单位的调功器没有使用微分(D),只是用了比例(P)和积分(I)。追问

程序刚看到,我还没付诸实践,但是想先问下这个是手动的还是自动的?因为我们的设备是无人看管的,需要计算机根据情况自动调整P I D这3个数,精度要求不大120度±1℃就差不多了,当然精度大更好了,还有,其中那个比例带,积分带和微分带都是从哪里计算的啊?死区又是什么?

参考技术A PID是比例、积分、微分的简称,PID控制的难点不是编程,而是控制器的参数整定。参数整定的关键是正确地理解各参数的物理意义,PID控制的原理可以用人对炉温的手动控制来理解。
1.比例控制

有经验的操作人员手动控制电加热炉的炉温,可以获得非常好的控制品质,PID控制与人工控制的控制策略有很多相似的地方。

下面介绍操作人员怎样用比例控制的思想来手动控制电加热炉的炉温。假设用热电偶检测炉温,用数字仪表显示温度值。在控制过程中,操作人员用眼睛读取炉温,并与炉温给定值比较,得到温度的误差值。然后用手操作电位器,调节加热的电流,使炉温保持在给定值附近。

操作人员知道炉温稳定在给定值时电位器的大致位置(我们将它称为位置L),并根据当时的温度误差值调整控制加热电流的电位器的转角。炉温小于给定值时,误差为正,在位置L的基础上顺时针增大电位器的转角,以增大加热的电流。炉温大于给定值时,误差为负,在位置L的基础上反时针减小电位器的转角,并令转角与位置L的差值与误差成正比。上述控制策略就是比例控制,即PID控制器输出中的比例部分与误差成正比。

闭环中存在着各种各样的延迟作用。例如调节电位器转角后,到温度上升到新的转角对应的稳态值时有较大的时间延迟。由于延迟因素的存在,调节电位器转角后不能马上看到调节的效果,因此闭环控制系统调节困难的主要原因是系统中的延迟作用。

比例控制的比例系数如果太小,即调节后的电位器转角与位置L的差值太小,调节的力度不够,使系统输出量变化缓慢,调节所需的总时间过长。比例系数如果过大,即调节后电位器转角与位置L的差值过大,调节力度太强,将造成调节过头,甚至使温度忽高忽低,来回震荡。

增大比例系数使系统反应灵敏,调节速度加快,并且可以减小稳态误差。但是比例系数过大会使超调量增大,振荡次数增加,调节时间加长,动态性能变坏,比例系数太大甚至会使闭环系统不稳定。

单纯的比例控制很难保证调节得恰到好处,完全消除误差。
参考技术B Step 7写的PID控制的FC模块。带"_IN"与带"_OUT"的变量,如果前缀是一样的,要求连接同一个变量。
FUNCTION FC1 : VOID
VAR_INPUT
Run:BOOL; //True-运行,False-停止
Auto:BOOL; //True-自动,False-手动
ISW:BOOL; //True-积分有效,False-积分无效
DSW:BOOL; //True-微分有效,False-微分无效
SetMV:REAL; //手动时的开度设定值
SVSW:REAL; //当设定值低于SVSW时,开度为零
PV:REAL; //测量值
SV:REAL; //设定值
DeadBand:REAL; //死区大小
PBW:REAL; //比例带大小
IW:REAL; //积分带大小
DW:REAL; //微分带大小
dErr_IN:REAL; //误差累积
LastPV_IN:REAL; //上一控制周期的测量值
END_VAR
VAR_OUTPUT
MV:REAL; //输出开度
dErr_OUT:REAL; //误差累积
LastPV_OUT:REAL;//上一控制周期的测量值
END_VAR
VAR
Err:REAL; //误差
dErr:REAL; //误差累积
PBH:REAL; //比例带上限
PBL:REAL; //比例带下限
PVC:REAL; //测量值在一个控制周期内的变化率,即测量值变化速率
P:REAL; //比例项
I:REAL; //积分项
D:REAL; //微分项
END_VAR
IF Run=1 THEN
IF Auto=1 THEN
IF SV>=SVSW THEN
Err:=SV-PV;
PBH:=SV+PBW;
PBL:=SV-PBW;
IF PV<PBL THEN
MV:=1;
ELSIF PV>PBH THEN
MV:=0;
ELSE
P:=(PBH-PV)/(PBH-PBL); //计算比例项
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////以下为积分项的计算//////////////////////////////////////////////////////////////
IF ISW=1 THEN
dErr:=dErr_IN;
IF (PV<(SV-DeadBand)) OR (PV>(SV+DeadBand)) THEN
IF (dErr+Err)<(0-IW) THEN
dErr:=0-IW;
ELSIF (dErr+Err)>IW THEN
dErr:=IW;
ELSE
dErr:=dErr+Err;
END_IF;
END_IF;
I:=dErr/IW;
dErr_OUT:=dErr;
ELSE
I:=0;
END_IF;
/////////////////////////////////////////////以上为积分项的计算//////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////以下为微分项的计算//////////////////////////////////////////////////////////////
IF DSW=1 THEN
PVC:=LastPV_IN-PV;
D:=PVC/DW;
LastPV_OUT:=PV;
ELSE
D:=0;
END_IF;
/////////////////////////////////////////////以上为微分项的计算//////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
IF (P+I+D)>1 THEN
MV:=1;
ELSIF (P+I+D)<0 THEN
MV:=0;
ELSE
MV:=P+I+D;
END_IF;
END_IF;
ELSE
MV:=0;
END_IF;
ELSE
MV:=SetMV;
END_IF;
ELSE
MV:=0;
END_IF;
END_FUNCTION
进行整定时先进行P调节,使I和D作用无效,观察温度变化曲线,若变化曲线多次出现波形则应该放大比例(P)参数,若变化曲线非常平缓,则应该缩小比例(P)参数。比例(P)参数设定好后,设定积分(I)参数,积分(I)正好与P参数相反,曲线平缓则需要放大积分(I),出现多次波形则需要缩小积分(I)。比例(P)和积分(I)都设定好以后设定微分(D)参数,微分(D)参数与比例(P)参数的设定方法是一样的。
参考技术C Step 7写的PID控制的FC模块。带"_IN"与带"_OUT"的变量,如果前缀是一样的,要求连接同一个变量。

FUNCTION FC1 : VOID

VAR_INPUT
Run:BOOL; //True-运行,False-停止
Auto:BOOL; //True-自动,False-手动
ISW:BOOL; //True-积分有效,False-积分无效
DSW:BOOL; //True-微分有效,False-微分无效
SetMV:REAL; //手动时的开度设定值
SVSW:REAL; //当设定值低于SVSW时,开度为零
PV:REAL; //测量值
SV:REAL; //设定值
DeadBand:REAL; //死区大小
PBW:REAL; //比例带大小
IW:REAL; //积分带大小
DW:REAL; //微分带大小
dErr_IN:REAL; //误差累积
LastPV_IN:REAL; //上一控制周期的测量值
END_VAR

VAR_OUTPUT
MV:REAL; //输出开度
dErr_OUT:REAL; //误差累积
LastPV_OUT:REAL;//上一控制周期的测量值
END_VAR

VAR
Err:REAL; //误差
dErr:REAL; //误差累积
PBH:REAL; //比例带上限
PBL:REAL; //比例带下限
PVC:REAL; //测量值在一个控制周期内的变化率,即测量值变化速率
P:REAL; //比例项
I:REAL; //积分项
D:REAL; //微分项
END_VAR

IF Run=1 THEN
IF Auto=1 THEN
IF SV>=SVSW THEN
Err:=SV-PV;
PBH:=SV+PBW;
PBL:=SV-PBW;
IF PV<PBL THEN
MV:=1;
ELSIF PV>PBH THEN
MV:=0;
ELSE
P:=(PBH-PV)/(PBH-PBL); //计算比例项
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////以下为积分项的计算//////////////////////////////////////////////////////////////
IF ISW=1 THEN
dErr:=dErr_IN;
IF (PV<(SV-DeadBand)) OR (PV>(SV+DeadBand)) THEN
IF (dErr+Err)<(0-IW) THEN
dErr:=0-IW;
ELSIF (dErr+Err)>IW THEN
dErr:=IW;
ELSE
dErr:=dErr+Err;
END_IF;
END_IF;
I:=dErr/IW;
dErr_OUT:=dErr;
ELSE
I:=0;
END_IF;
/////////////////////////////////////////////以上为积分项的计算//////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////以下为微分项的计算//////////////////////////////////////////////////////////////
IF DSW=1 THEN
PVC:=LastPV_IN-PV;
D:=PVC/DW;
LastPV_OUT:=PV;
ELSE
D:=0;
END_IF;
/////////////////////////////////////////////以上为微分项的计算//////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
IF (P+I+D)>1 THEN
MV:=1;
ELSIF (P+I+D)<0 THEN
MV:=0;
ELSE
MV:=P+I+D;
END_IF;
END_IF;
ELSE
MV:=0;
END_IF;
ELSE
MV:=SetMV;
END_IF;
ELSE
MV:=0;
END_IF;

END_FUNCTION

进行整定时先进行P调节,使I和D作用无效,观察温度变化曲线,若变化曲线多次出现波形则应该放大比例(P)参数,若变化曲线非常平缓,则应该缩小比例(P)参数。比例(P)参数设定好后,设定积分(I)参数,积分(I)正好与P参数相反,曲线平缓则需要放大积分(I),出现多次波形则需要缩小积分(I)。比例(P)和积分(I)都设定好以后设定微分(D)参数,微分(D)参数与比例(P)参数的设定方法是一样的。

当初写这段程序的就是为了使用调功器来控制炉子的温度的,已经在我单位的调功器上运行成功了,还有就是我单位的调功器没有使用微分(D),只是用了比例(P)和积分(I)。
参考技术D I am always thinking of you steal a shadow

常用的自整定方法

技术分享

技术分享

 

以上是关于请教一下关于PID自整定的三个参数的计算方法的主要内容,如果未能解决你的问题,请参考以下文章

什么是PID参数整定,如何规定PID参数规划整定方法

如何在STM32中实现模糊自整定PID算法

模糊PID控温算法的具体实现:参数自整定模糊PID算法概念

温控仪pid怎样设置,或者是怎样计算的?

模糊控制——模糊自适应整定PID控制

技术Arduino PID自整定库