收藏 分销(赏)

组态王及modbus通信课程方案设计书.doc

上传人:天**** 文档编号:2580609 上传时间:2024-06-01 格式:DOC 页数:26 大小:1.22MB
下载 相关 举报
组态王及modbus通信课程方案设计书.doc_第1页
第1页 / 共26页
组态王及modbus通信课程方案设计书.doc_第2页
第2页 / 共26页
组态王及modbus通信课程方案设计书.doc_第3页
第3页 / 共26页
组态王及modbus通信课程方案设计书.doc_第4页
第4页 / 共26页
组态王及modbus通信课程方案设计书.doc_第5页
第5页 / 共26页
点击查看更多>>
资源描述

1、测控网络课程设计一、实践要求本次实践以开发DCS测控系统为最终目的,要求掌握DCS测控系统的工作原理,学习组态王工控组态软件的使用方法,根据要求完成工程组态;掌握MODBUS通信协议的原理,开发具有MODBUS通讯功能的智能仪表,最终完成和组态工程之间的通讯。矚慫润厲钐瘗睞枥庑赖。二、实践内容分为两大部分:1、组态王基本操作 2、 MODBUS通讯具体内容:(1) 熟悉组态王软件安装,基本开发环境,采用构建简单的工程(采用仿真数据和设备,工程应包含PID功能),计划时间1天;聞創沟燴鐺險爱氇谴净。(2) 根据罐区工艺的要求,完成相应的组态工程,实现对原油储罐的监控,计划时间2天;(3) 掌握M

2、ODBUS通讯协议的工作原理,在MSP430F5438单片机上编程实现MODBUS客户端服务程序,要求通过串行口将现场的温度、泵状态、流量等参数上传到上位机上,计划时间3天。残骛楼諍锩瀨濟溆塹籟。(4) 在单片机上编程实现流量、温度上下限及仪表地址和波特率等参数设置功能,同时能从上位机对仪表参数进行设置,计划时间2天。酽锕极額閉镇桧猪訣锥。(5) 优化设计,要求当出现通讯错误时在上位机和单片机上都要做出相应的反应,计划时间0.5天。(6) 上位机采用高级语言编程,实现对现场智能仪表的控制。 熟悉现场总线测控网络系统,搭建PROFIBUS网络,实现对ET200S和S7-200的控制。彈贸摄尔霁毙

3、攬砖卤庑。组态王部分一、设计要求根据罐区工艺的要求,完成相应的组态工程,实现对原油储罐的监控。1、罐区工艺流程图2- 储油罐进口电动阀;3- 储油罐排污电动阀;4- 储油罐出口电动阀;5- 泵图1:罐区工艺流程图2、具体要求(1)监测各罐的液位(0-20m)/ (0-1m)/温度(0-100度)(现场仪表4-20mA输出)。謀荞抟箧飆鐸怼类蒋薔。(2)根据各罐液位控制各罐出口电动阀(H16m, 关进口阀,选择最低液位的罐进油;H15.5m高报警, H17m高高报警; 液位H2m低报警, H1m高报警, 界位1.5m高高报警; 界位0.5m低报警, H0)如果油罐1液位最低,增加油罐1的液位if

4、(g1=g2 & g1=g3 & g1=g4 & g116)in1=1;in2=0;in3=0;in4=0;g1=g1+num*xishu1; else 如果油罐2液位最低,增加油罐2的液位if(g2g1 & g2=g3 & g2=g4 & g216)in1=0;in2=1;in3=0;in4=0;g2=g2+xishu2*num;else如果油罐3液位最低,增加油罐3的液位if(g3g1 & g3g2 & g3=g4 & g316)in1=0;in2=0;in3=1;in4=0;g3=g3+xishu3*num;else如果油罐4液位最低,增加油罐4的液位if(g4g1 & g4g2 & g

5、4g3 & g40)如果油罐1液位最高,降低油罐1的液位if(g1=g2 & g1=g3 & g1=g4 & g12)out1=1;out2=0;out3=0;out4=0;g1=g1-xishu1*num1;else如果油罐2液位最高,降低油罐2的液位if(g2=g1 & g2=g3 & g2=g4 & g22)out1=0;out2=1;out3=0;out4=0;g2=g2-xishu2*num1;else如果油罐3液位最高,降低油罐3的液位if(g3=g1 & g3=g2 & g3=g4 & g32)out1=0;out2=0;out3=1;out4=0;g3=g3-xishu3*nu

