工业系统驱动与控制.docx
- 文档编号:29334132
- 上传时间:2023-07-22
- 格式:DOCX
- 页数:14
- 大小:107.69KB
工业系统驱动与控制.docx
《工业系统驱动与控制.docx》由会员分享,可在线阅读,更多相关《工业系统驱动与控制.docx(14页珍藏版)》请在冰豆网上搜索。
工业系统驱动与控制
《工业系统驱动与控制》综合设计
题目:
某一化工生产过程中需要对储气罐内的气体压力进行精度控制及安全保护,压力设定值为8Mpa,其中压力采集使用压阻式压力传感器,压力控制采用电动V型调节球阀调节。
此外,当压力高于10Mpa时必须关断调节球阀。
请结合本门课所学知识及选用的相关仪器设备,查阅相关文献,给出采用工业控制计算机作为控制器的设计方案。
设计方案:
(一)工作原理
储气罐是一种贮存气体的容器,有一个进气口和一个出气口。
依题目中设计要求,在所用储气罐进气口处装上电动V型调节球阀。
电动V型球阀是球阀配上电动执行器,旋塞体是球体,有圆形通孔或通道通过其轴线,当球旋转90度时,在进、出口处应全部呈现球面,从而截断流动。
储气罐和电动球阀示意图分别如下:
使用压阻式压力传感器测量罐内气体的压力,将测得的信号通过信号调理电路后经信息采集板卡进行A/D转换后采集到工业系统控制机中,由工控机对所读入数据进行处理,并针对不同数据输出不同的控制信号,由信息采集板卡进行D/A转换后输送给电动V型调节球阀,控制球阀开口的大小。
当罐内气体压力较低时,控制信号使球阀开口增大,进气口流量加大,罐内气体压力升高;反之,控制信号使球阀开口减小,进气口流量减小,罐内气体压力减小。
当罐内气压达到极限值时,控制信号使球阀完全关断,防止罐内气压进一步上升,确保安全。
(二)系统结构图
由工作原理可以画出系统的总体结构图,其中用x(t)代表模拟信号,用x(k)代表数字信号。
系统的总体结构图如下:
(三)信号调理电路设计
压阻式压力传感器是利用单晶硅材料的压阻效应和集成电路技术制成的传感器。
单晶硅材料在受到力的作用后,电阻率发生变化,通过测量电路就可得到正比于力变化的电信号输出。
由压阻式压力传感器的主要技术参数可知,当罐内压力在0~20Mpa范围内时,传感器输出电压在0~400mv之间。
考虑到信号采集板卡的AI通道输入范围为-10~10V,可以连接如下信号调理电路:
(四)器件与仪器
压阻式压力传感器(未找到对应型号)
运算放大器(µA741或OP407)
工控机、信号采集板卡
电阻(30K、750K各两个)
(五)程序流程图
在化工生产中对储气罐内气体控制过程是一个长期的过程,而C语言中对数组等都要求有确定的大小,为了实现长期控制,考虑使用循环语句,有如下的程序流程图:
(六)控制程序
使用C语言进行编程,在原有的CONTROL_D的程序上作了一定的修改。
在这里由于对所使用的储气罐的系统特性不是很清楚,考虑采用比较普遍适用的PID控制方法。
程序如下:
#include
#include
#include
#include
#include
#include
#defineBASE_ADDRESS0x220
intr[400],y[400],yy[400];e[400],c[400],u[400];
floatext_in[10][10],w[10][10],meane[10],sigmae[10],meanc[10],sigmac[10];
doublenet,temp,tempee,tempe[10],tempc[10];
intiad,ida;
intw_mark,con_mark,flex,curve;
intt,sample_time,amplitude,init_v;
inti,j=1,n,rate_mark;
floattf,fai,fre,umin=-2047,umax=2047;
floatKe=1.,eta,eta_min,eta_max,atek,Eng;
floateta_R,iae;
longintrandseed=568731L;
char*string;
charw_filename[30];
intef,es,uf;
floatkp,ki,kd;
voidgraph_r(int*t,int*r,int*y,int*e,int*c,int*u)
{
intxmax,ymax,xmin,ymin;
floatdx,dy,u_max,r_max;
inti,j;
intxx,yy;
intgdrive,gmode;
charstr[30];
*c=*c;
*t=*t;
detectgraph(&gdrive,&gmode);
if(gdrive<0)
{
printf("Thereisnotgraphicsdisplayer\n");
exit
(1);
}
initgraph(&gdrive,&gmode,"e:
\\tc");
cleardevice();
setbkcolor(7);
xmin=19;
rectangle(0,0,639,479);
rectangle(19,39,619,439);
line(19,239,619,239);
r_max=10;
dx=2;
dy=-200./r_max;
/*drawYaxis*/
for(i=0;i<12;i++)
{
yy=39+i*40;
line(xmin,yy,xmin+3,yy);
sprintf(str,"%-4d",(10-i*2));
outtextxy((xmin-18),yy-3,str);
}
/*drawXaxis*/
for(i=1;i<6;i++)
{
xx=xmin+100*i;
line(xx,239,xx,236);
sprintf(str,"%-5d",50*i);
outtextxy(xx-6,243,str);
}
/*drawYcurve*/
setcolor(BLUE);
line(450,300,500,300);
outtextxy(520,297,"y");
moveto(xmin,239);
for(i=0;i { xx=i*dx+xmin; yy=(*(y+i))*dy/409.+239; lineto(xx,yy); } /*drawrcurve*/ setcolor(YELLOW); moveto(xmin,239); for(i=0;i { xx=i*dx+xmin; yy=(*(r+i))*dy/409.+239; lineto(xx,yy); } line(450,320,500,320); outtextxy(520,317,"r"); /*drawucurve*/ setcolor(RED); moveto(xmin,239); /*u_max=sort_max(u); */u_max=4096; for(i=0;i { xx=i*dx+xmin; yy=-(*(u+i))*200./u_max+239; lineto(xx,yy); } line(450,340,500,340); outtextxy(520,337,"u"); /*drawecurve*/ setcolor(WHITE); moveto(xmin,239); /*u_max=sort_max(u); */u_max=2047; for(i=0;i { xx=i*dx+xmin; yy=-(*(e+i))*dy/409.+239; lineto(xx,yy); } line(450,360,500,360); outtextxy(520,357,"e"); setcolor(8); strcpy(str,"\0"); outtextxy(400,100,"Sampletime=(ms)"); sprintf(str,"%d",sample_time); outtextxy(510,100,str); outtextxy(400,120,"Amplitude=(V)"); sprintf(str,"%4.3f",amplitude/409.); outtextxy(510,120,str); outtextxy(400,140,"IAE="); sprintf(str,"%5.3f",iae); outtextxy(510,140,str); } voidDA(channel,Outputdata) unsignedintchannel; intOutputdata; { intlbyte,hbyte; hbyte=(Outputdata>>8)&0x0f; lbyte=Outputdata&0xff; outportb(2*(channel-1)+BASE_ADDRESS+4,lbyte); outportb(2*(channel-1)+BASE_ADDRESS+5,hbyte); return; } /* ***************************************************************** ***********FUNCTIONAD(channel,gain,trigger_moder)TYPEint*** ***************************************************************** ADGainiscanbeselectedin0,1,2,4,8; InputData=OInputData/Gain; */ intAD(channel) unsignedshortintchannel; { unsignedshortintDRDY; inthbyte,lbyte; outportb(BASE_ADDRESS+10,channel); outportb(BASE_ADDRESS+9,0); outportb(BASE_ADDRESS+11,1); DRDY=1; outportb(BASE_ADDRESS+12,1); while((DRDY! =0)) DRDY=inportb(BASE_ADDRESS+5)&0x10; hbyte=inportb(BASE_ADDRESS+5)&0x000f; lbyte=inportb(BASE_ADDRESS+4)&0x00ff; return((hbyte<<8)+lbyte); } voidcontrol(void) { floatg_e,g_c,ep; floattempp; intm,j,k,ts=saple_time; yy[i]=AD(10); y[i]=(yy[i]-2047)*2; e[i]=r[i]-y[i]; /*calculatethecontroloutputu*/ if(y[i]>2047)u[i]=0/罐内气压达到10Mpa时关断球阀/ elseif(i==0)u[0]=uf+kp*(e[0]-ef)+ki*ts*e[0]+kd/ts*(e[0]-2*ef+es); elseif(i==1)u[1]=u[0]+kp*(e[1]-e[0])+ki*ts*e[1]+kd/ts*(e[1]-2*e[0]+ef); elseu[i]=u[i-1]+kp*(e[i]-e[i-1])+ki*ts*e[i]+kd/ts*(e[i]-2*e[i-1]+e[i-2]); /增量型PID控制/ if(u[i]>4095)u[i]=4095; if(u[i]<0)u[i]=0;/控制电压逾限保护/ ida=u[i]; DA(1,ida); /*showthetime*/ itoa(i,string,10); gotoxy(20,20); cputs(string); } voidparameter(void) { DA(1,0); n=400; i=0; iad=0; e[0]=0; amplitude=8;/*0---10v*/ amplitude=amplitude*4095/10.0; for(i=0;i r[i]=amplitude; } main() { intk,m,kkp; ef=0;es=0;uf=0; DA(1,0); delay(1000); clrscr(); parameter(); sample_time=10; printf(“pleaseinput‘kp,ki,kd’: ”); scanf(“%f,%f,%f”,&kp,&ki,&kd);/PID控制的参数选取/ while(! kbhit())/循环实现较长时期控制/ { for(i=0;i { control(); delay(sample_time); } /由罐内气压与标准值之差计算控制电压进行控制/ ef=e[399];es=e[398];uf=u[399];/储存下面一组点的初始情况/ graph_r(r,r,y,e,c,u);/绘图以方便监控/ cleardevice();/清屏为下次做图准备/ } DA(1,0);/程序结束时关闭系统保障安全/ delay(100); closegraph(); return; }_
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 工业 系统 驱动 控制