PID控制器开发笔记之十一:专家PID控制器的实现

摘要:
我们讨论了经典的数字PID控制算法及其常见的改进和补偿算法,该算法基本上涵盖了无模型和简单模型PID控制的大多数经典算法。一般来说,专家控制器分为直接专家控制器和间接专家控制器两种形式。

  前面我们讨论了经典的数字PID控制算法及其常见的改进与补偿算法,基本已经覆盖了无模型和简单模型PID控制经典算法的大部。再接下来的我们将讨论智能PID控制,智能PID控制不同于常规意义下的智能控制,是智能算法与PID控制算法的结合,是基于PID控制器的智能化优化。

  在本章我们首先来探讨一下专家PID算法。正如前面所说,专家PID算法是专家系统与PID算法的结合与应用优化,所以我们接下来先简单了解专家控制。

1、专家控制的基本思想

  专家控制是智能控制的一个分支,是专家系统的理论和技术同控制理论、方法与技术相结合,在无对象模型的情况下,模仿领域专家的经验来实现对被控对象的控制。

  专家控制一般由知识库和推理机构构成主体框架,按照某种策略及时选用恰当的规则进行推理输出,实现控制。其基本结构如下:

 PID控制器开发笔记之十一:专家PID控制器的实现第1张

  有上图我们不难发现影响专家控制器控制精确性的主要是知识库表达的准确性以及推理机的正确性。知识库越完备、越准确那么对你被控对像的状态识别也就越准确。当然,推理机设计的差别也会对控制结果有影响。

  专家控制器一般来说分为2中实现形式,被称之为直接型专家控制器和间接型专家控制器。所谓直接型专家控制器就是用专门设计的专家控制器直接对被控对象进行控制的方法。该控制器任务和功能都比较简单,一般都是实时在线运行,直接对被控对象进行控制。其结构图如下:

 PID控制器开发笔记之十一:专家PID控制器的实现第2张

  而所谓间接型专家控制器是指专家控制器作为其他控制器的辅助方式或者相互结合的控制方式来实现的一种控制器。专家系统通过高层决策来影响控制器输出,而这种高层决策可以是在线也可以是离线,器不会直接控制被控对象。其结构图如下:

 PID控制器开发笔记之十一:专家PID控制器的实现第3张

  所以我们所要讨论的专家PID算法应该是一种直接型专家控制器,因为专家系统决策与PID算法是结合在一起的,并没有独于PID算法的专家控制器,而是专家决策直接决定PID算法机器输出,这与直接型专家控制的定义是相符的。

2、专家PID的设计思路

  专家PID控制就是基于被控对象和控制规律的各种知识,而不需要知道被控对象的精确模型,利用专家经验来设计PID参数。怎么来实现这一过程呢?我们来分析并推导这一算法。

  我们假设当前为第k采样,当前偏差为e(k),同样前一采样时刻的偏差为e(k-1),而前两个采样时刻的偏差为e(k-1),则可以得到两次的偏差增量为:

 PID控制器开发笔记之十一:专家PID控制器的实现第4张

   清楚了以上公式,我们再设定偏差的一个极大值,记为Mmax;设定一个偏差较大的中间值,记为Mmid;设定一个偏差的极小值,记为Mmin。根据以上偏差、偏差增量以及偏差极值的设定,我们分析如下:

1)如果|e(k)|>Mmax

  这种情况说明偏差的绝对值已经很大了,不论偏差变化趋势如何,都应该考虑控制器的输入应按最大(或最小)输出,以达到迅速调整偏差的效果,使偏差绝对值以最大的速度减小。

 PID控制器开发笔记之十一:专家PID控制器的实现第5张

  这种情况下其实相当于实施开环控制,是一种对偏差出现极限情况的快速响应。

2)如果|e(k)|≤Mmax

  这种情况我们需要更具系统的变化趋势来分析,具体的情况实施不同的控制方式,我们引入偏差增量来协助分析。

2.1)当e(k)*e(k)>0或者e(k)=0

  这种情况说明偏差在朝向偏差绝对值增大的方向变化,或者偏差为某一固定值,此时我们再判断偏差的绝对值与偏差的中间值Mmid之间的关系。

(2.1.1)此时如果|e(k)|>Mmid,说明偏差也较大,可考虑由控制器实施较强的控制作用,以达到扭转偏差绝对值向减小的方向变化,并迅速减小偏差的绝对值。

 PID控制器开发笔记之十一:专家PID控制器的实现第6张