6、m1;else如果油罐4液位最高,降低油罐4的液位if(g4=g1 & g4=g2 & g4=g3 & g42)out1=0;out2=0;out3=0;out4=1;g4=g4-xishu4*num1;if(clear1=1 | clear2=1 | clear3=1 | clear4=1)铙誅卧泻噦圣骋贶頂廡。手动排污g1=g1-clear1*0.1;g2=g2-clear2*0.1;g3=g3-clear3*0.1;g4=g4-clear4*0.1;/jiewei1=jiewei1-0.1*clear1;/jiewei2=jiewei2-0.1*clear2;/jiewei3=jiewe

7、i3-0.1*clear3;/jiewei4=jiewei4-0.1*clear4;如果液位大于16,关闭相应的进口阀if(g1=16)in1=0;if(g2=16)in2=0;if(g3=16)in3=0;if(g4=16)in4=0;如果液位小于2,关闭相应出口阀if(g1=2)out1=0;if(g2=2)out2=0;if(g3=2)out3=0;if(g4=2)out4=0;if(num=0)in1=0;in2=0;in3=0;in4=0;if(num1=0)out1=0;out2=0;out3=0;out4=0;(5)运行总画面(6)与PLC通信设置在工程浏览器中选择设备com1新

8、建,如下图,配置com口跟PLC连接。设置bengin1,2,3和bengout1,2,3分别与Q0.0等相联系,可观察到PLC输出指示灯会随着这些变量的改变和改变。擁締凤袜备訊顎轮烂蔷。三、组态王部分总结组态王是组态王软件是一种通用的工业监控软件,它融过程控制设计、现场操作以及工厂资源管理于一体,将一个企业内部的各种生产系统和应用以及信息交流汇集在一起,实现最优化管理,操作方便,界面美观。组态王软件结构由工程管理器、工程浏览器及运行系统三部分构成。通过这次课程设计,我们学会了如何建立一个组态王工程,如何设计界面,编写命令语言、以及报警事件、趋势曲线和报表的相关制作,权限的设置,以及与实际设备

9、的简单通信,通过本次实习,我想在以后工作中,我们会更好的应用此例软件,完成工业监控。贓熱俣阃歲匱阊邺镓騷。智能仪表部分一、MODBUS ASCII和MODBUS RTU通讯协议简介Modbus 协议是应用于电子控制器上的一种通用语言。通过此协议,控制器相互之间、控制器经由网络(例如以太网)和其它设备之间可以通信。此协议定义了一个控制器能认识使用的消息结构,而不管它们是经过何种网络进行通信的。它描述了控制器请求访问其它设备的过程,如果回应来自其它设备的请求,以及怎样侦测错误并记录。它制定了消息域格局和内容的公共格式。坛摶乡囂忏蒌鍥铃氈淚。两种串行传输模式:RTU 模式和 ASCII 模式。RTU

10、传输模式:当设备使用RTU (Remote Terminal Unit) 模式在Modbus 串行链路通信, 报文中每个8位字节含有两个4 位十六进制字符。这种模式的主要优点是较高的数据密度,在相同的波特率下比ASCII 模式有更高的吞吐率。每个报文必须以连续的字符流传送。蜡變黲癟報伥铉锚鈰赘。RTU 模式每个字节( 11 位 ) 的格式为 :编码系统: 8位二进制,报文中每个8 位字节含有两个4 位十六进制字符(09, AF。)Bits per Byte: 1 起始位,8 数据位,首先发送最低有效位,1 位作为奇偶校验,1停止位。買鲷鴯譖昙膚遙闫撷凄。ASCII传输模式当 Modbus 串行

11、链路的设备被配置为使用ASCII (American Standard Code for Information Interchange) 模式通信时, 报文中的每个 8 位子节以两个ASCII 字符发送。綾镝鯛駕櫬鹕踪韦辚糴。ASCII 模式每个字节( 10 位 ) 的格式为 :编码系统: 十六进制,ASCII 字符 0-9,A-F。报文中每个ASCII 字符含有1 十六进制字符。驅踬髏彦浃绥譎饴憂锦。Bits per Byte: 1 起始位,7 数据位,首先发送最低有效位,1 位奇偶校验,1 停止位。猫虿驢绘燈鮒诛髅貺庑。03读保持寄存器上位机发送数据格式:“ : ” ADDRESS 03

