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

上传人:b****7 文档编号:9522322 上传时间:2023-02-05 格式:DOCX 页数:16 大小:94.79KB
下载 相关 举报
双容水箱液位模糊控制.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双容液位系统

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();

}_

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

当前位置:首页 > 高等教育 > 文学

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

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