测控网络课程设计Word格式.docx
- 文档编号:7382663
- 上传时间:2023-05-08
- 格式:DOCX
- 页数:24
- 大小:311.64KB
测控网络课程设计Word格式.docx
《测控网络课程设计Word格式.docx》由会员分享,可在线阅读,更多相关《测控网络课程设计Word格式.docx(24页珍藏版)》请在冰点文库上搜索。
17m高高报警;
液位H<
2m低报警,H<
1.5m低低报警。
界位>
1m高报警,界位>
1.5m高高报警;
界位<
0.5m低报警,H<
0.2m低低报警;
(3)启动泵组设置出入口流量(100M3/h,200M3/h,250M3/h)
3、硬件配置
泵
现场变送器
1、组态画面主画面
泵参数
2、数据连接
数据词典
管道
液位
阀门
3、曲线
4、画面命令
泵输入总流量=泵1*1+泵2*2+泵3*2.5;
泵输出总流量=泵4*1+泵5*2+泵6*2.5;
系数1=0.25;
系数2=0.2;
系数3=0.15;
系数4=0.3;
if(泵总开==1&
&
泵输入总流量>
0)
{
if(液位1<
=液位2&
液位1<
=液位3&
=液位4&
16)
进口阀1=1;
进口阀2=0;
进口阀3=0;
进口阀4=0;
液位1=液位1+泵输入总流量*系数1;
}
else
if(液位2<
液位1&
液位2<
进口阀1=0;
进口阀2=1;
液位2=液位2+系数2*泵输入总流量;
else
if(液位3<
液位3<
液位2&
进口阀3=1;
液位3=液位3+系数3*泵输入总流量;
if(液位4<
液位4<
液位3&
进口阀4=1;
液位4=液位4+系数4*泵输入总流量;
if(泵总关==1&
泵输出总流量>
if(液位1>
液位1>
2)
出口阀1=1;
出口阀2=0;
出口阀3=0;
出口阀4=0;
液位1=液位1-系数1*泵输出总流量;
if(液位2>
=液位1&
液位2>
出口阀1=0;
出口阀2=1;
液位2=液位2-系数2*泵输出总流量;
if(液位3>
液位3>
出口阀3=1;
液位3=液位3-系数3*泵输出总流量;
if(液位4>
液位4>
出口阀4=1;
液位4=液位4-系数4*泵输出总流量;
}}}
if(排污阀1==1||排污阀2==1||排污阀3==1||排污阀4==1)
液位1=液位1-排污阀1*0.1;
液位2=液位2-排污阀2*0.1;
液位3=液位3-排污阀3*0.1;
液位4=液位4-排污阀4*0.1;
=16)
{进口阀1=0;
{进口阀2=0;
{进口阀3=0;
{进口阀4=0;
=2)
{出口阀1=0;
{出口阀2=0;
{出口阀3=0;
{出口阀4=0;
if(泵输入总流量==0)
if(泵输出总流量==0)
智能仪表部分
Modbus协议是应用于电子控制器上的一种通用语言。
通过此协议,控制器相互之间、控制器经由网络(例如以太网)和其它设备之间可以通信。
此协议定义了一个控制器能认识使用的消息结构,而不管它们是经过何种网络进行通信的。
它描述了控制器请求访问其它设备的过程,如果回应来自其它设备的请求,以及怎样侦测错误并记录。
它制定了消息域格局和内容的公共格式。
1、变量定义及函数声明
unsignedcharRX[32];
//单片机接受数据数组
unsignedcharTX[32];
//03功能时单片机发送数据数组
unsignedcharTX6[32];
//06功能时单片机发送数据数组
unsignedcharBuf[10];
//存储数据的数组
unsignedintflag;
//上位机发送数据标志位
unsignedintflag1;
//单片机应答数据标志位
unsignedintflow;
//流量值
unsignedinttemperature;
//温度值
unsignedcharLRC;
//上位机发送数据校验码
unsignedcharLRCt;
//单片机应答数据校验码
voidTTXX();
voidIn_LRC();
voidOut_LRC();
unsignedcharshitohex(unsignedintshi);
unsignedcharasciitohex(unsignedcharascii);
voidselflow(unsignedcharselflow);
voidseltemp(unsignedcharseltemp);
unsignedcharMODBUS_LRC(unsignedchar*auchMsg,unsignedshortusDataLen);
unsignedcharhextoascii(unsignedcharhex);
voidRS232_init();
voidRS232_open();
voidRS232_close();
2、串口初始化
voidRS232_init()//RS232串口初始化9600,N,8,1UART2
P9DIR=0xFF;
P9SEL=0x30;
//P9.4,5=USCI_A2TXD/RXD
UCA2CTL1|=UCSWRST;
//**Putstatemachineinreset**
UCA2CTL1|=UCSSEL_2;
//CLK=SMCLK
UCA2BR0=78;
//9600(seeUser'
sGuide)
UCA2BR1=0x00;
//
UCA2MCTL|=UCBRS_0+UCBRF_2+UCOS16;
//ModulationUCBRSx=6,UCBRFx=0
UCA2CTL1&
=~UCSWRST;
//**InitializeUSCIstatemachine**
//RS232串口打开UART2
voidRS232_open()
UCA2IE|=UCRXIE;
//EnableUSCI_A2RXinterrupt
//RS232串口关闭UART2
voidRS232_close()
UCA2IE&
=~UCRXIE;
//DisableUSCI_A2RXinterrupt
3、上位机利用UART中断给单片机发送指令
#pragmavector=USCI_A2_VECTOR
__interruptvoidUSCI_A2_ISR(void)
while(!
(UCA2IFG&
UCTXIFG));
//判断是否发送完毕
if(UCA2RXBUF=='
:
'
)//:
为起始标志,如果开始,标志位flag置位
{
flag=1;
tempnumb--;
}
if(flag==1)//当标志位flag置位说明发送命令开始,开始接受命令数据
RX[0]='
;
if(UCA2RXBUF!
=0x0D&
UCA2RXBUF!
=0x0A)//只要不是回车换行符,就依次将数据存入接受数组RX中,同时计数变量tempnumb加1
tempnumb++;
RX[tempnumb]=UCA2RXBUF;
if(UCA2RXBUF==0x0D)//若是回车
RX[tempnumb]='
D'
;
if(UCA2RXBUF==0x0A)//若是换行
A'
flag=0;
//接受标志位清零
flag1=1;
//发送标志位置1
TTXX();
//调用发送数据函数
4、单片机通过UART中断向上位机发送应答指令
voidTTXX()
inti;
intj;
unsignedintb;
unsignedintc;
unsignedintd;
unsignedchartemp;
In_LRC();
//计数上位机发送命令校验码
if(RX[8]=='
1'
)//如果地址为寄存器0001,发送流量数据
shitohex(flow);
2'
)//如果地址位寄存器0002,发送温度数据
shitohex(temperature);
if(RX[3]=='
0'
&
RX[4]=='
3'
)//如果是03号功能
if((LRCHi==RX[tempnumb-3])&
(LRCLo==RX[tempnumb-2]))//如果上位机发送校验码正确
for(b=0;
b<
=4;
b++)
{
TX[b]=RX[b];
temp=asciitohex(RX[tempnumb-4]);
//计算单片机要发送数据的字节数
TX[5]=hextoascii(((temp*2)>
>
4)&
0x0F);
TX[6]=hextoascii((temp*2)&
for(i=0;
i<
temp*4;
i+=2)
TX[7+i]=hextoascii(Buf[i]);
//要发送的数据
TX[8+i]=hextoascii(Buf[i+1]);
tempnumt=7+i;
//统计数据长度,用于计算校验码
Out_LRC();
//计算单片机发送数据校验码
TX[7+i]=LRCHi;
TX[8+i]=LRCLo;
TX[9+i]=0x0D;
TX[10+i]=0x0A;
for(j=0;
j<
=(10+i);
j++)//单片机发送数据
UCA2TXBUF=TX[j];
else//如果校验码不正确,返回错误代码InputLRCERROR!
只能通过串口调试看到
ERR[19]='
8'
ERR[20]=TX[4];
for(d=0;
d<
=20;
d++)
UCA2TXBUF=ERR[d];
elseif(RX[3]=='
6'
)//如果是06号功能
for(c=0;
c<
=tempnumb;
c++)
TX6[c]=RX[c];
UCA2TXBUF=TX6[c];
selflow(TX6[10]);
//设置流量值
seltemp(TX6[11]);
//设置温度值
flag1=0;
//单片机发送标志位清零
tempnumb=0;
//上位机发送数据计算值清零
5、LRC校验模块
unsignedcharMODBUS_LRC(unsignedchar*auchMsg,unsignedshortusDataLen)
{unsignedcharuchLRC=0;
//LRC初始化
while(usDataLen--)//完成整个报文缓冲区
uchLRC+=*auchMsg++;
//缓冲区字节相加,无进位
return((unsignedchar)(-((char)uchLRC)));
//返回二进制补码}
(2)发送和应答校验码计数程序
voidIn_LRC()
{
unsignedinta;
for(a=1;
a<
(tempnumb-3);
a+=2)
tempRX[(a-1)/2]=(asciitohex(RX[a])<
<
4)|asciitohex(RX[a+1]);
LRC=MODBUS_LRC(&
tempRX[0],(tempnumb-4)/2);
//进行LRC效验计算
LRCHi=hextoascii((LRC>
LRCLo=hextoascii(LRC&
voidOut_LRC()
for(c=1;
tempnumt;
c+=2)
tempTX[(c-1)/2]=(asciitohex(TX[c])<
4);
4)|asciitohex(TX[c+1]);
}
LRCt=MODBUS_LRC(&
tempTX[0],(tempnumt-1)/2);
//进行LRC效验计算
LRCtHi=hextoascii((LRCt>
LRCtLo=hextoascii(LRCt&
6、进制转换
//十六进制数转换为ASCII码
unsignedcharhextoascii(unsignedcharhex)
if(hex<
=0x09)
returnhex+0x30;
elsereturnhex+0x37;
}
//ASCII码转换为十六进制的数
unsignedcharasciitohex(unsignedcharascii)
if(ascii<
=0x39)
returnascii-0x30;
elsereturnascii-0x37;
//十进制转十六进制,由于组态王通信时会自动将十六进制数转换位十进制数,因此需要在单片机内将十进制数转换位十六进制数,这样组态王读到的就是十进制的数据。
unsignedcharshitohex(unsignedintshi)
inti,b,d,c;
inta=0;
d=4;
charshiliu[10];
while(shi)//shi代表相应的十进制数
{c=shi%16;
//每次除以16取余求得相应的十六进制数
shi=shi/16;
shiliu[a]=c;
a++;
for(i=a;
i++)//得到的数据首位倒置,才是要求的十六进制数
{shiliu[i]=0;
for(b=0;
4;
b++)
{d--;
Buf[b]=shiliu[d];
return0;
7、波特率、流量、温度的设置
voidselflow(unsignedcharselflow)//选定流量
{switch(selflow)
case'
flow=100;
break;
flow=1799;
flow=5000;
default:
voidseltemp(unsignedcharseltemp)//选定温度
switch(seltemp)
temperature=1;
break;
temperature=20;
temperature=100;
voidselbps(unsignedcharselbps)//设定波特率
switch(selbps)
UCA1CTL1|=UCSSEL_1;
//时钟源选择
UCA1BR0=0x1B;
//1200
UCA1BR1=0x00;
UCA1MCTL=04;
UCA1BR0=0x0D;
//2400
UCA1BR1=0;
UCA1MCTL=0X0A;
UCA1BR0=6;
//4800
UCA1MCTL=0x0C;
UCA1CTL1&
//使能串口功能
UCA1IE|=UCRXIE;
//使能接收中断
_BIS_SR(GIE);
UCA1BR0=3;
//9600
UCA1MCTL=06;
UCA1CTL1|=UCSSEL_1;
//32768hz/3=9600
8、主函数
voidmain(void)
WDTCTL=WDTPW+WDTHOLD;
//关闭看门狗
clock_init();
//时钟初始化
lcm_init();
//LCM初始化
RS232_init();
RS232_open();
_EINT();
//打开总中断
while
(1)
{}
总结
本次课程实习,主要对组态王的学习有了更深的认识,能够更好的使用组态王软件,与理解他的工作原理。
通过不断的学习与使用,也加强了我学习知识,查阅资料的能力。
本次课程中有很多以前没有遇到过的问题,例如画面命令的编写,之前是通过PLC,而这次是直接用组态王模拟,需要定义时与命令中的变量名称相同。
编程思路与方法与plc相似。
通过学习,收益良多,而且这次接触了新的内容,通讯协议。
这部分内容较难理解,我们也认真努力的去学习了解它,虽然最后没能将通信部分弄出来,但其中的收获是无价的,再次感谢老师的教导。
遇到的问题:
组态部分整体设计,管道参数的设计,画面命令等一些细节方面的问题。
解决方法:
通过与同学交流探讨,设计整体画面。
查阅资料,与老师交流,设置管道参数等等。
例如设置管道参数,需要考虑管道何时流水,与泵的关系,拿出进水泵为例,如果三个入水泵都开才有水需用与命令,若三个进水泵有一个开有水,则用或命令。
遇到问题:
通信协议接触较少,内容比较抽象,入手难。
与队友商量,查阅大量资料,分工协作,从皮毛到深入,通过不断地尝试,一步一步解决问题,虽不能实现功能要求,最重要的是学到了知识,之后遇到这样的问题将更有信心解决。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 测控 网络 课程设计
![提示](https://static.bingdoc.com/images/bang_tan.gif)