测控网络课程设计_第1页
测控网络课程设计_第2页
测控网络课程设计_第3页
测控网络课程设计_第4页
测控网络课程设计_第5页
已阅读5页,还剩23页未读, 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、测控网络课程设计设计测控网络课程姓名:班级:学号:同组者:第一部分实验要求1. 要求本次实践以开发计算机测控系统为最终目的,要求掌握计算机测控系统的工作原理,学习组态王工控组态软件的使用方法, 根据要求完成工程组态; 掌握MODBUS通信协议的原理,开发具有 MODBUS通讯功能的智能仪表, 最终完成和组态工程之间的通讯。2. 设计内容与时间计划(1)熟悉组态王软件安装,基本开发环境,采用构建简单的 工程(采用仿真数据和设备,工程应包含PID功能),计划时间1天;(2)根据罐区工艺的要求,完成相应的组态工程,实现对原 油储罐的监控,计划时间2天;(3)掌握MODBUS通讯协议的工作原理,在MS

2、P430F5438单片机上编程实现 MODBUS客户端服务程序,要求通过串行口将现 场的温度、泵状态、流量等参数上传到上位机上,计划时间3天。(4)在单片机上编程实现流量、温度上下限及仪表地址和波特率等参数设置功能,同时能从上位机对仪表参数进行设置, 计划时 间2天。(5)优化设计,要求当出现通讯错误时在上位机和单片机上 都要做出相应的反应,计划时间 0.5天。(6)上位机采用高级语言编程,实现对现场智能仪表的控制。第6项为有能力者完成,计划时间1.5天。3. 详细设计要求3.1组态王工程部分:见附录13.2智能仪表部分:(1) 仪表支持 MODBUS ASCII和MODBUS RTU 通讯协

