欢迎来到天天文库
浏览记录
ID:47846860
大小:84.00 KB
页数:7页
时间:2019-11-26
《关于51单片机上实现modbus协议》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、你找一个MODBUS的协议详细资料好好看看,就是一种通讯约定,你按照它规定的格式通讯就可以了协议发送给询问方。Modbus协议包括ASCII、RTU、TCP等,并没有规定物理层。此I办议立义了控制器能够认识和使用的消息结构,而不管它们是经过何种网络进行通信的。标准的Modicon控制器使用RS232C实现串行的Modbus<>Modbus的ASCII、RTU协议规定了消息、数据的结构、命令和就答的方式,数据通讯采用Maser/Slave方式,Master端发出数据请求消息,Slave端接收到正确消息后就可以发送数据到Master端以
2、响应请求;Master端也可以直接发消息修改Slave端的数据,实现双向读写。Modbus协议需要对数据进行校验,串行协议中除有奇偶校验外,ASCII模式釆用LRC校验,RTU模式釆用16位CRC校验但TCP模式没有额外规定校验,因为TCP协议是一个血向连接的可靠协议。另外,Modbus采用主从方式定时收发数据,在实际使川中如果某Slave站点断开后(如故障或关机),Master端可以诊断出來,而当故障修复后,网络又可自动接通。I大1此,Modbus协议的可靠性较好。下面我来简单的给大家介绍一下,对于Modbus的ASCII、RTU
3、和TCP协议来说,其屮TCP和RTU协议非常类似,我们只要把RTU协议的两个字节的校验码去掉,然后在RTU协议的开始加上5个0和一个6并通过TCP/IP网络协议发送出去即可。所以在这里我仅介绍一下Modbus的ASCII和RTU协议。下表是ASCII协议和RTU协议进行的比较:协议开始标记结束标记校验传输效率程序处理ASCII:(冒号)CR,LFLRC低垃观,简单,易调试RTU无无CRC高不直观,稍复杂通过比较可以看到,ASCII协议和RTU协议相比拥有开始和结束标记,凶此在进行程序处理吋能更加方便,而且由于传输的都是可见的ASCI
4、I字符,所以进行调试吋就更加的直观,另外它的LRC校验也比鮫容易。但是因为它传输的都是可见的ASCII字符,RTU传输的数据每一个字节ASCII都要用两个字节来传输,比如RTU传输一个I•六进制数0xF9,ASCII就需要传输’F''9'的ASCII码0x39和0x46两个字节,这样它的传输的效率就比较低。所以-•般來说,如果所需要传输的数据量较小町以考虑使用ASCII协议,如果所需传输的数据量比较大,最好能使川RTU协议。下而对两种协议的校验进行一下介绍。1、LRC校验LRC域是一个包含一个8位二述制值的字节。LRC值由传输设备来
5、计算并放到消息帧中,接收设备在接收消息的过程中计算LRC,并将它和接收到消息中LRC域中的值比较,如果两值不等,说明有错误。LRC校验比较简单,它在ASCII协议中使用,检测了消息域中除开始的冒号及结束的冋车换行号外的内容。它仅仅是把每一个需要传输的数据按字节叠加后取反加1即可。卞面是它的VC代码:BYTEGetCheckCode(constchar*pSendBuf,intnEnd)//获得校验码BYTEbyLrc=0;charpBuf[4J;intnData=0;for(i=l;i6、记”冒号{〃每两个需要发送的ASCII码转化为一个十六进制数pBuf[0]=pSendBuf[i];pBuff1]=pSendBuf[i+1];pBuf[2]=sscanf(pBuf,"%x",&nData);byLrc+=nData;}byLrc=〜byLrc;byLrc++;returnbyLrc;}2、CRC校验CRC域是两个字节,包含一16位的二进制值。它It传输设备计算后加入到消息小。接收设备重新计算收到消息的CRC,并与接收到的CRC域中的值比较,如果两值不同,则有误。CRC是先调入一值是全“1”的16位寄存器,然后调川7、一过程将消息屮连续的8位字节各当前寄存器屮的值进行处理。仅每个字符屮的8Bit数据对CRC有效,起始位和停止位以及奇偶校验位均无效。CRC产生过程屮,每个8位字符都单独和寄存器内容相或(OR),结果向最低有效位方向移动,最高右效位以0填充。LSB被提取出来检测,如果LSB为1,寄存器单独和预置的值或i下,如果LSB为0,则不进行。柴个过程要重复8次。在最后一位(第8位)完成后,下一个8位字节乂单独和寄存器的当前值相或。最终寄心器屮的值,是消息屮所有的字节都执行Z后的CRC值。CRC添加到消息中时,低字节先加入,然后高字节。下而是它的8、VC代码:WORDGetCheckCode(constchar*pSendBuf,intnEnd)//获得校验码{WORDwCrc=WORD(OxFFFF);for(inti=0;i
6、记”冒号{〃每两个需要发送的ASCII码转化为一个十六进制数pBuf[0]=pSendBuf[i];pBuff1]=pSendBuf[i+1];pBuf[2]=sscanf(pBuf,"%x",&nData);byLrc+=nData;}byLrc=〜byLrc;byLrc++;returnbyLrc;}2、CRC校验CRC域是两个字节,包含一16位的二进制值。它It传输设备计算后加入到消息小。接收设备重新计算收到消息的CRC,并与接收到的CRC域中的值比较,如果两值不同,则有误。CRC是先调入一值是全“1”的16位寄存器,然后调川
7、一过程将消息屮连续的8位字节各当前寄存器屮的值进行处理。仅每个字符屮的8Bit数据对CRC有效,起始位和停止位以及奇偶校验位均无效。CRC产生过程屮,每个8位字符都单独和寄存器内容相或(OR),结果向最低有效位方向移动,最高右效位以0填充。LSB被提取出来检测,如果LSB为1,寄存器单独和预置的值或i下,如果LSB为0,则不进行。柴个过程要重复8次。在最后一位(第8位)完成后,下一个8位字节乂单独和寄存器的当前值相或。最终寄心器屮的值,是消息屮所有的字节都执行Z后的CRC值。CRC添加到消息中时,低字节先加入,然后高字节。下而是它的
8、VC代码:WORDGetCheckCode(constchar*pSendBuf,intnEnd)//获得校验码{WORDwCrc=WORD(OxFFFF);for(inti=0;i
此文档下载收益归作者所有