组态王及modbus通信课程方案设计书.doc
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 组态 modbus 通信 课程 方案设计
- 资源描述:
-
测控网络课程设计 一、实践要求 本次实践以开发DCS测控系统为最终目的,要求掌握DCS测控系统的工作原理,学习组态王工控组态软件的使用方法,根据要求完成工程组态;掌握MODBUS通信协议的原理,开发具有MODBUS通讯功能的智能仪表,最终完成和组态工程之间的通讯。矚慫润厲钐瘗睞枥庑赖。 二、实践内容 分为两大部分:1、组态王基本操作 2、 MODBUS通讯 具体内容: (1) 熟悉组态王软件安装,基本开发环境,采用构建简单的工程(采用仿真数据和设备,工程应包含PID功能),计划时间1天;聞創沟燴鐺險爱氇谴净。 (2) 根据罐区工艺的要求,完成相应的组态工程,实现对原油储罐的监控,计划时间2天; (3) 掌握MODBUS通讯协议的工作原理,在MSP430F5438单片机上编程实现MODBUS客户端服务程序,要求通过串行口将现场的温度、泵状态、流量等参数上传到上位机上,计划时间3天。残骛楼諍锩瀨濟溆塹籟。 (4) 在单片机上编程实现流量、温度上下限及仪表地址和波特率等参数设置功能,同时能从上位机对仪表参数进行设置,计划时间2天。酽锕极額閉镇桧猪訣锥。 (5) 优化设计,要求当出现通讯错误时在上位机和单片机上都要做出相应的反应,计划时间0.5天。 (6) ① 上位机采用高级语言编程,实现对现场智能仪表的控制。 ② 熟悉现场总线测控网络系统,搭建PROFIBUS网络,实现对ET200S和S7-200的控制。彈贸摄尔霁毙攬砖卤庑。 组态王部分 一、设计要求 根据罐区工艺的要求,完成相应的组态工程,实现对原油储罐的监控。 1、罐区工艺流程图 2- 储油罐进口电动阀;3- 储油罐排污电动阀;4- 储油罐出口电动阀;5- 泵 图1:罐区工艺流程图 2、具体要求 (1)监测各罐的液位(0-20m)/ (0-1m)/温度(0-100度)(现场仪表4-20mA输出)。謀荞抟箧飆鐸怼类蒋薔。 (2)根据各罐液位控制各罐出口电动阀(H>16m, 关进口阀,选择最低液位的罐进油;H<2m,关出口阀,选择最高液位的罐出油),手动遥控排污阀。厦礴恳蹒骈時盡继價骚。 液位H>15.5m高报警, H>17m高高报警; 液位H<2m低报警, H<1.5m低低报警。 界位>1m高报警, 界位>1.5m高高报警; 界位<0.5m低报警, H<0.2m低低报警; (3)启动泵组设置出入口流量(100M3/h,200M3/h,250M3/h) 二、设计内容 (一)组态数据库: 数据库-----数据词典 (二)组态画面 画面1:工艺流程总画面 对画面的基本说明: 主要功能:对油罐液位的监测。 泵总开关控制进口的3个泵的总开和总关; 泵总关闭控制出口的3个泵的总关和总开; 当同时按下泵提示和某一个泵的按钮,显示该泵的详细信息; 液位报警和界位报警时记录相应的报警事件; 液位实时和历史曲线记录油罐液位的变化情况。 画面2:各泵弹出式放大画面(包括参状态/型号等),点击总画面上的泵弹出此画面 1、编写事件命令语言:当同时按下泵提示和某一个泵的按钮,显示该泵的参数信息。 2、弹出画面 画面3:液位/界位报警画面 报警设置: 低低、低、高、高高报警值设置: 液位报警画面: 画面4:液位/温度/界位各一个实时趋势图和历史趋势图 实时趋势图: 选择工具箱中的 工具,在画面上绘制一实时趋势曲线窗口。在曲线定义选项卡中选择要实时反映的变量。茕桢广鳓鯡选块网羈泪。 历史趋势图: 对于要以历史趋势曲线形式显示的变量,必须设置变量的记录属性。在“定义变量”对话框中单击“记录和安全区”属性页,将不记录改为数据变化记录,变化灵敏为:0。在工程浏览器窗口左侧的“工程目录显示区”中双击“系统配置”中的“历史数据记录”选项,弹出“历史记录配置”对话框。鹅娅尽損鹌惨歷茏鴛賴。 实时和历史趋势图: 画面4:报表画面(液位,温度,界位) 报表分为实时数据报表和历史数据报表。 (3)优化设置 1、组态操作权限 优先级分 1~999 级,1 级最低999 级最高。每个操作者的优先级别只有一个。系统安全区共有64 个,用户在进行配置时。每个用户可选择除“无”以外的多个安全区,即一个用户可有多个安全区权限。籟丛妈羥为贍偾蛏练淨。 设置油罐用户组,将管理员、操作员看成用户,并设置管理员优先级最高,并设置相应的密码。 配置 运行现象 登陆界面預頌圣鉉儐歲龈讶骅籴。 2、通过链接切换画面 增加报警画面、趋势图、报表画面,通过右侧链接 (4)画面命令语言 变量说明:g1、g2、g3、g4代表每个油罐的液位,in代表泵总开,out代表泵总关,in1、in2、in3、in4代表每个油罐的入口阀门,out1、out2、out3、out4代表每个油罐的出口阀门,clear1、clear2、clear3、clear4代表手动排污阀。bengin1,2,3和bengout1,2,3代表进口泵和出口泵。渗釤呛俨匀谔鱉调硯錦。 26 num代表泵输入总流量的比 num=bengin1*1 + bengin2*2 + bengin3*2.5; num1代表泵输出总流量的比 num1=bengout1*1 + bengout2*2 + bengout3*2.5; 设置每个油罐跟液位相关的系数值 xishu1=0.25; xishu2=0.2; xishu3=0.15; xishu4=0.3; if(in==1 && num>0) { 如果油罐1液位最低,增加油罐1的液位 if(g1<=g2 && g1<=g3 && g1<=g4 && g1<16) { in1=1; in2=0; in3=0; in4=0; g1=g1+num*xishu1; } else { 如果油罐2液位最低,增加油罐2的液位 if(g2<g1 && g2<=g3 && g2<=g4 && g2<16) { in1=0; in2=1; in3=0; in4=0; g2=g2+xishu2*num; } else { 如果油罐3液位最低,增加油罐3的液位 if(g3<g1 && g3<g2 && g3<=g4 && g3<16) { in1=0; in2=0; in3=1; in4=0; g3=g3+xishu3*num; } else { 如果油罐4液位最低,增加油罐4的液位 if(g4<g1 && g4<g2 && g4<g3 && g4<16) { in1=0; in2=0; in3=0; in4=1; g4=g4+xishu4*num; } } } } } if(out==1 && num1>0) { 如果油罐1液位最高,降低油罐1的液位 if(g1>=g2 && g1>=g3 && g1>=g4 && g1>2) { out1=1; out2=0; out3=0; out4=0; g1=g1-xishu1*num1; } else { 如果油罐2液位最高,降低油罐2的液位 if(g2>=g1 && g2>=g3 && g2>=g4 && g2>2) { out1=0; out2=1; out3=0; out4=0; g2=g2-xishu2*num1; } else { 如果油罐3液位最高,降低油罐3的液位 if(g3>=g1 && g3>=g2 && g3>=g4 && g3>2) { out1=0; out2=0; out3=1; out4=0; g3=g3-xishu3*num1; } else { 如果油罐4液位最高,降低油罐4的液位 if(g4>=g1 && g4>=g2 && g4>=g3 && g4>2) { 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=jiewei3-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—新建,如下图,配置com口跟PLC连接。 设置bengin1,2,3和bengout1,2,3分别与Q0.0等相联系,可观察到PLC输出指示灯会随着这些变量的改变和改变。擁締凤袜备訊顎轮烂蔷。 三、组态王部分总结 组态王是组态王软件是一种通用的工业监控软件,它融过程控制设计、现场操作以及工厂资源管理于一体,将一个企业内部的各种生产系统和应用以及信息交流汇集在一起,实现最优化管理,操作方便,界面美观。组态王软件结构由工程管理器、工程浏览器及运行系统三部分构成。通过这次课程设计,我们学会了如何建立一个组态王工程,如何设计界面,编写命令语言、以及报警事件、趋势曲线和报表的相关制作,权限的设置,以及与实际设备的简单通信,通过本次实习,我想在以后工作中,我们会更好的应用此例软件,完成工业监控。贓熱俣阃歲匱阊邺镓騷。 智能仪表部分 一、MODBUS ASCII和MODBUS RTU通讯协议简介 Modbus 协议是应用于电子控制器上的一种通用语言。通过此协议,控制器相互之间、控制器经由网络(例如以太网)和其它设备之间可以通信。此协议定义了一个控制器能认识使用的消息结构,而不管它们是经过何种网络进行通信的。它描述了控制器请求访问其它设备的过程,如果回应来自其它设备的请求,以及怎样侦测错误并记录。它制定了消息域格局和内容的公共格式。坛摶乡囂忏蒌鍥铃氈淚。 两种串行传输模式:RTU 模式和 ASCII 模式。 RTU传输模式: 当设备使用RTU (Remote Terminal Unit) 模式在Modbus 串行链路通信, 报文中每个8位字节含有两个4 位十六进制字符。这种模式的主要优点是较高的数据密度,在相同的波特率下比ASCII 模式有更高的吞吐率。每个报文必须以连续的字符流传送。蜡變黲癟報伥铉锚鈰赘。 RTU 模式每个字节( 11 位 ) 的格式为 : 编码系统: 8位二进制,报文中每个8 位字节含有两个4 位十六进制字符(0–9, A–F。) Bits per Byte: 1 起始位,8 数据位,首先发送最低有效位,1 位作为奇偶校验,1停止位。買鲷鴯譖昙膚遙闫撷凄。 ASCII传输模式 当 Modbus 串行链路的设备被配置为使用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 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尧侧閆繭絳闕绚勵蜆贅。 二、MODBUS ASCII编程以及与组态王通信 1、变量定义 unsigned char ERR[21]= " Input LRC ERROR!"; //出错时显示字符识饒鎂錕缢灩筧嚌俨淒。 unsigned char RX[32]; //单片机接受数据数组 unsigned char TX[32]; //03功能时单片机发送数据数组 unsigned char TX6[32]; //06功能时单片机发送数据数组 unsigned char Buf[10]; //存储数据的数组 unsigned int flag; // 上位机发送数据标志位 unsigned int flag1; //单片机应答数据标志位 unsigned int flow; // 流量值 unsigned int temperature; //温度值 unsigned char LRC; //上位机发送数据校验码 unsigned char LRCt; //单片机应答数据校验码 2、通过UART中断完成上位机给单片机发送 编程思路: 通过UART中断,实现上位机给单片机发送数据,当单片机接受到:,表示上位机要向单片机发送指令,相应标志位置1,当再次发生中断时,就开始接受数据,同时存入RX[32]的数组里,直到接收到回车换行符,则发送命令结束。此时发送标志位置1,进入应答程序。凍鈹鋨劳臘锴痫婦胫籴。 #pragma vector=USCI_A1_VECTOR __interrupt void USCI_A1_ISR(void) { while (!(UCA1IFG & UCTXIFG)); // 判断是否发送完毕恥諤銪灭萦欢煬鞏鹜錦。 if(UCA1RXBUF == ':') //:为起始标志,如果开始,标志位flag置位 { flag = 1; } if(flag==1) //当标志位flag置位说明发送命令开始,开始接受命令数据 { RX[0] = ':'; if(UCA1RXBUF != 0x0D && UCA1RXBUF != 0x0A ) //只要不是回车换行符,就依次将数据存入接受数组RX中,同时计数变量tempnumb加1鯊腎鑰诎褳鉀沩懼統庫。 { tempnumb++; RX[tempnumb] = UCA1RXBUF ; } if(UCA1RXBUF == 0x0D) //若是回车 { tempnumb++; RX[tempnumb] = 'D' ; } if(UCA1RXBUF == 0x0A) //若是换行 { tempnumb++; RX[tempnumb] = 'A' ; flag=0; //接受标志位清零 flag1=1; //发送标志位置1 TTXX(); //调用发送数据函数 } } } 3、单片机通过UART中断向上位机发送应答指令 编程思路: 先计算上位机发送数据的校验码,如果和发送的校验码相同,单片机再应答。设置寄存器地址0001,存储流量数据;设置寄存器0002,存储温度数据。然后判断是03号功能还是06号功能,若是03号功能,按照相应的格式发送数据,若是06号功能,按照命令更改数据,并返回应答命令。硕癘鄴颃诌攆檸攜驤蔹。 void TTXX() { int i; int j; unsigned int b; unsigned int c; unsigned int d; In_LRC(); //计数上位机发送命令校验码 if(RX[8]=='1') //如果地址为寄存器0001,发送流量数据 shitohex(flow); if(RX[8]=='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)&0x0F); 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] = LRCtHi; TX[8+i] = LRCtLo; TX[9+i] = 0x0D; TX[10+i] = 0x0A; for(j=0;j<=(10+i);j++) //单片机发送数据 { while (!(UCA1IFG & UCTXIFG)); // 判断是否发送完毕釷鹆資贏車贖孙滅獅赘。 UCA1TXBUF=TX[j]; } } else //如果校验码不正确,返回错误代码 Input LRC ERROR!只能通过串口调试看到怂阐譜鯪迳導嘯畫長凉。 { ERR[19]='8'; ERR[20]=TX[4]; for(d=0;d<=20;d++) { while (!(UCA1IFG & UCTXIFG)); // 判断是否发送完毕谚辞調担鈧谄动禪泻類。 UCA1TXBUF=ERR[d] ; } } } else if(RX[3]=='0' && RX[4]=='6') //如果是06号功能 { for(c=0;c<=tempnumb;c++) { TX6[c] = RX[c]; while (!(UCA1IFG & UCTXIFG)); // 判断是否发送完毕嘰觐詿缧铴嗫偽純铪锩。 UCA1TXBUF=TX6[c]; } selflow(TX6[10]); //设置流量值 seltemp(TX6[11]); //设置温度值 } flag1=0; //单片机发送标志位清零 tempnumb=0; //上位机发送数据计算值清零 } 4、辅助模块部分 (1)、LRC校验模块 编程思路 : LRC 的计算, 对报文中的所有的连续8 位字节相加,忽略任何进位,然后求出其二进制补码。 unsigned char *auchMsg; 指向含有用于生成LRC 的二进制数据报文缓冲区的指针,熒绐譏钲鏌觶鷹緇機库。 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)发送和应答校验码计数程序 void In_LRC() { unsigned int a; 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>>4)&0x0F); LRCLo = hextoascii(LRC&0x0F); } void Out_LRC() { unsigned int c; for(c=1;c<tempnumt;c+=2) { tempTX[(c-1)/2] = (asciitohex(TX[c])<<4); tempTX[(c-1)/2] = (asciitohex(TX[c])<<4) | asciitohex(TX[c+1]);銚銻縵哜鳗鸿锓謎諏涼。 } LRCt=MODBUS_LRC(&tempTX[0],(tempnumt-1)/2); //进行LRC效验计算挤貼綬电麥结鈺贖哓类。 LRCtHi = hextoascii((LRCt>>4)&0x0F); LRCtLo = hextoascii(LRCt&0x0F); } (3)进制之间转换程序 由于发送和读取的数据是字符,而寄存器中数据多按照十六进制存储,故需要各种进制间的相互转换。 //十六进制数转换为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; } //十进制转十六进制,由于组态王通信时会自动将十六进制数转换位十进制数,因此需要在单片机内将十进制数转换位十六进制数,这样组态王读到的就是十进制的数据。赔荊紳谘侖驟辽輩袜錈。 unsigned char shitohex(unsigned int shi) { int i,b,d,c; int a=0; d=4; char shiliu[10]; while (shi) //shi代表相应的十进制数 { c=shi%16; //每次除以16取余求得相应的十六进制数 shi=shi/16; shiliu[a] = c; a++; } for(i=a;i<=4;i++) //得到的数据首位倒置,才是要求的十六进制数 { shiliu[i]=0; } for(b=0;b<4;b++) { d--; Buf[b]=shiliu[d]; } 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; 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 UCA1BR1 = 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 = 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; unsigned char Crc_RX[32]; //存储上位机发送的字符的数组 unsigned char Crc_TX[32]; //存储单片机应答的字符的数组 unsigned int crcnumt; // 统计上位机发送字符数据长度 unsigned int crcnumr; //统计单片机应答数据长度 unsigned char CRCHi8; //上位机发送数据的校验码高位 unsigned char CRCLo8; //上位机发送数据的校验码低位 unsigned char CRCtHi8; //单片机发送数据的校验码高位 unsigned char CRCtLo8; //单片机应答数据的校验码低位 unsigned char Buf[10]; //测试数据 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个字符,则发送结束,R_flag1=1。骁顾燁鶚巯瀆蕪領鲡赙。 #pragma vector=USCI_A1_VECTOR __interrupt void USCI_A1_ISR(void) { if(R_flag==1) { Crc_RX[crcnumr] = 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_RX[crcnumr-2])&&(CRCLo8 == Crc_RX[crcnumr-1]))瑣钋濺暧惲锟缟馭篩凉。 { //若校验码正确 for(b=0;b<2;b++) { Crc_TX[b] = Crc_RX[b]; } 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_TX[i]; } 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展开阅读全文
咨信网温馨提示:1、咨信平台为文档C2C交易模式,即用户上传的文档直接被用户下载,收益归上传人(含作者)所有;本站仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。所展示的作品文档包括内容和图片全部来源于网络用户和作者上传投稿,我们不确定上传用户享有完全著作权,根据《信息网络传播权保护条例》,如果侵犯了您的版权、权益或隐私,请联系我们,核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
2、文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为仲裁依据,个别因单元格分列造成显示页码不一将协商解决,平台无法对文档的真实性、完整性、权威性、准确性、专业性及其观点立场做任何保证或承诺,下载前须认真查看,确认无误后再购买,务必慎重购买;若有违法违纪将进行移交司法处理,若涉侵权平台将进行基本处罚并下架。
3、本站所有内容均由用户上传,付费前请自行鉴别,如您付费,意味着您已接受本站规则且自行承担风险,本站不进行额外附加服务,虚拟产品一经售出概不退款(未进行购买下载可退充值款),文档一经付费(服务费)、不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
4、如你看到网页展示的文档有www.zixin.com.cn水印,是因预览和防盗链等技术需要对页面进行转换压缩成图而已,我们并不对上传的文档进行任何编辑或修改,文档下载后都不会有水印标识(原文档上传前个别存留的除外),下载后原文更清晰;试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓;PPT和DOC文档可被视为“模板”,允许上传人保留章节、目录结构的情况下删减部份的内容;PDF文档不管是原文档转换或图片扫描而得,本站不作要求视为允许,下载前可先查看【教您几个在下载文档中可以更好的避免被坑】。
5、本文档所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用;网站提供的党政主题相关内容(国旗、国徽、党徽--等)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
6、文档遇到问题,请及时联系平台进行协调解决,联系【微信客服】、【QQ客服】,若有其他问题请点击或扫码反馈【服务填表】;文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“【版权申诉】”,意见反馈和侵权处理邮箱:1219186828@qq.com;也可以拔打客服电话:0574-28810668;投诉电话:18658249818。




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



实名认证













自信AI助手
















微信客服
客服QQ
发送邮件
意见反馈



链接地址:https://www.zixin.com.cn/doc/2580609.html