基于BL的以太网温度控制系统.docx
《基于BL的以太网温度控制系统.docx》由会员分享,可在线阅读,更多相关《基于BL的以太网温度控制系统.docx(17页珍藏版)》请在冰豆网上搜索。
基于BL的以太网温度控制系统
基于BL2000的以太网温度控制系统
(系统控制部分)
一基于BL2000的以太网简介
BL2000是Wildeat公司生产的一个功能强大的开放的实时嵌入式系统,其RabbitCoreRCM2000模块内和你Rabbit2000微处理器、大容量Flash及STAM、内置以太网接口,可直接通过网络实时监控;具备RS-232/RS-485接口,可与各种串行设备快速进行网络连接;内置A/D、D/A转换器,可快速有效地实现A/D、D/A转换。
BL2000的开发软件时在专用的开发环境DynamicC下编译、调试通过。
可通过在编程时对特定的头文件进行调用,实现TCP/IP协议的使用,免去了复杂的协议学习步骤,可通过FrontPage,DreamWave等软件现行进行网页制作,在通过编译语言将其写入程序内进行调用,最后存储在BL2000内,将工业的模拟量接口接与BL2000相应的接口上,数据处理在程序内部完成,这样就实现了数据采集到BL2000上,然后进行数据处理同时通过IE登录网站可观看采集结果及处理结果的全过程。
二BL2000以太网温度控制系统
1实验目的
1掌握BL2000的系统特点,并可独立完成BL2000的硬件设计,连接
2掌握网页制作基础,理解BL2000调用网页的方法
3掌握DynamicC的编写原理,理解CGI函数的构成并会调试
2实验仪器
温度控制试验箱、以太网控制网络系统平台、上位微机一台、PT100传感器一个、电烤炉一个、导线若干
3实验内容
通过BL2000独立设计一个以太网温度控制系统,实现现场温度(既烤炉内的温度)通过PT100传感器采集到BL2000内部中去,然后通过BL2000对上位机进行实时的数据显示同时BL2000内部通过事先设计好的算法进行数据处理,要求实现PID控制,对系统可进行微分,积分,比例等值的独立更改。
4实验电路
如图所示:
三硬件电路介绍
1嵌入式控制器BL2000
1)BL2000的概述
BL2000是Wildeat公司生产的一个功能强大的开发的实时嵌入式系统,其RabbitCoreRCM2000模块内含Rabbit2000微处理器、大容量Flash及SARM、内置以太网接口,可直接通过实时监控;具备RS-232/RS-485接口,可与各种串行设备快速进行网络连接;内置A/D、D/A转换器,可快速有效地实现A/D、D/A转换。
所有的BL2000系列模块可以使用恰当的辅助硬件通过以太网/互联网进行编程和调试。
带有10Base-T以太网接口的系统可以直接通过局域网或互联网进行控制和监视,能够对远端设备开放接口,能够提供网页服务,还能够发送e-mail。
BL2000系列对于大系统来说作为一个具有网络功能的服务处理器也是非常理想的。
BL2000的开放软件时在专用的集成开发环境下编译、调试通过的。
2)BL2000系统的特点
BL2000单板系统在设计当初就充分考虑了使用的方便性、透明性,无论是采集模拟信号还是采集数字信号都可以直接实现,现将BL2000系统的特点介绍如下:
1具有RJ-45插口的10Base-T以太网接口。
2简便的连通性。
3快速的22.1MHz时钟。
4多达28个数字量I/O通道。
5可方便实现12位A/D、D/A转换,具有4个串口。
6内含128KB的SARM和256KB的Flash。
7BL2000单板电路中具有板继电器。
8带有后备电池的时间/日期时钟。
BL2000单板系统实物图
BL2000引脚结构图
2pt100
pt100是铂热电阻,它的阻值会随着温度的变化而改变。
PT后的100即表示它在0℃时阻值为100欧姆,在100℃时它的阻值约为138.5欧姆。
它的工业原理:
当PT100在0摄氏度的时候他的阻值为100欧姆,它的阻值会随着温度上升而成匀速增长的。
Pt100的分度表
-50度
80.31欧姆
30度
111.67欧姆
110度
142.29欧姆
190度
172.17欧姆
-40度
84.27欧姆
40度
115.54欧姆
120度
146.07欧姆
200度
175.86欧姆
-30度
88.22欧姆
50度
119.40欧姆
130度
149.83欧姆
-20度
92.16欧姆
60度
123.24欧姆
140度
153.58欧姆
-10度
96.09欧姆
70度
127.08欧姆
150度
157.33欧姆
0度
100.00欧姆
80度
130.90欧姆
160度
161.05欧姆
10度
103.90欧姆
90度
134.71欧姆
170度
164.77欧姆
20度
107.79欧姆
100度
138.51欧姆
180度
168.48欧姆
PT100铂电阻RT曲线图表
四数据采集实验步骤
1现场温度通过Pt100采集,得到相应的电流模拟量通过温度控制仪表传输给电流表显示和双向硅。
2同时将采集来的模拟量传输给BL2000进行转换,转换成数字量调入内部程序进行数据处理。
3BL2000将处理后的结果(数字量)进行转换变为模拟量在模拟量接口对温度控制仪表XTM602进行传输。
4XTM602得到传输过来的模拟量后对数显表进行显示同时对双向硅进行控制使双向硅输出电压发生变化,达到对电炉的控制。
五系统软件编程过程
系统软件即上位机的程序主要采用FrontPage设计的网页,通过IE调用完成,设计的网页主要包括:
主界面:
控制界面、显示界面、启停界面,登入界面,修改密码界面。
通过超链接连接各网页并在主程序中完成了相应的网页调用指令和CGI指令的设计。
六部分DynamicoC程序
BL2000的开放软件时在专用的集成开发环境下编译、调试通过的。
动态C语言接近于单步同于传统的C语言,是基于Windows95/98/NT及Linux平台的Rabbit应用软件的完整开发系统,它作为应用程序运行于IBM-PC兼容机上,是Z-Word公司为基于Rabbit微处理器的嵌入式系统而设计的专门的C编译系统。
动态C包含了很多底层的I/O驱动函数库,大大减轻了软件开发的工作量。
它具有实时多任务内核,提供Socker级的TCP/IP编程,支持多种网络协议。
应用动态C进行软件开发,无需仿真器和编程器,开发成本大大降低。
另外,由于动态C直接对存储器进行编译,函数及库都可以实现以动态方式进行编译与连接,因此具有了极大的速度优势。
在基于BL2000以太网温度控制实验设计中,主要通过DynamicC实现对网页的调用和数据的处理等功能,其具体的程序为:
#classauto
/***********************************
*配置字节*
*-------------*
*更改网关以及IP地址适应自己的网络*
***********************************/
#defineMY_GATEWAY"10.103.0.1"
#defineMY_IP_ADDRESS"10.103.0.226"
#defineMY_NETMASK"255.255.255.0"
#defineTCP_BUF_SIZE2048
/*
*WEB服务的配置字节
*/
#defineHTTP_MAXSERVERS2
#defineMAX_TCP_SOCKET_BUFFERS2
#defineREDIRECTHOSTMY_IP_ADDRESS
/********************************
*结束配置字节*
********************************/
//#defineREDIRECTTO"http:
//"REDIRECTHOST"/index.shtml"
#defineREDIRECTTO"http:
/index.shtml"
#memmapxmem
#use"dcrtcp.lib"
#use"http.lib"
#ximport"C:
\试验设备\整理版\温度控制试验/pages/maincontrol.htm"index_htm
#ximport"C:
\试验设备\整理版\温度控制试验/pages/left.htm"left_htm
#ximport"C:
\试验设备\整理版\温度控制试验/pages/right.htm"right_htm
#ximport"C:
\试验设备\整理版\温度控制试验/pages/top.htm"top_htm
#ximport"C:
\试验设备\整理版\温度控制试验/pages/control.htm"control_htm
#ximport"C:
\试验设备\整理版\温度控制试验/pages/bj01.gif"bj01_gif
#ximport"C:
\试验设备\整理版\温度控制试验/pages/newpage3.htm"newpage3
#ximport"C:
\试验设备\整理版\温度控制试验/pages/newpage1.htm"newpage1
#ximport"C:
\试验设备\整理版\温度控制试验/pages/newpage7.htm"newpage7
#ximport"C:
\试验设备\整理版\温度控制试验/pages/newpage8.htm"newpage8
/*thedefaultfor/mustbefirst*/
constHttpTypehttp_types[]=
{
{".shtml","text/html",shtml_handler},//ssi
{".html","text/html",NULL},//html
{".cgi","",NULL},//cgi
{".gif","image/gif",NULL},
{".jpg","image/jpg",NULL}
};
//#defineLOCOUNT400//setsupalowvoltagecalibrationpoint
//#defineHICOUNT3695//setsupahighvoltagecalibrationpoint
chartempback[45];
charmyswitch[50];
charwarm[50];//高温报警灯
charvolnum[30];
chare[30];
charcurtemp[30];
chartartemp[30];
charruntime[30];
charparap[30];
charparai[30];
charparad[80];
charsdtime[80];
charsdtemp[30];
charsdhtemp[30];//!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
floatfe;//温度偏差
floatUi;//积分项
floatftargettemp;//设定温度
floatfhightemp;//高温报警
floatfparap;//PID参数
floatfparai;//PID参数
floatfparad;//PID参数
longltotletime;//系统运行的时间
intmins;
/*实际控制使用的参数*/
floatfgettemp;//实际采样的温度
intrunstop;//系统开关,启动系统
floatftempdiv[2];//温度的偏差
#defineMAX_FORMSIZE64
typedefstruct{
char*name;
charvalue[MAX_FORMSIZE];
}FORMType;
FORMTypeFORMSpec[6];
intswitchtoggle(HttpState*state)
{
if(strcmp(myswitch,"http:
//10.103.0.221/试验项目\\qidong.jpg")==0)
{
runstop=0;
strcpy(myswitch,"http:
//10.103.0.221/试验项目\\tingzhi.jpg");
}
else
{
runstop=-1;
mins=0;
strcpy(myswitch,"http:
//10.103.0.221/试验项目\\qidong.jpg");
}
cgi_redirectto(state,"http:
10.103.0.221/试验项目\\control.htm");
return0;
}
voidUpdate_AD()//AD刷新函数
{
floatftemp;
intiloop;
ftemp=0;
for(iloop=0;iloop<100;iloop++)
{
ftemp+=anaInVolts
(1);
}
fgettemp=ftemp/10;
if(fgettemp<50)
{fgettemp=fgettemp+0.4;}
if(fgettemp>50)
{fgettemp=fgettemp+1.1;}
}
voidControlTemp()//温度控制函数
{
floatfoutvol;
if(runstop==0)//程序开始
{
ftempdiv[1]=ftargettemp-fgettemp;//定义温度差
fe=ftempdiv[1];
Ui=Ui+ftempdiv[1];//
foutvol=(fparap*ftempdiv[1]+fparai*Ui+fparad*(ftempdiv[1]-ftempdiv[0]))/20;//PID控制算法
ftempdiv[0]=ftempdiv[1];//前一状态=后一状态(刷新)
}
else//程序没有运行
{
ftempdiv[1]=ftargettemp-fgettemp;//定义温度差
fe=ftempdiv[1];
foutvol=0;
Ui=0;
ftempdiv[0]=0;
ftempdiv[1]=0;
sprintf(e,"%.2f",fe);
sprintf(runtime,"%d\n",mins);
anaOutVolts(1,foutvol);//模拟量输出语句(使用通道0,foutvol为输出的模拟量的DA值)
}
if(foutvol>3.5)foutvol=4;
if(foutvol<0.5)foutvol=0;
anaOutVolts(1,foutvol);
sprintf(e,"%.2f",fe);//显示语句
sprintf(volnum,"%.2f",foutvol);
sprintf(curtemp,"%.2f",fgettemp);
}
/*
*Parseonetoken'foo=bar',matching'foo'tothenamefieldin
*thestruct,andstoring'bar'intothevalue
*/
voidparse_token(HttpState*state)
{
autointi,len;
for(i=0;i{
if(state->buffer[i]=='=')
state->buffer[i]='\0';
}
state->p=state->buffer+strlen(state->buffer)+1;
for(i=0;i<(sizeof(FORMSpec)/sizeof(FORMType));i++){
if(!
strcmp(FORMSpec[i].name,state->buffer)){
len=(strlen(state->p)>MAX_FORMSIZE)?
MAX_FORMSIZE-1:
strlen(state->p);
strncpy(FORMSpec[i].value,state->p,1+len);
FORMSpec[i].value[MAX_FORMSIZE-1]='\0';
}
}
}
/*
*parsetheurl-encodedPOSTdataintotheFORMSpecstruct
*(ie:
parse'foo=bar&baz=qux'intothestruct
*/
intparse_post(HttpState*state)
{
autointretval;
while
(1)
{
retval=sock_fastread((sock_type*)&state->s,state->p,1);
if(0==retval)
{
*state->p='\0';
parse_token(state);
return1;
}
/*shouldthisonlybe'&'?
(allowtheeolnasvalidtext?
)*/
if((*state->p=='&')||(*state->p=='\r')||(*state->p=='\n'))
{
/*foundonetoken*/
*state->p='\0';
parse_token(state);
state->p=state->buffer;
}
else
{
state->p++;
}
if((state->p-state->buffer)>HTTP_MAXBUFFER)
{
/*inputtoolong*/
return1;
}
}
return0;/*endofdata-loopagaintogiveittimetowritemore*/
}
/*
*Samplesubmit.cgifunction
*/
intsubmit(HttpState*state)
{
autointi;
if(state->length)
{
/*buffertowriteout*/
if(state->offsetlength)
{
state->offset+=sock_fastwrite((sock_type*)&state->s,
state->buffer+(int)state->offset,
(int)state->length-(int)state->offset);
}
else
{
state->offset=0;
state->length=0;
}
}
else
{
constHttpSpechttp_flashspec[]=
{
{HTTPSPEC_FILE,"/",index_htm,NULL,0,NULL,NULL},
{HTTPSPEC_FILE,"/index.htm",index_htm,NULL,0,NULL,NULL},
{HTTPSPEC_FILE,"/right.htm",right_htm,NULL,0,NULL,NULL},
{HTTPSPEC_FILE,"/left.htm",left_htm,NULL,0,NULL,NULL},
{HTTPSPEC_FILE,"/top.htm",top_htm,NULL,0,NULL,NULL},
{HTTPSPEC_FILE,"/control.htm",control_htm,NULL,0,NULL,NULL},
{HTTPSPEC_FILE,"/bj01.gif",bj01_gif,NULL,0,NULL,NULL},
{HTTPSPEC_FILE,"/newpage3.htm",newpage3,NULL,0,NULL,NULL},
{HTTPSPEC_FILE,"/newpage1.htm",newpage1,NULL,0,NULL,NULL},
{HTTPSPEC_FILE,"/newpage7.htm",newpage7,NULL,0,NULL,NULL},
{HTTPSPEC_FILE,"/newpage8.htm",newpage8,NULL,0,NULL,NULL},
{HTTPSPEC_VARIABLE,"myswitch",0,myswitch,PTR16,"%s",NULL},
{HTTPSPEC_VARIABLE,"warm",0,warm,PTR16,"%s",NULL},
{HTTPSPEC_VARIABLE,"e",0,e,PTR16,"%s",NULL},
{HTTPSPEC_VARIABLE,"volnum",0,volnum,PTR16,"%s",NULL},
{HTTPSPEC_VARIABLE,"curtemp",0,curtemp,PTR16,"%s",NULL},
{HTTPSPEC_VARIABLE,"tartemp",0,tartemp,PTR16,"%s",NULL},
{HTTPSPEC_VARIABLE,"runtime",0,runtime,PTR16,"%s",NULL},
{HTTPSPEC_VARIABLE,"parap",0,parap,PTR16,"%s",NULL},
{HTTPSPEC_VARIABLE,"parai",0,parai,PTR16,"%s",NULL},
{HTTPSPEC_VARIABLE,"parad",0,parad,PTR16,"%s",NULL},
{HTTPSPEC_VARIABLE,"sdtime",0,sdtime,PTR16,"%s",NULL},
{HTTPS