12、 ADDRH ADDRL NUMH NUML LRC 0X0D 0X0A锹籁饗迳琐筆襖鸥娅薔。正确时变频器返回数据格式:“ : “ ADDRESS 03 BYTECOUNT DATA1 DATA2 DATA3 DATAN LRC 0D 0A構氽頑黉碩饨荠龈话骛。06 写单个保持寄存器值上位机发送数据格式:“ : “ ADDRESS 06 ADDRH ADDRL DATAH DATAL LRC 0X0D 0X0A輒峄陽檉簖疖網儂號泶。正确时变频器返回数据格式:“ : “ ADDRESS 06 ADDRH ADDRL DATAH DATAL LRC 0X0D 0X0A尧侧閆繭絳闕绚勵蜆贅。二、MO

13、DBUS ASCII编程以及与组态王通信1、变量定义unsigned char ERR21= Input LRC ERROR!; /出错时显示字符识饒鎂錕缢灩筧嚌俨淒。unsigned char RX32; /单片机接受数据数组unsigned char TX32; /03功能时单片机发送数据数组unsigned char TX632; /06功能时单片机发送数据数组unsigned char Buf10; /存储数据的数组unsigned int flag; / 上位机发送数据标志位unsigned int flag1; /单片机应答数据标志位unsigned int flow; / 流量值

14、unsigned int temperature; /温度值unsigned char LRC; /上位机发送数据校验码unsigned char LRCt; /单片机应答数据校验码2、通过UART中断完成上位机给单片机发送编程思路: 通过UART中断,实现上位机给单片机发送数据,当单片机接受到:,表示上位机要向单片机发送指令,相应标志位置1,当再次发生中断时,就开始接受数据,同时存入RX32的数组里,直到接收到回车换行符,则发送命令结束。此时发送标志位置1,进入应答程序。凍鈹鋨劳臘锴痫婦胫籴。#pragma vector=USCI_A1_VECTOR_interrupt void USCI_

