双容水箱液位模糊控制.docx
《双容水箱液位模糊控制.docx》由会员分享,可在线阅读,更多相关《双容水箱液位模糊控制.docx(16页珍藏版)》请在冰豆网上搜索。
双容水箱液位模糊控制
双容水箱液位模糊控制
一、实验目的
熟悉双容液位控制系统的组成原理。
通过实验进一步掌握模糊控制原理及模糊控制规则的生成。
了解量化因子和比例因子对控制效果的影响。
掌握解模糊方法及实现。
实验对双象为TKGK-1双容液位系统
三、实验原理
图1双容水箱液位模糊控制系统方框图
图1为双容水箱液位控制系统。
控制
的目的是使下水箱的液位等于给定值,并能克服来自系统内部和外部扰动的影响。
双容水箱液位系统如图2,该被控对象具有非线性和时滞性,建立精确的数学模型比较困难;模糊控制不仅可以避开复杂的数学模型,通常还能得到比较好性能指标。
模糊控制器的结构图如图
模糊控制器的输入为误差和误差变化率:
误差e=r-y,误差变化率ec=de/dt,其
中r和y分别为液位的给定值和测量值。
把误差和误差变化率的精确值进行模糊化变成模糊
量E和EC,从而得到误差E和误差变化率EC的模糊语言集合,然后由E和EC模糊语言的的子集和模糊控制规则R(模糊关系矩阵)根据合成推理规则进行模糊决策,这样就可以得到模糊控制向量U,最后再把模糊量解模糊转换为精确量u,再经D/A转换为模拟量去控制
执行机构动作。
模糊量化:
根据精确量实际变化范围[a,b],合理选择模糊变量的论域为[-n,n],通过量化因
子k=~-,将其转换成若干等级的离散论域,如七个等级为{负大,负中,负小,零,正
小,正中,正大},简写为{NB,NM,NS,O,PS,PM,PB}确定模糊子集的隶属函数曲线。
一般常采用三角形、梯形和正态分布等几种曲线。
然后由隶属函数曲线得出模糊变量E、ECU的
赋值表。
根据经验,E模糊子集的隶数度函数取正态分布曲线,则赋值表见表
表一:
变量E隶属函数赋值表
E
-6
-5
-4
-3
-2
-1
0
1
2
3J
4
5J
6
NB
1.0
0.7
0.4
0.2
0.1
0
0
0
0
0
0
0
0
NM
0.3
0.6
1.0
0.6
0.3
0.1
0
0
0
0
0
0
0
NS
0
0.1
0.2
0.5
1.0
0.5
0.2
0.1
0
0
0
0
0
O
0
0
0
0
0.1
0.4
1.0
0.4
0.1
0
0
0
0
PS
0
0
0
0
0
0.1
0.2
0.5
1.0
0.5
0.2
0.1
0
PM
0
0
0
0
0
0
0
0.1
0.3
0.6
1.0
0.6
0.3
PB
0
0
0
0
0一
0
0
0
0.1
0.2
0.4
0.7
1.0
模糊控制规则:
模糊控制规则是操作经验和专家知识的总结,是进行模糊推理的依据。
在设
计模糊控制规则时,必须考虑控制规则的完备性、交叉性和一致性。
既保证对于任意给定的
输入,均有相应的控制规则起作用;控制器的输出值总是由数条控制规则来决定;控制规则
中不存在相互矛盾的规则。
在总结专家经验和过程知识的基础上,可以得到如表二的控制规
则表:
模糊推理:
模糊推理是模糊控制器的核心,模糊控制系统目前常采用的有:
CRI推
理的查表法、CRI推理的解析法、Mamdani直接推理法、后件函数法等。
本实验可采用Mamdani直接推理法。
Mamdani推理法是先求出模糊关系R,再根据输入求出控制量,把
控制量清晰化,可得控制查询表•
本试验设计了容量为7X7条控制规则表,这个规则表可以用27条模糊条件语句
来描述:
女口:
ifEI=NBandEf=NBthenU=PS,对应的模糊关系:
R1=A1XBIXC5
根据Ri(i=1,2,…27)可以得到综合模糊矩阵R。
如下计算模糊关系矩阵R:
R=R1UR2U…R27
E和EC对应的模糊变量为和,此时可由下式求出:
U*=(A*XB*):
R
式中:
表示求合成运算•
解模糊:
可采用常用的重心法进行解模糊运算。
表二控制规则表
NB
NM
NS
O
PS
PM
PB
NBNM
NSOPSPM
PB
PSNSNMNBNBNBNB
PS
PSNS
NMNMNB
NB
PS
PS
O
NSNSNMNM
PSPSOOO
NSNS
PMPMPSPSO
NSNS
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•模糊控制达到稳态后,静差是否为零?
为什么?
Word文档
附:
双容水箱液位模糊控制的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,tO;
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();
/*init*/
outportb(0x3fb,0x80);/*SETB0x3fb.7=1*/
outportb(0x3f8,0x0C);/*LSB=0CHBPS=9600*/
outportb(0x3f9,0x00);/*MSB=00H*/outportb(0x3fb,0x03);/*8DATA1ST0PNO*/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("Pleaselnput...\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=O;i{cx[i]=xset;
start=time(NULL);
tO=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()!
=O)
{key=bioskey(0);
key=(key>>8)&Oxff;
if(key==44)gotoloop2;
}
loopl:
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=mO/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)&OxO1));
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(S0LID_FILL,14);for(i=91;i<181;i++)
{pieslice(300,200,90,i,80);delay(50);}setcolor
(1);setfillstyle(S0LID_FILL,1);for(i=181;i<271;i++)
{pieslice(300,200,180,i,80);delay(50);}
setcolor
(2);
setfillstyle(S0LID_FILL,2);for(i=271;i<361;i++)
{pieslice(300,200,270,i,80);delay(50);}
delay(200);
cleardevice();
}