3、议。(2) 仪表具有现场参数修改功能(变送器参数、泵参数和通讯参数可以自 由设置,且单位可以更改),参数最好掉电不丢失。(3) 仪表具有参数上传功能,可以通过上位机实现对仪表参数的设置。(4) 当上位机发送的命令有问题时,仪表应进行错误处理;当仪表返回的 数据有错误时,上位机也应作出反应。3.3 MODBUSk位机软件:能够正确读写仪表数据。第二部分实验内容组态王部分1、罐区工艺流程图43542-储油罐进口电动阀;3-储油罐排污电动阀;4-储油罐岀口电动阀;5-泵图1 :罐区工艺流程图2、监控要求(1)监测各罐的液位(0-20m)/ (0-1m)/温度(0-100度)(现场仪表4-20mA输出

4、)。(2)根据各罐液位控制各罐出口电动阀(H16m,关进口阀,选择最低液位的罐进油;H15.5m高报警,H17m高高报警;液位H2m(氐报警,H1m高报警,界位1.5m高高报警;界位0.5m低报警,H0.2m低低报警;(3)启动泵组设置出入口流量(100M/h,200M3/h,250M3/h )3、硬件配置WI4- *戌丄匕:匕:弩厅拥Liinrrnrr1、组态画面主画面 | 口泵参数浪1的详细信流量:100m3/h流量;200m3/h泵3的详细信息豈2、流Jn: 300ni3/h0)if(液位1=液位2 &液位1=液位3 &液位1=液位 4 & 液位 116)进口阀1=1;进口阀2=0;进口

5、阀3=0;进口阀4=0;液位仁液位1+泵输入总流量*系数1;elseif(液位2液位1 &液位2=液位3 &液位2=液位4 &液位216)进口阀仁0;进口阀2=1;进口阀3=0;进口阀4=0;液位2=液位2+系数2*泵输入总流量;elseif(液位3液位1 &液位3液位2 &液位3= 液位4 &液位316)进口阀仁0;进口阀2=0;进口阀3=1;进口阀4=0;液位3=液位3+系数3*泵输入总流量;elseif(液位4液位1 &液位4液位2 &液位4 液位3 &液位40)if(液位1=液位2 &液位1=液位3 &液位1=液位4 &液位12)出口阀1=1;出口阀2=0;出口阀3=0;出口阀4=0;

6、液位 仁液位1-系数1*泵输出总流量;elseif(液位2=液位1 &液位2=液位3 &液位2=液位4 &液位22)出口阀仁0;出口阀2=1;出口阀3=0;出口阀4=0;液位2=液位2-系数2*泵输出总流量;elseif(液位3=液位1 &液位3=液位2 &液位3=液位4 &液位32)出口阀仁0;出口阀2=0;出口阀3=1;出口阀4=0;液位3=液位3-系数3*泵输出总流量;elseif(液位4=液位1 &液位4=液位2 &液位4=液位3 &液位42)出口阀仁0;出口阀2=0;出口阀3=0;出口阀4=1;液位4=液位4-系数4*泵输出总流量;if(排污阀1=1 |排污阀2=1 |排污阀3=1|

7、排污阀4=1)液位仁液位1-排污阀1*0.1;液位2二液位2-排污阀2*0.1;液位3二液位3-排污阀3*0.1;液位4二液位4-排污阀4*0.1;if(液位 1=16)进口阀 1=0;if(液位 2=16)进口阀 2=0;if(液位 3=16)进口阀 3=0;if(液位 4=16)进口阀 4=0;if(液位 1=2)出口阀 1=0;if(液位 2=2)出口阀 2=0;if(液位 3=2)出口阀 3=0;if(液位 4=2)出口阀 4=0;if(泵输入总流量=0)进口阀仁0;进口阀2=0;进口阀3=0;进口阀4=0;if(泵输出总流量=0)出口阀仁0;出口阀2=0;出口阀3=0;出口阀4=0;

8、智能仪表部分Modbus协议是应用于电子控制器上的一种通用语言。通过此协议,控制器相互之间、控制器经由网络(例如以太网)和其它设备之间可以通信。此协议定义了一个控制器能认识使用的消息结构,而不管它们是经过何种网络进行通信的。它描述了控制器请求访问其它设备的过程,如果回应来自其它设备的请求,以及怎样侦测错误并记录。它制定了消息域格局和内容的公共格式。un sig ned char RX32; /un sig ned char TX32; 03un sig ned char TX632; 06un sig ned char Buf10; /un sig ned int flag; /un sig

9、ned int flag1; /un sig ned int flow; /1、变量定义及函数声明单片机接受数据数组上位机发送数据标志位 单片机应答数据标志位 流量值温度值功能时单片机发送数据数组 功能时单片机发送数据数组 存储数据的数组unsigned int temperature; /un sig ned char LRC; /上位机发送数据校验码un sig ned char LRCt; /单片机应答数据校验码void TTXX();void ln_LRC();void Out_LRC();un sig ned char shitohex( un sig ned int shi);un

10、 sig ned char asciitohex( un sig ned char ascii);void selflow( un sig ned char selflow);void seltemp( un sig ned char seltemp);un sig ned char MODBUS_LRC( un sig nedchar *auchMsg, un sig ned short usDataLe n);un sig ned char hextoascii( un sig ned char hex);void RS232_i ni t();void RS232_ope n();voi

11、d RS232_close();2、串口初始化void RS232nit() RS232串口初始化 9600,N,8,1 UART2P9DIR = 0xFF;P9SEL = 0x30; / P9.4,5 = USCI_A2TXD/RXDUCA2CTL1 |= UCSWRST; / *Put state mach inein reset*UCA2CTL1 |= UCSSEL_2; / CLK = SMCLKUCA2BR0 = 78; / 9600 (see UsersGuide)UCA2BR1 = 0x00; /UCA2MCTL |= UCBRS_0+UCBRF_2+ UCOS16; / Mod

12、ulatio n UCBRSx=6, UCBRFx=0UCA2CTL1 &= UCSWRST; / *I nitialize USCI state machi ne* / RS232 串口打开 UART2void RS232_ope n() _UCA2IE |= UCRXIE; / En able USCI_A2 RX in terrupt/ RS232 串口关闭 UART2void RS232_close()UCA2IE &= UCRXIE; / Disable USCI_A2 RX in terrupt3、上位机利用UART中断给单片机发送指令#pragma vector=USCI_A2_

13、VECTOR_in terrupt void USCI_A2_ISR(void)判断是/厂一一while (!(UCA2IFG & UCTXIFG);否发送完毕:为起始标志,如果开始,标志位if(UCA2RXBUF = :) /flag 置位flag = 1;temp nu mb-;当标志位flag置位说明发送命令开始,开始接if(flag=l) /受命令数据RX0=:;if(UCA2RXBUF != OxOD & UCA2RXBUF != OxOA ) /只要不是回车换行符,就依次将数据存入接受数组RX中,同时计数变量temp numb加1temp nu mb+;RXtemp nu mb =

14、 UCA2RXBUF ;若是回车若是换行if(UCA2RXBUF = OxOD) /temp nu mb+;RXtemp numb = D;if(UCA2RXBUF = OxOA) /temp nu mb+;RXtemp numb = A;flag=O;II接受标志位清零flag1=1;II发送标志位置1TTXX();II调用发送数据函数4、单片机通过UART中断向上位机发送应答指令void TTXX()int i;int j;un sig ned int b;un sig ned int c;un sig ned int d;un sig ned char temp;In_LRC(); II

15、计数上位机发送命令校验码if(RX8=1) II如果地址为寄存器0001,发送流量数据shitohex(flow);if(RX8=2)/如果地址位寄存器0002,发送温度数据shitohex(temperature);if(RX3=0 & RX4=3) II如果是 03 号功能if(LRCHi = RXtempnumb-3) &(LRCLo= RXtempnumb-2) II如果上位机发送校验码正确for(b=0;b4)&0x0F);TX6 = hextoascii(temp*2)&0x0F);for(i=0;itemp*4;i+=2)TX7+i = hextoascii(Bufi); II要

