Modbus协议的CRC校验说明
Modbus通讯协议两种传输方式
1、ASCII模式
当控制器设为在Modbus网络上以ASCII(美国标准信息交换代码)模式通信,在消息中的每个8Bit字节都作为两个ASCII字符发送。这种方式的主要优点是字符发送的时间间隔可达到1秒而不产生错误。
代码系统
• 十六进制,ASCII字符0...9,A...F
• 消息中的每个ASCII字符都是一个十六进制字符组成
每个字节地位
• 1个起始位
• 7个数据位,最小的有效位先发送
• 1个奇偶校验位,无校验则无
modbus应用协议
CRC域是两个字节,包含一16位的二进制值。由传输设备计算后加入消息中。接收设备重新计算收到消息的CRC,并与接收到的CRC域中的值比较,如果两值不同,则有无。
CRC是先调入一值是全"1"的16位寄存器,然后调用一过程将消息中连续的8位字节各当前寄存器中的值进行处理。仅每个字符中的8Bit数据对CRC有效,起始位和停止位以及奇偶校验位均无效。
CRC产生过程中,每个8位字符都单独和寄存器内容相或(OR),结果向最低有效位方向移动,最高有效位以0填充。LSB被提取出来检测,如果LSB为1,寄存器单独和预置的值或一下,如果LSB为0,则不进行。整个过程要重复8次。在最后一位(第8位)完成后,下一个8位字节又单独和寄存器的当前值相或。最终寄存器中的值,是消息中所有的字节都执行之后的CRC值。
CRC添加到消息中时,低字节先加入,然后高字节。
CRC简单函数如下:
unsigned short CRC16(puchMsg, usDataLen)
unsigned char *puchMsg ; /* 要进行CRC校验的消息 */
unsigned short usDataLen ; /* 消息中字节数 */
{
unsigned char uchCRCHi = 0xFF ; /* 高CRC字节初始化 */
unsigned char uchCRCLo = 0xFF ; /* 低CRC 字节初始化 */
unsigned uIndex ; /* CRC循环中的索引 */
while (usDataLen--) /* 传输消息缓冲区 */
{
uIndex = uchCRCHi ^ *puchMsgg++ ; /* 计算CRC */
uchCRCHi = uchCRCLo ^ auchCRCHi[uIndex} ;
uchCRCLo = auchCRCLo[uIndex] ;
}
return (uchCRCHi << 8 | uchCRCLo) ;
}
/* CRC 高位字节值表 */
static unsigned char auchCRCHi[] = {
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,
0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,
0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1,
0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41,
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1,
0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,
0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40,
0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1,
0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,
0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40,
0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,
0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,
0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,
0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,
0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40,
0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1,
0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,
0x80, 0x41, 0x00, 0xC1, 0x81, 0x40
} ;
/* CRC低位字节值表*/
static char auchCRCLo[] = {
0x00, 0xC0, 0xC1, 0x01, 0xC3, 0x03, 0x02, 0xC2, 0xC6, 0x06,
0x07, 0xC7, 0x05, 0xC5, 0xC4, 0x04, 0xCC, 0x0C, 0x0D, 0xCD,
0x0F, 0xCF, 0xCE, 0x0E, 0x0A, 0xCA, 0xCB, 0x0B, 0xC9, 0x09,
0x08, 0xC8, 0xD8, 0x18, 0x19, 0xD9, 0x1B, 0xDB, 0xDA, 0x1A,
0x1E, 0xDE, 0xDF, 0x1F, 0xDD, 0x1D, 0x1C, 0xDC, 0x14, 0xD4,
0xD5, 0x15, 0xD7, 0x17, 0x16, 0xD6, 0xD2, 0x12, 0x13, 0xD3,
0x11, 0xD1, 0xD0, 0x10, 0xF0, 0x30, 0x31, 0xF1, 0x33, 0xF3,
0xF2, 0x32, 0x36, 0xF6, 0xF7, 0x37, 0xF5, 0x35, 0x34, 0xF4,
0x3C, 0xFC, 0xFD, 0x3D, 0xFF, 0x3F, 0x3E, 0xFE, 0xFA, 0x3A,
0x3B, 0xFB, 0x39, 0xF9, 0xF8, 0x38, 0x28, 0xE8, 0xE9, 0x29,
0xEB, 0x2B, 0x2A, 0xEA, 0xEE, 0x2E, 0x2F, 0xEF, 0x2D, 0xED,
0xEC, 0x2C, 0xE4, 0x24, 0x25, 0xE5, 0x27, 0xE7, 0xE6, 0x26,
0x22, 0xE2, 0xE3, 0x23, 0xE1, 0x21, 0x20, 0xE0, 0xA0, 0x60,
0x61, 0xA1, 0x63, 0xA3, 0xA2, 0x62, 0x66, 0xA6, 0xA7, 0x67,
0xA5, 0x65, 0x64, 0xA4, 0x6C, 0xAC, 0xAD, 0x6D, 0xAF, 0x6F,
0x6E, 0xAE, 0xAA, 0x6A, 0x6B, 0xAB, 0x69, 0xA9, 0xA8, 0x68,
0x78, 0xB8, 0xB9, 0x79, 0xBB, 0x7B, 0x7A, 0xBA, 0xBE, 0x7E,
0x7F, 0xBF, 0x7D, 0xBD, 0xBC, 0x7C, 0xB4, 0x74, 0x75, 0xB5,
0x77, 0xB7, 0xB6, 0x76, 0x72, 0xB2, 0xB3, 0x73, 0xB1, 0x71,
0x70, 0xB0, 0x50, 0x90, 0x91, 0x51, 0x93, 0x53, 0x52, 0x92,
0x96, 0x56, 0x57, 0x97, 0x55, 0x95, 0x94, 0x54, 0x9C, 0x5C,
0x5D, 0x9D, 0x5F, 0x9F, 0x9E, 0x5E, 0x5A, 0x9A, 0x9B, 0x5B,
0x99, 0x59, 0x58, 0x98, 0x88, 0x48, 0x49, 0x89, 0x4B, 0x8B,
0x8A, 0x4A, 0x4E, 0x8E, 0x8F, 0x4F, 0x8D, 0x4D, 0x4C, 0x8C,
0x44, 0x84, 0x85, 0x45, 0x87, 0x47, 0x46, 0x86, 0x82, 0x42,
0x43, 0x83, 0x41, 0x81, 0x80, 0x40
} ;
ModBus网络是一个工业通信系统,由带智能终端的可编程序控制器和计算机通过公用线路或局部专用线路连接而成。其系统结构既包括硬件、亦包括软件。可应用于各种数据采集和过程监控。下表1是ModBus的功能码定义。
表1 ModBus功能码
01 READ COIL STATUS
02 READ INPUT STATUS
03 READ HOLDING REGISTER
04 READ INPUT REGISTER
05 WRITE SINGLE COIL
06 WRITE SINGLE REGISTER
15 WRITE MULTIPLE COIL
16 WRITE MULTIPLE REGISTER
ModBus网络只是一个主机,所有通信都由他发出。网络可支持247个之多的远程从数控制器,但实际所支持的从机数要由所用通信设备决定。采用这个系统,各PC可以和中心主机交换信息而不影响各PC执行本身的控制任务。
ModBus的传输方式
在ModBus系统中有2种传输模式可选择。这2种传输模式与从机PC通信的能力是同等的。选择时应视所用ModBus主机而定,每个ModBus系统只能使用一种模式,不允许2种模式混用。一种模式是ASCII(美国信息交换码),另一种模式是RTU(远程终端设备)这两种模式的定义见表3
ASCII和RTU传输模式的特性
ASCII和RTU传输模式的特性
控制器能设置为两种传输模式(ASCII或RTU)中的任何一种在标准的Modbus网络通信。用户选择想要的模式,包括串口通信参数(波特率、校验方式等),在配置每个控制器的时候,在一个Modbus网络上的所有设备都必须选择相同的传输模式和串口参数。
所选的ASCII或RTU方式仅适用于标准的Modbus网络,定义了在这些网络上连续传输的消息段的每一位,以及决定怎样将信息打包成消息域和如何解码。在其网络上(MAP和Modbus Plus)Modbus消息被转成与串行传输无关的帧。
官宣!2023中国杯世界花样滑冰大奖赛落地重庆中国杯世界花样滑冰大奖赛又又又来重庆啦!2月22日,中国花样滑冰协会发布公告,正式宣布2023中国杯世界花样滑冰大奖赛落地重庆。这是继2019年2020年我市连续两年成功举办大赛后
实力不允许,挑战新的世界工程纪录,甬舟铁路要来了宁波至舟山铁路,简称甬舟铁路,甬舟铁路是浙江省大通道建设十大标志性项目之一,项目设计行车速度为每小时250公里,全线共设7个站,项目起宁波东站,东至舟山白泉,全长约76。4公里,利
考研自学or报班,来看看他们怎么说2月21日起,2023年全国硕士研究生招生考试初试成绩开通查询,相关新闻登上了热搜。据研招网官方统计,2023年研究生报考人数为474万,报考人数创历年最高。图片APP在庞大的报考
奋进的春天稳投资促消费稳外贸乘势而上开好局起好步掘地9026米!位于四川盆地的蓬深6井顺利完钻并成功固井,井深最深达9026米,刷新亚洲最深直井纪录奋战海拔4600米!初春时节,川西高原白雪皑皑,雅砻江柯拉光伏电站施工正酣掘进海
南沙卫士脚下是孤悬海上的岛礁,四周是水天相接的汪洋,他们秉承着热爱祖国无私奉献英勇作战艰苦创业团结协作的南沙精神,用无畏青春捍卫蓝色国土和海洋权益。今天的士兵面孔,聚焦4名南沙守礁战士,让
国盛智科2022年净利1。91亿元同比下降4。96中证智能财讯国盛智科(688558)2月24日晚间披露2022年度业绩快报,公司实现营业收入11。62亿元,同比增长2。22归母净利润1。91亿元,同比下降4。96扣非净利润1。6
中国网络文学影响力榜集结令丨爱潜水的乌贼网文出海,情感是关键视频加载中红网时刻新闻2月24日讯(记者袁思蕾)3月1日,中国网络文学影响力榜发布仪式将在长沙举行。这将是一场中国网络文学盛典,来自全国各地的网络作家将汇聚一堂,共襄盛举。盛会举办
宫廷土豆片18元5片?大多数消费者并不买账没有什么事是一顿火锅解决不了的,如果有,那就两顿。有烦恼,就去吃火锅,这是当代年轻人解压的一种创新方式。但是没想到,现在就连吃火锅也有了烦恼。据报道,近日,陕西西安一女子吐槽,在某
同事上午刚办完退休手续,下午就打电话,让人来把空调拆走带回家同事上午刚刚办完了退休手续,然后他下午就马上打电话,叫人来把办公室的空调拆掉,打算把空调带回家。这时候,部门的领导闻讯赶来,他阻止了我同事,说这是单位的东西,不允许他带走。可是同事
海外基金最新持仓曝光中概互联网龙头受捧证券时报记者王小芊海外基金的最新持仓动向披露,哪些中概股更被看好?近日,高瓴旗下HHLR景林贝莱德桥水基金老虎环球等海外资管机构的最新持仓曝光,中概股的最新动向也浮出水面。具体来看
奋进的春天对内对外两手抓中国经济展现硬实力央视网消息中国贸促会2月22日举行例行新闻发布会,新闻发言人介绍,近日,中国贸促会对390多家外资企业和外国商协会进行调研,结果显示,98。2的受访外资企业和外国商协会对今年中国经