双容水箱液位模糊控制.docx
《双容水箱液位模糊控制.docx》由会员分享,可在线阅读,更多相关《双容水箱液位模糊控制.docx(16页珍藏版)》请在冰豆网上搜索。
双容水箱液位模糊控制
双容水箱液位模糊控制
一、实验目的
熟悉双容液位控制系统的组成原理。
通过实验进一步掌握模糊控制原理及模糊控制规则的生成。
了解量化因子和比例因子对控制效果的影响。
掌握解模糊方法及实现。
二、实验设备
实验对双象为TKGK-1双容液位系统
TKGK-1型实验装置:
GK-06、GK-07-2
万用表一只
计算机系统
三、实验原理
图1双容水箱液位模糊控制系统方框图
图1为双容水箱液位控制系统。
控制的目的是使下水箱的液位等于给定值,并能克服来自系统内部和外部扰动的影响。
双容水箱液位系统如图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,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
6
NB
NM
NS
O
PS
PM
PB
1.0
0.3
0
0
0
0
0
0.7
0.6
0.1
0
0
0
0
0.4
1.0
0.2
0
0
0
0
0.2
0.6
0.5
0
0
0
0
0.1
0.3
1.0
0.1
0
0
0
0
0.1
0.5
0.4
0.1
0
0
0
0
0.2
1.0
0.2
0
0
0
0
0.1
0.4
0.5
0.1
0
0
0
0
0.1
1.0
0.3
0.1
0
0
0
0
0.5
0.6
0.2
0
0
0
0
0.2
1.0
0.4
0
0
0
0
0.1
0.6
0.7
0
0
0
0
0
0.3
1.0
模糊控制规则:
模糊控制规则是操作经验和专家知识的总结,是进行模糊推理的依据。
在设计模糊控制规则时,必须考虑控制规则的完备性、交叉性和一致性。
既保证对于任意给定的输入,均有相应的控制规则起作用;控制器的输出值总是由数条控制规则来决定;控制规则中不存在相互矛盾的规则。
在总结专家经验和过程知识的基础上,可以得到如表二的控制规则表:
模糊推理:
模糊推理是模糊控制器的核心,模糊控制系统目前常采用的有:
CRI推理的查表法、CRI推理的解析法、Mamdani直接推理法、后件函数法等。
本实验可采用Mamdani直接推理法。
Mamdani推理法是先求出模糊关系R,再根据输入求出控制量,把控制量清晰化,可得控制查询表.
本试验设计了容量为7×7条控制规则表,这个规则表可以用27条模糊条件语句来描述:
如:
ifEl=NBandEf=NBthenU=PS,对应的模糊关系:
R1=A1×B1×C5
根据Ri(i=1,2,…27)可以得到综合模糊矩阵R。
如下计算模糊关系矩阵R:
R=R1∪R2∪…R27
E和EC对应的模糊变量为和,此时可由下式求出:
U*=(A*×B*)
R
式中:
——表示求合成运算.
解模糊:
可采用常用的重心法进行解模糊运算。
表二控制规则表
NB
NM
NS
O
PS
PM
PB
NB
NM
NS
O
PS
PM
PB
PS
NS
NM
NB
NB
NB
NB
PS
PS
NS
NM
NM
NB
NB
PS
PS
O
NS
NS
NM
NM
PS
PS
O
O
O
NS
NS
PM
PM
PS
PS
O
NS
NS
PB
PM
PM
PM
PS
PS
NS
PB
PB
PM
PM
PM
PS
NS
四、实验步骤
1.按图1连成控制系统图。
其中被控对象为下水箱,被控制量为液位高度,控制器由计算机系统组成,接口的驱动已在“计算机控制系统”试验中完成,这里不再赘述。
2.启动工艺流程并开启相关仪器,调整传感器输出的零点与增益。
3.运行模糊控制程序,并输入参数,记录试验数据和控制曲线。
4.修改模糊控制规则,重复步骤3。
5.待系统稳定后,加手动扰动,观察系统的动态变化,并记录结果。
五、实验报告要求
1.给出模糊控制器的设计过程和程序清单
2.建立EC的隶数度函数赋值表
3.建立控制查询表
4.记录试验数据和曲线
5.分析试验结果
六、思考题
1.如果输入变量离散论域分为五个等级,对计算和控制效果有什么影响?
2.模糊控制达到稳态后,静差是否为零?
为什么?
附:
双容水箱液位模糊控制的C语言程序
#include"graphics.h"
#include"conio.h"
#include"math.h"
#include"time.h"
#include"stddef.h"
#include"dos.h"
#include"stdio.h"
#include"process.h"
#include"bios.h"
intsampt,key,v;
staticfloatcy[600],cx[600],cs[6];
floatdatain,u,u1,e2,xset,i,Ku;
time_tstart,end;
unsignedchardat[6],data_in[5][4];
unsignedcharstat,data,data1;
inti1,j1;
main()
{
intj,m,ntr,T,NUM;
floatadin(),fuzzycontrol(),max,tr,t0;
voiddaout(),wct(),wtp(),wait();
intgdriver,gmode,kk;
floatx1,x2,x3;
char*t[]={"sampledvalue:
","setedvalue:
"};
char*tt1[]={"L","t"};
gdriver=VGA;
gmode=VGAHI;
initgraph(&gdriver,&gmode,"d:
\\tc");
wait();
/*cominit*/
outportb(0x3fb,0x80);/*SETB0x3fb.7=1*/
outportb(0x3f8,0x0C);/*LSB=0CHBPS=9600*/
outportb(0x3f9,0x00);/*MSB=00H*/
outportb(0x3fb,0x03);/*8DATA1STOPNO*/
outportb(0x3fc,0x03);/*SETBDTR=0RTS=0*/
outportb(0x3f9,0x00);/*SETIE=0*/
star:
inportb(0x3f8);
while(!
((0x20&inportb(0x3fd))==0x20));
f_f5:
while(!
((0x20&inportb(0x3fd))==0x20));
outportb(0x3f8,0x66);
while(!
(inportb(0x3fd)&0x01));
data1=inportb(0x3f8);
while(!
(inportb(0x3fd)&0x01));
data=inportb(0x3f8);
if(data!
=0x35)
{gotostar;}
a_d:
while(!
((0x20&inportb(0x3fd))==0x20));
outportb(0x3f8,0x61);
while(!
(inportb(0x3fd)&0x01));
data=inportb(0x3f8);
if(data!
=0x64)
{exit
(1);}
adin();
daout(0);
printf("PleaseInput...\n");
printf("\nSampt(3,4,5,6)=");
scanf("%d",&sampt);
printf("\nXset=");
scanf("%f",&xset);
printf("\nKu=");
scanf("%f",&Ku);
NUM=500;
setviewport(0,0,640,350,0);
clearviewport();
setbkcolor(3);
setcolor
(1);
cleardevice();
settextjustify(LEFT_TEXT,TOP_TEXT);
settextstyle(1,0,2);
settextjustify(0,2);
settextstyle(0,0,1);
outtextxy(410,20,t[1]);
outtextxy(410,40,t[0]);
line(37,85,40,80);
line(43,85,40,80);
line(585,287,590,290);
line(585,293,590,290);
for(j=1;j<9;j++)
{line(40,290-j*25,45,290-j*25);
line(40+j*50,285,40+j*50,290);
}
line(490,285,490,290);
line(540,285,540,290);
setlinestyle(0,0,3);
line(40,80,40,295);
line(35,290,590,290);
settextjustify(0,2);
settextstyle(1,0,1);
outtextxy(25,70,tt1[0]);
outtextxy(590,290,tt1[1]);
setcolor(4);
setlinestyle(0,0,1);
line(536,48,558,48);
wct(3,200.,14,88);
wct(3,150.,14,138);
wct(3,100.,14,188);
wct(3,xset*10.,14,288-(int)(xset*10.));
wct(3,50.,14,238);
wct(3,100.,135,300);
wct(3,200.,235,300);
wct(3,300.,335,300);
wct(3,400.,435,300);
wct(3,500.,535,300);
wtp("Xset=",xset,5,23);
wtp("Ku=",Ku,25,23);
/*wtp("I=",ki,45,23);
wtp("D=",kd,60,23);*/
max=0.0;ntr=0;
for(i=0;i{cx[i]=xset;
start=time(NULL);
t0=i*sampt;
x1=adin();
x2=adin();
x3=adin();
cy[i]=(x1+x2+x3)/3;
e2=xset-cy[i];
u=fuzzycontrol(e2);
daout((int)(u));
putpixel(42+i,290-cx[i]*10,62);
putpixel(42+i,290-cy[i]*10,4);
putpixel(42+i,290-u*0.29,1);
wtp("cy[i]=",cy[i],5,21);
wtp("Time=",t0,60,21);
wtp("u=",u,45,21);
wtp("Num=",i+1.0,25,21);
if(i>=2)
{if(cy[i]>max)max=cy[i];
wtp("max=",max,5,25);
}
if(ntr==0)
{if(cy[i]>=xset)
{tr=i*sampt;
wtp("tr=",tr,25,25);
ntr=1;
}
}
if(kbhit()!
=0)
{key=bioskey(0);
key=(key>>8)&0xff;
if(key==44)gotoloop2;
}
loop1:
end=time(NULL);
if((difftime(end,start))}
getch();
loop2:
daout(0);
outportb(0x3fc,0x01);
closegraph();
exit(0);
}
floatadin()
{
b_d:
while(!
((0x20&inportb(0x3fd))==0x20));
outportb(0x3f8,0x62);
while(!
(inportb(0x3fd)&0x01));
data=inportb(0x3f8);
for(i1=0;i1<5;i1++)
{for(j1=0;j1<4;j1++)
{while(!
(inportb(0x3fd)&0x01));
data_in[i1][j1]=inportb(0x3f8);
}
}
for(i1=0;i1<5;i1++)
{for(j1=0;j1<4;j1++)
{data_in[i1][j1]=data_in[i1][j1]-0x30;}
}
if(data!
=0x64)
{gotob_d;}
datain=data_in[0][0]*10+data_in[0][1]+data_in[0][2]*0.1+data_in[0][3]*0.01;
return(datain);
}
floatfuzzycontrol(e2)
floate2;
{
floatXec,Yu,e20,Ke,Kec;
intE,EC,U,a[13][13];
intm0=6,n=6;
intout[13][13]={
{7,7,7,6,5,4,4,4,4,4,4,4,4},
{7,6,6,5,4,4,4,4,4,4,4,4,4},
{7,6,5,4,4,4,4,4,4,4,4,4,4},
{6,5,4,4,4,4,4,2,2,2,2,2,2},
{5,4,4,4,4,4,4,2,0,0,0,0,0},
{4,4,4,2,2,2,2,2,0,1,1,1,1},
{4,4,4,2,0,0,0,0,0,-1,1,1,1},
{2,2,2,2,0,1,1,1,1,1,1,1,1},
{0,0,0,0,0,-1,1,1,1,1,1,1,0},
{1,1,1,2,2,2,2,2,2,2,2,2,-2},
{1,1,1,2,2,2,2,2,2,2,2,-2,-2},
{4,4,4,4,4,4,4,4,4,0,-2,-2,-2},
{4,4,4,4,4,4,4,4,0,-2,-2,-2,-2}};
e20=xset-cy[i-1];
Xec=(e2-e20)/sampt;
Ke=n/2;
Kec=m0/1;
if(e2>2)e2=2;
if(e2<-2)e2=-2;
if(Xec>1)Xec=1;
if(Xec<-1)Xec=-1;
E=Ke*e2;
EC=Kec*Xec;
U=out[E+6][EC+6];
/*printf("U=%d",U);*/
Yu=Ku*U;
if(Yu>255.0)Yu=255.0;
if(Yu<-255.0)Yu=-255.0;
/*printf("Yu=%f",Yu);*/
/*Yu=abs(Yu)*/;
return(Yu);
}
voiddaout(x)
intx;
{intx1,x2,x3;
c_d:
x1=(int)(x/100.0);
x2=(int)((x-x1*100)/10.0);
x3=(int)(x-x1*100-x2*10);
dat[0]=x1;dat[1]=x2;dat[2]=x3;
dat[3]=0;dat[4]=0;dat[5]=0;
for(i1=0;i1<6;i1++)
{dat[i1]=dat[i1]+0x30;}
while(!
((0x20&inportb(0x3fd))==0x20));
outportb(0x3f8,0x63);
while(!
(inportb(0x3fd)&0x01));
data=inportb(0x3f8);
if(data!
=0x64)
{exit
(1);}
while(!
((0x20&inportb(0x3fd))==0x20));
outportb(0x3f8,0x64);
for(i1=0;i1<6;i1++)
{
while(!
((0x20&inportb(0x3fd))==0x20));
outportb(0x3f8,dat[i1]);
}
while(!
(inportb(0x3fd)&0x01));
data=inportb(0x3f8);
if(data!
=0x64)
{exit
(1);}
}
voidwct(b,xx,x2,y2)
intb,x2,y2;
floatxx;
{charmb2[5];
setcolor
(1);
gcvt(xx,b,mb2);
settextjustify(0,2);
settextstyle(0,0,1);
outtextxy(x2,y2,mb2);
}
voidwtp(xc,xt,x1,y1)
charxc[];
floatxt;
intx1,y1;
{textcolor(9);
gotoxy(x1,y1);
textcolor
(1);
printf("%s%7.2f",xc,xt);
}
voidwait()
{inti,j;
printf("\n\nPleaseWaitFor1minute!
!
!
\n");
setbkcolor(3);
setcolor(4);
setfillstyle(SOLID_FILL,4);
for(i=0;i<361;i++)
{pieslice(300,200,0,i,80);
delay(10);}
setcolor(14);
setfillstyle(SOLID_FILL,14);
for(i=91;i<181;i++)
{pieslice(300,200,90,i,80);
delay(50);}
setcolor
(1);
setfillstyle(SOLID_FILL,1);
for(i=181;i<271;i++)
{pieslice(300,200,180,i,80);
delay(50);}
setcolor
(2);
setfillstyle(SOLID_FILL,2);
for(i=271;i<361;i++)
{pieslice(300,200,270,i,80);
delay(50);}
delay(200);
cleardevice();
}_