16、发送的数据TX8+i = hextoascii(Bufi+1);temp numt = 7+i; II统计数据长度,用于计算校验码Out_LRC(); II计算单片机发送数据校验码TX7+i = LRCHi;TX8+i = LRCLo;TX9+i = 0x0D;TX10+i = 0x0A;for(j=0;jv=(10+i);j+)/while (!(UCA2IFG & UCTXIFG);否发送完毕UCA2TXBUF=TXj; else /如果校验码不正确,返回错误代码只能通过串口调试看到ERR19=8; ERR20=TX4;for(d=0;d=20;d+)while (!(UCA2IFG &

17、UCTXIFG);发送完毕UCA2TXBUF=ERRd;else if(RX3=0 & RX4=6)for(c=0;c=temp nu mb;c+)TX6c = RXc;while (!(UCA2IFG & UCTXIFG);发送完毕UCA2TXBUF=TX6c;selflow(TX610); seltemp(TX611);/单片机发送数据/设置流量值 设置温度值判断是In put LRC ERROR!判断是否如果是06号功能判断是否flag仁0; /单片机发送标志位清零tempnumb=0; /上位机发送数据计算值清零5、LRC校验模块un sig ned char MODBUS_LRC(

18、un sig nedchar *auchMsg, un sig ned short usDataLe n) un sig ned char uchLRC = 0 ; / LRC 初始化 while (usDataLe n-) /完成整个报文缓冲区uchLRC += *auchMsg+ ; / 缓冲区字节相加,无进位 retur n (un sig ned char)(-(char)uchLRC) ; / 发送和应答校验码计数程序返回二进制补码(2)void ln_LRC()un sig ned int a;for(a=1;a(temp nu mb-3);a+=2) tempRX(a-1)/2=

19、(asciitohex(RXa)4)&0x0F);LRCLo = hextoascii(LRC&0x0F);void Out_LRC()un sig ned int c;for(c=1;ctemp nu mt;c+=2) tempTX(c-1)/2 = (asciitohex(TXc)4);tempTX(c-1)/2 = (asciitohex(TXc)4)&0x0F);LRCtLo = hextoascii(LRCt&0x0F);6进制转换/十六进制数转换为ASCII码un sig ned char hextoascii( un sig ned char hex)if(hex=0x09)re

20、turn hex+0x30;else retur n hex+0x37;/ASCII码转换为十六进制的数un sig ned char asciitohex( un sig ned char ascii)if(ascii=0x39)retur n ascii-0x30; else retur n ascii-0x37;/十进制转十六进制,由于组态王通信时会自动将十六进制数转换位十进制数,因此需要在 单片机内将十进制数转换位十六进制数,这样组态王读到的就是十进制的数据。un sig ned char shitohex( un sig ned int shi)int i,b,d,c;int a=0

21、;d=4;char shiliu10;while (shi) shi代表相应的十进制数 c=shi%16; /每次除以16取余求得相应的十六进制数shi=shi/16; shiliua = c; a+;for(i=a;i=4;i+) /得到的数据首位倒置,才是要求的十六进制数 shiliui=0; for(b=0;b4;b+) d-; Bufb=shiliud; return 0;7、波特率、流量、温度的设置void selflow( un sig ned char selflow) /选定流量 switch(selflow)case 0:flow=100; break;case 1:flow

22、=1799; break;case 2:flow=5000; break;default:flow=1799; break; 宀void seltemp( un sig ned char seltemp) /选定温度switch(seltemp)case 0:temperature=1;break;case 1:temperature=20; break;case 2:temperature=100; break;default:temperature=20; break; 宀void selbps( un sig ned char selbps) /设定波特率switch(selbps)ca

23、se 0: UCA1CTL1 |= UCSSEL_1; /时钟源选择UCA1BR0 = 0x1B; /1200UCA1BR1 = 0x00; UCA1MCTL = 04; break;case 1: UCA1CTL1 |= UCSSEL_1; /时钟源选择UCA1BR0 = 0x0D; /2400UCA1BR1 = 0; UCA1MCTL = OXOA; break;case 2: UCA1CTL1 |= UCSSEL_1; /时钟源选择UCA1BRO = 6; /4800UCA1BR1 = 0; UCA1MCTL = 0x0C; UCA1CTL1 &= UCSWRST; / 使能串口功能 UCA1IE |= UCRXIE; /使能接收中断_BIS_SR(GIE); break;case 3: UCA1CTL1 |= UCSSEL_1; /时钟源选择UCA1BR0 = 3; /9600UCA1BR1 = 0; UCA1MCTL = 06; UCA1CTL1 &= UCSWRST; / 使能串口功能UCA1IE |= UCRXIE; /使能

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论