(2.1.2)此时如果|e(k)|≤Mmid,说明尽管偏差是向绝对值增大的方向变化,但是偏差绝对值本身并不是很大,可以考虑控制器实施一般的控制作用,只需要扭转偏差的变化趋势,使其向偏差绝对值减小的方向变化即可。

 PID控制器开发笔记之十一:专家PID控制器的实现第7张

(2.2)当e(k)*∆e(k)<0且∆e(k)*∆e(k-1)>0或者e(k)=0时,说明偏差的绝对值向减小的方向变化,或者已经达到平衡状态,此时保持控制器输出不变即可。即:U(k)=U(k-1)。

(2.3)当e(k)*∆e(k)<0且∆e(k)*∆e(k-1)<0时,说明偏差处于极限状态。如果此时偏差的绝对值较大,|e(k)|>Mmid,可以考虑实施较强控制作用。

 PID控制器开发笔记之十一:专家PID控制器的实现第8张

  如果此时偏差绝对值较小,|e(k)|<Mmid,可以考虑实施较弱控制作用。

 PID控制器开发笔记之十一:专家PID控制器的实现第9张

  其中,k1为增益放大系数,k1取大于1的值;k2为增益抑制系数,取大于0而小于1的值。

3)如果|e(k)|<Mmin

  这种情况实际上说明偏差绝对值很小,这种偏差有可能是系统静差引起的,此时必须要引入积分作用,实施PID控制或者PI控制。

 PID控制器开发笔记之十一:专家PID控制器的实现第10张

  Kp和Ki可以适当减小,以减小控制作用。当偏差小到一定程度后,甚至可以引入死区的概念,是系统稳定下来而不需要去进行调节。

