双容水箱液位模糊控制.docx

上传人:b****8 文档编号:9476862 上传时间:2023-02-04 格式:DOCX 页数:16 大小:70.90KB
下载 相关 举报
双容水箱液位模糊控制.docx_第1页
第1页 / 共16页
双容水箱液位模糊控制.docx_第2页
第2页 / 共16页
双容水箱液位模糊控制.docx_第3页
第3页 / 共16页
双容水箱液位模糊控制.docx_第4页
第4页 / 共16页
双容水箱液位模糊控制.docx_第5页
第5页 / 共16页
点击查看更多>>
下载资源
资源描述

双容水箱液位模糊控制.docx

《双容水箱液位模糊控制.docx》由会员分享,可在线阅读,更多相关《双容水箱液位模糊控制.docx(16页珍藏版)》请在冰豆网上搜索。

双容水箱液位模糊控制.docx

双容水箱液位模糊控制

双容水箱液位模糊控制

一、实验目的

熟悉双容液位控制系统的组成原理。

通过实验进一步掌握模糊控制原理及模糊控制规则的生成。

了解量化因子和比例因子对控制效果的影响。

掌握解模糊方法及实现。

实验对双象为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();

}

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 经管营销 > 公共行政管理

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1