1、双容水箱液位模糊控制一、实验目的 熟悉双容液位控制系统的组成原理。通过实验进一步掌握模糊控制原理及模糊控制规则的生成。了解量化因子和比例因子对控制效果的影响。掌握解模糊方法及实现。二、实验设备 实验对双象为 TKGK-1 双容液位系统TKGK-1 型实验装置:GK-06、GK-07-2万用表一只计算机系统三、实验原理图 1 双容水箱液位模糊控制系统方框图图 1 为双容水箱液位控制系统。控制的目的是使下水箱的液位等于给定值,并能克服来自系统内部和外部扰动的影响。双容水箱液位系统如图 2,该被控对象具有非线性和时滞性,建立精确的数学模型比较困难;模糊控制不仅可以避开复杂的数学模型,通常还能得到比较
2、好性能指标。模糊控制器的结构图如图 3。模糊控制器的输入为误差和误差变化率:误差 e=r-y,误差变化率 ec=de/dt,其中 r和 y 分别为液位的给定值和测量值。把误差和误差变化率的精确值进行模糊化变成模糊量E 和 EC,从而得到误差 E 和误差变化率 EC 的模糊语言集合,然后由 E 和 EC 模糊语言的的子集和模糊控制规则 R(模糊关系矩阵)根据合成推理规则进行模糊决策,这样就可以得到模糊控制向量 U,最后再把模糊量解模糊转换为精确量 u,再经 D/A 转换为模拟量去控制执行机构动作。图 3 模糊控制器组成原理图模糊量化:根据精确量实际变化范围 a,b,合理选择模糊变量的论域为 -n
3、,n,通过量化因子 k= ,将其转换成若干等级的离散论域,如七个等级为负大,负中,负小,零,正小,正中,正大,简写为 NB,NM,NS,O,PS,PM,PB。确定模糊子集的隶属函数曲线。一般常采用三角形、梯形和正态分布等几种曲线。然后由隶属函数曲线得出模糊变量E、 EC、 U 的赋值表。 根据经验, E 模糊子集的隶数度函数取正态分布曲线,则赋值表见表一:表一:变量 E 隶属函数赋值表 E -6 -5 -4 -3 -2 -1 0 1 2 3 4 5 6NBNMNSOPSPMPB1.00.3000000.70.60.100000.41.00.200000.20.60.500000.10.31.0
4、0.100000.10.50.40.100000.21.00.200000.10.40.50.100000.11.00.30.100000.50.60.200000.21.00.400000.10.60.7000000.31.0模糊控制规则:模糊控制规则是操作经验和专家知识的总结,是进行模糊推理的依据。在设计模糊控制规则时,必须考虑控制规则的完备性、交叉性和一致性。既保证对于任意给定的输入,均有相应的控制规则起作用;控制器的输出值总是由数条控制规则来决定;控制规则中不存在相互矛盾的规则。在总结专家经验和过程知识的基础上,可以得到如表二的控制规则表: 模糊推理:模糊推理是模糊控制器的核心,模糊控
5、制系统目前常采用的有:CRI 推理的查表法、CRI 推理的解析法、Mamdani 直接推理法、后件函数法等。本实验可采用Mamdani 直接推理法。Mamdani 推理法是先求出模糊关系 R,再根据输入求出控制量,把控制量清晰化,可得控制查询表. 本试验设计了容量为 77 条控制规则表,这个规则表可以用 27 条模糊条件语句来描述: 如:if El=NB and Ef=NB then U=PS,对应的模糊关系: R1=A1B1C5根据 Ri(i=1,2,27)可以得到综合模糊矩阵 R。如下计算模糊关系矩阵 R:R=R1R2R27 E 和 EC 对应的模糊变量为和,此时可由下式求出: U*=(
6、A* B*) R式中: 表示求合成运算 .解模糊:可采用常用的重心法进行解模糊运算。表二 控制规则表 NBNMNSOPSPMPBNBNMNSOPSPMPBPSNSNMNBNBNBNBPSPSNSNMNMNBNBPSPSONSNSNMNMPSPSOOONSNSPMPMPSPSONSNSPBPMPMPMPSPSNSPBPBPMPMPMPSNS四、实验步骤 1. 按图 1 连成控制系统图。其中被控对象为下水箱,被控制量为液位高度,控制器由计算机系统组成,接口的驱动已在“计算机控制系统”试验中完成,这里不再赘述。2.启动工艺流程并开启相关仪器,调整传感器输出的零点与增益。3.运行模糊控制程序,并输入参
7、数,记录试验数据和控制曲线。 4.修改模糊控制规则,重复步骤 3。 5.待系统稳定后,加手动扰动,观察系统的动态变化,并记录结果。 五、实验报告要求 1.给出模糊控制器的设计过程和程序清单2.建立 EC 的隶数度函数赋值表 3.建立控制查询表 4.记录试验数据和曲线 5.分析试验结果 六、思考题 1如果输入变量离散论域分为五个等级,对计算和控制效果有什么影响? 2模糊控制达到稳态后,静差是否为零?为什么?附:双容水箱液位模糊控制的 C 语言程序#include “graphics.h“#include “conio.h“#include “math.h“#include “time.h“#in
8、clude “stddef.h“#include “dos.h“#include “stdio.h“#include “process.h“#include “bios.h“int sampt,key,v;static float cy600,cx600,cs6;float datain,u,u1,e2,xset,i,Ku;time_t start,end;unsigned char dat6,data_in54;unsigned char stat,data,data1;int i1,j1;main( )int j,m,ntr,T,NUM;float adin( ),fuzzycontrol
9、(),max,tr,t0;void daout( ),wct( ),wtp( ),wait( );int gdriver,gmode,kk;float x1,x2,x3;char *t=“sampled value:“,“seted value:“;char *tt1=“L“,“t“;gdriver=VGA;gmode=VGAHI;initgraph(wait();/*com init*/outportb(0x3fb,0x80); /*SETB 0x3fb.7=1*/outportb(0x3f8,0x0C); /* LSB=0CH BPS=9600*/outportb(0x3f9,0x00);
10、 /* MSB=00H*/outportb(0x3fb,0x03); /* 8DATA 1STOP NO*/outportb(0x3fc,0x03); /*SETB DTR=0 RTS=0*/outportb(0x3f9,0x00); /*SET IE=0*/star: inportb(0x3f8);while(!(0x20f_f5:while(!(0x20outportb(0x3f8,0x66);while(!(inportb(0x3fd)data1=inportb(0x3f8);while(!(inportb(0x3fd)data=inportb(0x3f8);if(data!=0x35)
11、 goto star;a_d:while(!(0x20outportb(0x3f8,0x61);while(!(inportb(0x3fd)data=inportb(0x3f8);if(data!=0x64) exit(1);adin( );daout(0);printf(“Please Input.n“);printf(“nSampt(3,4,5,6)=“);scanf(“%d“,printf(“nXset=“);scanf(“%f“,printf(“nKu=“);scanf(“%f“,NUM=500;setviewport(0,0,640,350,0);clearviewport( );s
12、etbkcolor(3);setcolor(1);cleardevice();settextjustify(LEFT_TEXT,TOP_TEXT);settextstyle(1,0,2);settextjustify(0,2);settextstyle (0,0,1);outtextxy(410,20,t1);outtextxy(410,40,t0);line(37,85,40,80);line(43,85,40,80);line(585,287,590,290);line(585,293,590,290);for (j=1;j=2) if(cyimax) max=cyi;wtp(“max=“
13、,max,5,25);if(ntr=0) if(cyi=xset)tr=i*sampt;wtp(“tr=“,tr,25,25);ntr=1;if(kbhit()!=0) key=bioskey(0);key=(key8)if(key=44) goto loop2;loop1: end=time(NULL);if(difftime(end,start)2) e2=2;if(e21) Xec=1;if(Xec255.0) Yu=255.0;if(Yu-255.0) Yu=-255.0;/*printf(“Yu=%f“,Yu);*/*Yu=abs(Yu)*/;return(Yu);void daou
14、t(x)int x;int x1,x2,x3;c_d:x1=(int)(x/100.0);x2=(int)(x-x1*100)/10.0);x3=(int)(x-x1*100-x2*10);dat0=x1;dat1=x2;dat2=x3;dat3=0;dat4=0;dat5=0;for(i1=0;i16;i1+)dati1=dati1+0x30;while(!(0x20outportb(0x3f8,0x63);while(!(inportb(0x3fd)data=inportb(0x3f8);if(data!=0x64) exit(1);while(!(0x20outportb(0x3f8,0x64);for(i1=0;i16;i1+)while(!(0x20outportb(0x3f8,dati1);while(!(inportb(0x3fd)