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

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

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


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


1、专家控制的基本思想


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


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


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


  专家控制器一般来说分为2中实现形式,被称之为直接型专家控制器和间接型专家控制器。所谓直接型专家控制器就是用专门设计的专家控制器直接对被控对象进行控制的方法。该控制器任务//代码效果参考:http://www.jhylw.com.cn/301236049.html

和功能都比较简单,一般都是实时在线运行,直接对被控对象进行控制。其结构图如下:

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


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


2、专家PID的设计思路


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


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


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


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


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


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


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


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


(2.1)当e(k)?e(k)>0或者?e(k)=0时


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


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


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


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


(2.3)当e(k)?e(k)<0且?e(k)?e(k-1)Mmid,可以考虑实施较强控制作用。


  如果此时偏差绝对值较小,|e(k)|

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


(3)如果|e(k)|

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


  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[span style="color: rgba(128, 0, 128, 1)">0)


20 {


21 result=vPID->minimum;


22 }


23 }


24


25 if((thiserrordeltaerror>0)||(deltaerror==0))


26 {/执行规则2/


27


28 if(abs(thiserror)>=vPID->errorabsmid)


29 {


30 result=vPID->result+2.0(vPID->kpdeltaerror+vPID->kithisError+vPID->kd(deltaerror-lastdeltaerror);


31 }


32 else


33 {


34 result=vPID->result+0.4(vPID->kpdeltaerror+vPID->kithisError+vPID->kd(deltaerror-lastdeltaerror);


35 }


36 }


37


38 if(((thiserrordeltaerror[span style="color: rgba(128, 0, 128, 1)">0)&&(deltaerrorlastdeltaerror>0))||(thiserror==0))


39 {/执行规则3/


40 result=vPID->result;


41 }


42


43 if((thiserrordeltaerror[span style="color: rgba(128, 0, 128, 1)">0)&&(deltaerrorlastdeltaerror[span style="color: rgba(128, 0, 128, 1)">0))


44 {/执行规则4/


45 if(abs(thiserror)>=vPID->errorabsmid)


46 {


47 result=vPID->result+2.0output+vPID->kpthiserror;


48 }


49 else


50 {


51 result=vPID->result+0.6output+vPID->kpthiserror;


52 }


53 }


54


55 if((abs(thiserror)errorabsmin)&&(abs(thiserror)>0))


56 {/执行规则5/


57 result=vPID->result+0.5vPID->kpdeltaerror+0.3vPID->kithiserror;


58 }


59


60 /对输出限值,避免超调/


61 if(result>=vPID->maximum)


62 {


63 result=vPID->maximum;


64 }


65


66 if(resultminimum)


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条规则为基础实现了上述的算法。当然这只是一个普遍型的规则库,对于不同的被控对象和控制要求,我们可以采用不同的判断规则,而且各参数的选取需依赖于专家经验,所以规则的获取和使用也会有不同方式。


欢迎关注:


如果阅读这篇文章让您略有所得,还请点击下方的【好文要顶】按钮。


当然,如果您想及时了解我的博客更新,不妨点击下方的【关注我】按钮。

相关文章
|
29天前
|
Linux 芯片
Linux 驱动开发基础知识——查询方式的按键驱动程序_编写框架(十三)
Linux 驱动开发基础知识——查询方式的按键驱动程序_编写框架(十三)
17 2
|
2月前
|
编解码 Java API
Jmeter--控制器--详解,2024年最新系统学Python从零开始
Jmeter--控制器--详解,2024年最新系统学Python从零开始
|
2月前
|
存储 监控 安全
深度剖析Linux进程的内部机制:一探/proc/pid的奥秘
深度剖析Linux进程的内部机制:一探/proc/pid的奥秘
205 0
PID的作用是什么?如何实现西门子S7-1500的PID功能?如何进行PID调试?
PID多用于对温度、压力、流量等过程变量的闭环控制,是PLC不可缺少的功能之一,与S7-300/400相比S7-1500集成的PID功能参数化更加简单,调试更加方便,自整定的鲁棒性更强,可以大大节省工程时间。本篇我们来介绍S7-1500 PLC的PID功能。
PID的作用是什么?如何实现西门子S7-1500的PID功能?如何进行PID调试?
|
JavaScript 前端开发 小程序
讲述小程序之组件基本内容
讲述小程序之组件基本内容
114 0
讲述小程序之组件基本内容
|
安全 Unix 调度
CS162操作系统课程第二课-4个核心OS概念(下)
CS162操作系统课程第二课-4个核心OS概念(下)
CS162操作系统课程第二课-4个核心OS概念(下)
|
存储 缓存 程序员
CS162操作系统课程第二课-4个核心OS概念(上)
CS162操作系统课程第二课-4个核心OS概念(上)
CS162操作系统课程第二课-4个核心OS概念(上)
|
安全 物联网 数据安全/隐私保护
CS162操作系统课程第二课-4个核心OS概念(中)
CS162操作系统课程第二课-4个核心OS概念(中)
CS162操作系统课程第二课-4个核心OS概念(中)
|
Python API 数据格式
带你读《Python网络编程(原书第2版)》之三:API和意图驱动网络
本书是一本实用型的基础技术实践工具书,技术性较强,如果你想快速了解计算机网络管理、网络安全、自动化运维、Python Web搭建、网络测试相关的知识,本书很适合你。本书涵盖的知识点主要是网络运维相关技术,在学习完所有的章节之后,读者能对网络的管理有初步的了解。每个章节的后面部分都是有一定难度的扩展资源,循序渐进,帮助读者提升网络运维能力。
|
Linux 安全 Unix
Linux设备驱动程序学习----1.设备驱动程序简介
Linux设备驱动程序学习----1.设备驱动程序简介设备驱动程序简介更多内容请参考Linux设备驱动程序学习----目录 简介  Linux系统的优点是,系统内部实现细节对所有人都是公开的。Linux内核由大量复杂的代码组成,设备驱动程序可以作为进入Linux内核世界大门的切入口。
1162 0

热门文章

最新文章

  • 1
    流量控制系统,用正则表达式提取汉字
    27
  • 2
    Redis09-----List类型,有序,元素可以重复,插入和删除快,查询速度一般,一般保存一些有顺序的数据,如朋友圈点赞列表,评论列表等,LPUSH user 1 2 3可以一个一个推
    27
  • 3
    Redis08命令-Hash类型,也叫散列,其中value是一个无序字典,类似于java的HashMap结构,Hash结构可以将对象中的每个字段独立存储,可以针对每字段做CRUD
    27
  • 4
    Redis07命令-String类型字符串,不管是哪种格式,底层都是字节数组形式存储的,最大空间不超过512m,SET添加,MSET批量添加,INCRBY age 2可以,MSET,INCRSETEX
    28
  • 5
    S外部函数可以访问函数内部的变量的闭包-闭包最简单的用不了,闭包是内层函数+外层函数的变量,简称为函数套函数,外部函数可以访问函数内部的变量,存在函数套函数
    25
  • 6
    Redis06-Redis常用的命令,模糊的搜索查询往往会对服务器产生很大的压力,MSET k1 v1 k2 v2 k3 v3 添加,DEL是删除的意思,EXISTS age 可以用来查询是否有存在1
    31
  • 7
    Redis05数据结构介绍,数据结构介绍,官方网站中看到
    23
  • 8
    JS字符串数据类型转换,字符串如何转成变量,+号只要有一个是字符串,就会把另外一个转成字符串,- * / 都会把数据转成数字类型,数字型控制台是蓝色,字符型控制台是黑色,
    21
  • 9
    JS数组操作---删除,arr.pop()方法从数组中删除最后一个元素,并返回该元素的值,arr.shift() 删除第一个值,arr.splice()方法,删除指定元素,arr.splice,从第一
    21
  • 10
    定义好变量,${age}模版字符串,对象可以放null,检验数据类型console.log(typeof str)
    20