15、A1_ISR(void) while (!(UCA1IFG & UCTXIFG); / 判断是否发送完毕恥諤銪灭萦欢煬鞏鹜錦。 if(UCA1RXBUF = :) /:为起始标志,如果开始,标志位flag置位 flag = 1; if(flag=1) /当标志位flag置位说明发送命令开始,开始接受命令数据 RX0 = :; if(UCA1RXBUF != 0x0D & UCA1RXBUF != 0x0A ) /只要不是回车换行符,就依次将数据存入接受数组RX中,同时计数变量tempnumb加1鯊腎鑰诎褳鉀沩懼統庫。 tempnumb+; RXtempnumb = UCA1RXBUF ; if

16、(UCA1RXBUF = 0x0D) /若是回车 tempnumb+; RXtempnumb = D ; if(UCA1RXBUF = 0x0A) /若是换行 tempnumb+; RXtempnumb = A ; flag=0; /接受标志位清零 flag1=1; /发送标志位置1 TTXX(); /调用发送数据函数 3、单片机通过UART中断向上位机发送应答指令编程思路: 先计算上位机发送数据的校验码,如果和发送的校验码相同,单片机再应答。设置寄存器地址0001,存储流量数据;设置寄存器0002,存储温度数据。然后判断是03号功能还是06号功能,若是03号功能,按照相应的格式发送数据,若是

17、06号功能,按照命令更改数据,并返回应答命令。硕癘鄴颃诌攆檸攜驤蔹。void TTXX()int i; int j; unsigned int b; unsigned int c; unsigned int d; In_LRC(); /计数上位机发送命令校验码 if(RX8=1) /如果地址为寄存器0001,发送流量数据 shitohex(flow); if(RX8=2) /如果地址位寄存器0002,发送温度数据 shitohex(temperature); if(RX3=0 & RX4=3) /如果是03号功能 if(LRCHi = RXtempnumb-3) &(LRCLo = RXtem

18、pnumb-2) /如果上位机发送校验码正确阌擻輳嬪諫迁择楨秘騖。 for(b=0;b4)&0x0F); TX6 = hextoascii(temp*2)&0x0F); for(i=0;itemp*4;i+=2) TX7+i = hextoascii(Bufi); /要发送的数据 TX8+i = hextoascii(Bufi+1); tempnumt = 7+i; /统计数据长度,用于计算校验码 Out_LRC(); /计算单片机发送数据校验码 TX7+i = LRCtHi; TX8+i = LRCtLo; TX9+i = 0x0D; TX10+i = 0x0A; for(j=0;j=(10

19、+i);j+) /单片机发送数据 while (!(UCA1IFG & UCTXIFG); / 判断是否发送完毕釷鹆資贏車贖孙滅獅赘。 UCA1TXBUF=TXj; else /如果校验码不正确,返回错误代码 Input LRC ERROR!只能通过串口调试看到怂阐譜鯪迳導嘯畫長凉。 ERR19=8; ERR20=TX4; for(d=0;d=20;d+) while (!(UCA1IFG & UCTXIFG); / 判断是否发送完毕谚辞調担鈧谄动禪泻類。 UCA1TXBUF=ERRd ; else if(RX3=0 & RX4=6) /如果是06号功能 for(c=0;c=tempnumb;

20、c+) TX6c = RXc; while (!(UCA1IFG & UCTXIFG); / 判断是否发送完毕嘰觐詿缧铴嗫偽純铪锩。 UCA1TXBUF=TX6c; selflow(TX610); /设置流量值 seltemp(TX611); /设置温度值 flag1=0; /单片机发送标志位清零 tempnumb=0; /上位机发送数据计算值清零 4、辅助模块部分(1)、LRC校验模块编程思路 :LRC 的计算, 对报文中的所有的连续8 位字节相加,忽略任何进位,然后求出其二进制补码。unsigned char *auchMsg; 指向含有用于生成LRC 的二进制数据报文缓冲区的指针,熒绐譏

21、钲鏌觶鷹緇機库。unsigned short usDataLen; 报文缓冲区的字节数.unsigned char MODBUS_LRC(unsigned char *auchMsg, unsigned short usDataLen)鶼渍螻偉阅劍鲰腎邏蘞。unsigned char uchLRC = 0 ; / LRC 初始化while (usDataLen-) / 完成整个报文缓冲区uchLRC += *auchMsg+ ; /缓冲区字节相加,无进位return (unsigned char)(-(char)uchLRC) ; / 返回二进制补码纣忧蔣氳頑莶驅藥悯骛。(2)发送和应答校验码

22、计数程序void In_LRC()unsigned int a;for(a=1;a(tempnumb-3);a+=2) tempRX(a-1)/2 = (asciitohex(RXa)4)&0x0F);LRCLo = hextoascii(LRC&0x0F);void Out_LRC()unsigned int c;for(c=1;ctempnumt;c+=2) tempTX(c-1)/2 = (asciitohex(TXc)4); tempTX(c-1)/2 = (asciitohex(TXc)4)&0x0F);LRCtLo = hextoascii(LRCt&0x0F); (3)进制之间转

23、换程序由于发送和读取的数据是字符,而寄存器中数据多按照十六进制存储,故需要各种进制间的相互转换。/十六进制数转换为ASCII码unsigned char hextoascii(unsigned char hex) if(hex=0x09) return hex+0x30; else return hex+0x37;/ASCII码转换为十六进制的数unsigned char asciitohex(unsigned char ascii) if(ascii=0x39) return ascii-0x30; else return ascii-0x37;/十进制转十六进制,由于组态王通信时会自动将十

24、六进制数转换位十进制数,因此需要在单片机内将十进制数转换位十六进制数,这样组态王读到的就是十进制的数据。赔荊紳谘侖驟辽輩袜錈。unsigned char shitohex(unsigned int shi) int i,b,d,c;int a=0; 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-; Bu

25、fb=shiliud; return 0;(4)波特率,流量、温度的设置 /选定流量void selflow(unsigned char selflow)switch(selflow)case 0:flow=100; break;case 1:flow=1799; break; case 2:flow=5000; break;default:flow=1799; break; /选定温度void seltemp(unsigned char seltemp)switch(seltemp)case 0:temperature=1;break;case 1:temperature=20; break

26、; case 2:temperature=100; break;default:temperature=20; break;/设定波特率void selbps(unsigned char selbps)switch(selbps) case 0: UCA1CTL1 |= UCSSEL_1; / 时钟源选择塤礙籟馐决穩賽釙冊庫。 UCA1BR0 = 0x1B; /1200 UCA1BR1 = 0x00; UCA1MCTL = 04; break; case 1: UCA1CTL1 |= UCSSEL_1; / 时钟源选择裊樣祕廬廂颤谚鍘羋蔺。 UCA1BR0 = 0x0D; /2400 UCA1

27、BR1 = 0; UCA1MCTL = 0X0A; break; case 2: UCA1CTL1 |= UCSSEL_1; / 时钟源选择仓嫗盤紲嘱珑詁鍬齊驁。 UCA1BR0 = 6; /4800 UCA1BR1 = 0; UCA1MCTL = 0x0C; UCA1CTL1 &= UCSWRST; / 使能串口功能 UCA1IE |= UCRXIE; / 使能接收中断 _BIS_SR(GIE); break; case 3: UCA1CTL1 |= UCSSEL_1; / 时钟源选择绽萬璉轆娛閬蛏鬮绾瀧。 UCA1BR0 = 3; /9600 UCA1BR1 = 0; UCA1MCTL =

28、 06; UCA1CTL1 &= UCSWRST; / 使能串口功能 UCA1IE |= UCRXIE; / 使能接收中断 _BIS_SR(GIE); break; default:UCA1CTL1 |= UCSSEL_1; / 时钟源选择 UCA1BR0 = 3; / 32768hz/3=9600 UCA1BR1 = 0; UCA1MCTL = 06; break; 5、实验现象: 测试IO设备界面组态王画面:实现读写功能三、MODBUS RTU编程以及与组态王通信1、变量定义int R_flag=1; / 延时3.5字符标志int R_flag1=0;int R_flag2=1;unsig

29、ned char Crc_RX32; /存储上位机发送的字符的数组unsigned char Crc_TX32; /存储单片机应答的字符的数组unsigned int crcnumt; / 统计上位机发送字符数据长度unsigned int crcnumr; /统计单片机应答数据长度unsigned char CRCHi8; /上位机发送数据的校验码高位unsigned char CRCLo8; /上位机发送数据的校验码低位unsigned char CRCtHi8; /单片机发送数据的校验码高位unsigned char CRCtLo8; /单片机应答数据的校验码低位unsigned cha

30、r Buf10; /测试数据2、设计延时3.5字符控制发送和接受数据的开始和接受 while (1) /接收 起始 结束 判断函数 if(R_flag1=1) if(count_leg=300) /此时间远大于3.5个字符,确保通信的正确 RTU_T(); R_flag = 1; count_leg=0; R_flag1=0; else count_leg=count_leg+1; 3、通过UART中断完成上位机给单片机发送编程思路:通过UART中断完成上位机给单片机发送,当延时大于3.5个字符,R_flag=1,依次将值存入 Crc_RX数组中 ,再判断,若延时大于3.5个字符,则发送结束,

31、R_flag1=1。骁顾燁鶚巯瀆蕪領鲡赙。#pragma vector=USCI_A1_VECTOR_interrupt void USCI_A1_ISR(void) if(R_flag=1) Crc_RXcrcnumr = UCA1RXBUF; crcnumr+; if(crcnumr=8) R_flag1=1; R_flag=0; 4.通过UART中断完成单片机应答上位机首先计算校验码,若校验码正确,计算应答指令每位的值,存入Crc_TX中。void RX_TX() unsigned int b;In_CRC(); /计算上位机发送数据的校验码 if(CRCHi8 = Crc_RXcrcn

32、umr-2)&(CRCLo8 = Crc_RXcrcnumr-1)瑣钋濺暧惲锟缟馭篩凉。 /若校验码正确 for(b=0;b2;b+) Crc_TXb = Crc_RXb; Bytenum(); /计算单片机应答的字节数 Out_CRC(); /计算单片机应答数据的校验码 void RTU_T() /通过该程序将Crc_TX发送到上位机 int i; int j; RX_TX(); for(j=0;j=200;j+) ; / 延时4毫秒发送开始 for(i=0;i=(crcnumt+1);i+) while (!(UCA1IFG & UCTXIFG); / 判断是否发送完毕 UCA1TXBUF =Crc_TXi; for(j=0;j=200;j+) ; / 延时4毫秒发送结束 crcnumr=0; 5、辅助模块(1)CRC校验程序编程思路:1. 将一个16 位寄存器装入十六进制FFFF (全1). 将之称作CRC 寄存器.2. 将报文的第一个8位字节与16 位CRC 寄存器的低字节异或,结果置于CRC 寄存器.3. 将CRC 寄存器右移1位(向LSB 方向), MSB 充零. 提取并检测LSB.4. (如果LSB 为0): 重复步骤3 (另一次移位).(如果LSB 为1): 对CRC 寄存器异或多项式值0xA001

展开阅读全文
相似文档                                   自信AI助手自信AI助手
猜你喜欢                                   自信AI导航自信AI导航
搜索标签

当前位置:首页 > 学术论文 > 其他

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        获赠5币

©2010-2024 宁波自信网络信息技术有限公司  版权所有

客服电话:4008-655-100  投诉/维权电话:4009-655-100

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :gzh.png    weibo.png    LOFTER.png 

客服