3、专家PID算法实现

  前面我们了解了专家PID控制器的基本原理,并分析了一个较为常见的专家PID的控制规则。分析规则的过程其实也是一个推理的基本过程,所以我们得到了基本的规则库同时也有相应的推理机,接下来我们就来实现这一算法。

  首先定义一个专家PID的结构体对象:

 1 /*定义结构体和公用体*/
 2 typedef struct
 3 {
 4   float setpoint;               /*设定值*/
 5   float kp;                     /*比例系数*/
 6   float ki;                     /*积分系数*/
 7   float kd;                     /*微分系数*/
 8   float lasterror;              /*前一拍偏差*/
 9   float preerror;               /*前两拍偏差*/
10   float result;                 /*PID控制器结果*/
11   float output;                 /*输出值,0-100,为百分比值*/
12   float maximum;                /*输出值上限*/
13   float minimum;                /*输出值下限*/
14   float errorabsmax;            /*偏差绝对值最大值*/
15   float errorabsmid;            /*偏差绝对值中位值*/
16   float errorabsmin;            /*偏差绝对值最小值*/
17 }EXPERTPID;

  在上面分析的基础上我们很容易写出来一个专家PID的控制器如下:

 1 void ExpertPID(EXPERTPID vPID,float pv)
 2 {
 3   float thiserror;
 4   float deltaerror;
 5   float lastdeltaerror;
 6   float result;//本次调节输出值
 7  
 8   thiserror=vPID->setpoint-pv;
 9   deltaerror=thiserror-vPID->lasterror;
10   lastdeltaerror=vPID->lasterror-vPID->preerror;
11  
12   if(abs(thiserror)>=vPID->errorabsmax)
13   {/*执行规则1*/
14     if(thiserror>0)
15     {
16       result=vPID->maximum;
17     }
18 
19     if(thiserror<0)
20     {
21       result=vPID->minimum;
22     }
23   }
24  
25   if((thiserror*deltaerror>0)||(deltaerror==0))
26   {/*执行规则2*/
27    
28     if(abs(thiserror)>=vPID->errorabsmid)
29     {
30       result=vPID->result+2.0*(vPID->kp*deltaerror+vPID->ki*thisError+vPID->kd*(deltaerror-lastdeltaerror);
31     }
32     else
33     {
34       result=vPID->result+0.4*(vPID->kp*deltaerror+vPID->ki*thisError+vPID->kd*(deltaerror-lastdeltaerror);
35     }
36   }
37  
38   if(((thiserror*deltaerror<0)&&(deltaerror*lastdeltaerror>0))||(thiserror==0))
39   {/*执行规则3*/
40     result=vPID->result;
41   }
42  
43   if((thiserror*deltaerror<0)&&(deltaerror*lastdeltaerror<0))
44   {/*执行规则4*/
45     if(abs(thiserror)>=vPID->errorabsmid)
46     {
47       result=vPID->result+2.0*output+vPID->kp*thiserror;
48     }
49     else
50     {
51       result=vPID->result+0.6*output+vPID->kp*thiserror;
52     }
53   }
54  
55   if((abs(thiserror)<=vPID->errorabsmin)&&(abs(thiserror)>0))
56   {/*执行规则5*/
57     result=vPID->result+0.5*vPID->kp*deltaerror+0.3*vPID->ki*thiserror;
58   }
59  
60   /*对输出限值,避免超调*/
61   if(result>=vPID->maximum)
62   {
63     result=vPID->maximum;
64   }
65 
66   if(result<=vPID->minimum)
67   {
68     result=vPID->minimum;
69   }
70  
71   vPID->result=result;
72   vPID->preerror=vPID->lasterror;
73   vPID->lasterror=thiserror;
74   vPID->output=(result/(vPID->maximum-vPID->minimum))*100;
75 }

4、专家PID总结

  本节我们实现了一个专家PID控制器,这是一种专家规则直接与PID算法相结合的直接型专家控制器。通过分析PID的调节过程总结了5条规则,以这5条规则为基础实现了上述的算法。当然这只是一个普遍型的规则库,对于不同的被控对象和控制要求,我们可以采用不同的判断规则,而且各参数的选取需依赖于专家经验,所以规则的获取和使用也会有不同方式。

欢迎关注:

PID控制器开发笔记之十一:专家PID控制器的实现第11张

免责声明:文章转载自《PID控制器开发笔记之十一:专家PID控制器的实现》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇C#: static关键字的作用(转)微信小程序小方块下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

yum提示Another app is currently holding the yum lock; waiting for it to exit...

使用yum安装计划任务功能,结果提示: yum -y install vixie-cron 1、Loaded plugins: fastestmirror, refresh-packagekit, security 2、Existing lock /var/run/yum.pid: another copy is running as pid 25960...

2.1 Linux中wait、system 分析

wait与waitpid: 当子进程退出的时候,内核会向父进程发送SIGCHID信号,子进程的退出是一个异步事件(子进程可以在父进程运行的任何时刻终止)。 子进程退出时,内核将子进程置为僵尸状态,这个进程称为僵尸进程,它只保留最小的一些内核数据结构,以便父进程查询子进程的退出状态。 父进程查询子进程的退出状态可以用wait/waitpid函数。 当我们用f...

Linux 进程创建二(execve和wait)

三:execve系统调用 int execve(const char *filename, char *const argv[],char *const envp[]); fork创建了一个新的进程,产生一个新的PID execve用被执行的程序完全替换了调用进程的映像。 execve启动一个新程序,替换原有进程,所以被执行进程的PID不会改变。...

[批处理]NetstatFilter快速查找端口被占用问题

前言 准确的说,他是一个网络连接端口查看器,可以根据进程查端口,也可以根据端口查进程。期初是因在使用Fiddler的时候发现无法启动,提示端口被占用,但是由不知道用什么方法才能找到是哪个程序占用的Fiddler的端口,遂使用命令行的netstat命令配合find命令才找到,遂想写这样一个类似的工具帮助我们速度定位类似端口问题的所在。 PS:可预见很多人会说...

80端口被占用(端口检查)解决

我从会做网站到现在也遇到过了N次了,今天又让我遇到了,我来解决他,并为大家做最详细易懂的分析。 我的情况:我用了一个小插件“黑风Aspweb服务器”代替IIS,尽管如此IIS组件也是要装的。停止IIS中的“默认网站“,意味着停止了80端口的运行,然后打开“黑风Aspweb服务器”即可正常测试网站。 故障现象:今天“默认网站“已经停止,但是打开“黑风Aspwe...

收放卷及张力控制 PID调试技巧

1) 小 Kp( 0.01) , 大 Ti ( 20000ms)2)逐渐增大Kp, 减小Ti ( 20000ms – 3000ms),避免发生震荡3)观察I-out 是否在0附近可能原因:卷径不对、牵引版周或传动比不对、或打滑4) 高速应用,激活微分,0.001逐渐增加,直到D-out = 30% Pout5)高速应用,Kp和线速度近似线性相关...