MODBUS-CRC16的原理及C语言的实现

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

MODBUS是MODICON公司最先倡导的一种通讯协议,经过大多数公司的实际应用,逐渐被认可,成为一种标准的通讯协议。常用的MODBUS通讯协议有两种,一种是MODBUSASCII,一种是MODBUSRTU。下面以使用比较广泛的MODBUSRTU通讯协议作介绍。ModbusRTU通讯采用主-从方式。主设备与一个或多个从设备进行通讯。比较典型的主设备是PLC、PC、DCS(集散控制系统)或者RTU(远程终端单元)。ModbusRTU的从设备一般是现场设备。当ModbusRTU主设备想要从一台从设备得到数据的时候,主设备发送一条包含该从设备站地址、所需要的数据以及一个用于检测错误的CRC校验码。网络上所有其它设备都可以接收到这条信息,但是只有地址被指定的从设备才会作出反应。ModbusRTU协议桢定义可概括如下:从站地址功能代码数据区CRC16说明:从站地址(1个字节):地址必须在1---247之间。在同个主站网络中每个从站地址必须唯一。比如01。功能代码(1个字节):包含读、写多个寄存器。比如读代码为03,写代码为16。数据区(N个字节):读包含寄存器首地址,数据数量;写包含寄存器首地址,数据数量及数据。CRC16(2个字节):循环冗余校验,校验从从站地址到数据区最后一个字节,计算多项式码为A001(Hex)。由于协议结构简单易懂,网上资料介绍较多,就不做深入的探讨。本文主要对最后两个字节CRC16校验码的实现(计算法)做说明。◊计算法一般计算步骤:•步骤1:加载一值为0XFFFF的16位寄存器,此寄存器为CRC寄存器。•步骤2:把第一个8位二进制数据(即通讯协议帧的第一个字节)与16位的CRC寄存器的低8位相异或,把结果放于CRC寄存器,高八位数据不变;•步骤3:把CRC寄存器的内容右移一位,用0填补最高位,并检测移出位是0还是1。•步骤4:如果移出位为零,则重复第三步(再次右移一位);如果移出位为1,CRC寄存器与多项式0XA001进行异或。•步骤5:重复步骤3和4,直到右移8次,这样整个8位数据全部进行了处理。•步骤6:重复步骤2和5,进行通讯信息帧下一个字节的处理。•步骤7:将该通讯信息帧所有字节按上述步骤计算完成后,得到的16位CRC寄存器的高、低字节进行交换。(由于发送时低字节在前)•完成步骤1~7最后得到的CRC寄存器内容即为:CRC校验码◊计算法的C语言程序实现如下:unsignedshortModBusCRC(unsignedchar*ptr,unsignedcharsize){unsignedshorta,b,tmp,CRC16,V;CRC16=0xffff;//CRC寄存器初始值for(a=0;asize;a++)//N个字节{CRC16=*ptr^CRC16;for(b=0;b8;b++)//8位数据{tmp=CRC16&0x0001;CRC16=CRC161;//右移一位if(tmp)CRC16=CRC16^0xa001;//异或多项式}*ptr++;}V=((CRC16&0x00FF)8)|((CRC16&0xFF00)8);//高低字节转换returnV;}最后给大家提供若干数据做参考(经过程序验证):例如:“01”的校验码为“7E80”“02”的校验码为“3E81”“0103”的校验码为“4021”“0105”的校验码为“C023”

1 / 2
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功