modbus_rtu_crc计算方法
Modbus差错校验

Modbus差错校验在Modbus串行通信中,根据传输模式(ASCII或RTU)的不同,差错校验域采用了不同的校验方法。
(1).ASCII模式在ASCII模式中,报文包含一个错误校验字段。
该字段由两个字符组成,其值基于对全部报文内容执行的纵向冗余校验(LongitudinalRedundancyCheck,LRC)计算的结果而来,计算对象不包括起始的冒号(:)和回车换行符号(CRLF)。
(2).RTU 模式在RTU 模式中,报文同样包含一个错误校验字段。
与ASCII模式不同的是,该字段由16个比特位共两个字节组成。
其值基于对全部报文内容执行的循环冗余校验(CyclicalRedundancyCheck,CRC)计算的结果而来,计算对象包括校验域之前的所有字节。
1.LRC 校验在ASCII模式中,消息是由特定的字符作为帧头和帧尾来分隔的。
一条消息必须以“冒号”(:)字符(ASCII码为0x3A)开始,以“回车换行”(CRLF)(ASCII码为0x0D 和0x0A)结束。
LRC 校验算法的计算范围为(:)与(CRLF)之间的字符。
从算法本质来说,LRC域自身为1个字节,即包含一个8位二进制数据,由发送设备通过LRC算法计算,并把计算值附到信息末尾。
接收设备在接收信息时,通过LRC算法重新计算值,并把计算值与LRC字段中接收的实际值进行比较。
若两者不同,则产生一个错误,返回一个异常响应帧。
即对报文中的所有相邻2个8位字节相加,丢弃任何进位,然后对结果进行二进制补码,计算出LRC值。
必须注意的是,计算LRC 校验码的时机,是在对报文中每个原始字节进行ASCII码编码之前,对每个原始字节进行LRC校验的计算操作。
生成LRC校验值的过程如下:(1)对消息帧中的全部字节相加(不包括起始“:”和结束符“CR-LF”),并把结果送入8位数据区,舍弃进位。
(2)由0xFF(即全1)减去最终的数据值,产生1的补码(即二进制反码)。
Modbus+RTU协议中字节型CRC-16算法详解

设M(x)=K(x) *xr,即M(x)的位数k+r=8*(q+p)=8*m,即m个字节(Byte)。
将余数的首位0去除,在余数的末尾后添加1位0r-6,形成新的被除数,继续与除数(1gr-1⋯g0)进行mod2运算,如此重复8次,直至m0位与除数的首位1进行异或运算,这时剩下的余数去除首位0后就是信息m7⋯m0的CRC议,常规485通讯的信息发送形式如下:
为什么新信息码与生成多项式G(x)进行模-2(mod 2)除法运算结果为0呢?
模-2(mod 2)运算采用无进位的二进制加法,恰好为异或⨁操作。
1与A做⨁,A值取反。
0与A做⨁,A值保持不变。
A⨁A = 0A与自身做⨁,其值为0。
CRC校验码的产生(K(x) *xr)mod2 G(x) = R(x)
G(x)为r+1位;K(x)为k位,K(x)*xr为k+r位,即xr使K(x)的多项式系数左移r位,添了r位的0;R(x)为r位,是CRC校验码。
新信息码N(x) = K(x) *xr+ R(x)因为K(x) *xr的后r位为0,所以上式等价于N(x) = K(x) *xr⨁R(x),此刻认为R(x)是k+r位,即认为R(x)的前k个系数为0。
设M100 mod2 G(x) = A1A2,M100表示3个字节,其中后两个字节为0;G(x)是17位的生成多项式;A1A2是CRC校验码,两个字节。则对于任意三个字节的数据M1M2M3,有M1M2M3mod2 G(x)= (M100⨁0M2M3) mod2 G(x) = ((M100 mod2 G(x))⨁((0M2M3mod2 G(x)) =A1A2⨁M2M3。
串口通信crc校验计算

串口通信crc校验计算
在串口通信中,CRC(循环冗余校验)是一种常用的校验方法,用于检测数据传输过程中的错误。
下面是一个简单的CRC校验计算示例,使用的是CRC-16(也称为Xmodem CRC)算法。
假设我们要发送的数据是 0x55 0x44 0x33 0x22,我们可以按照以下步骤计算CRC校验值:
1. 确定生成多项式。
在CRC-16中,常用的生成多项式是 0x1021(二进制表示为 1000000000000010000000001)。
2. 将数据左移16位,与生成多项式进行异或操作。
在本例中,数据左移后的结果为 0x55443322'00000000。
3. 将异或操作的结果与生成多项式进行模2除法,得到余数。
在本例中,余数为 0x243F(二进制表示为 1001010001111111)。
4. 将余数左移16位,与原数据拼接起来,得到CRC校验码。
在本例中,CRC校验码为 0x55443322'243F。
以上是一个简单的CRC校验计算示例,实际应用中可能需要根据具体的协议和数据进行调整。
Modbus RTU协议中字节型CRC-16算法分析与实现

生成多项式(Ploy):是发送方与接收方的一个约定 ;在 发送方,利用生成多项式对信息多项式做模 2 除法生成校验 码。在接收方利用生成多项式对收到的编码多项式做模 2 除 法检测和确定错误位置。在编码理论中,多项式用码组来表 示,多项式的系数即为码组的码元。例如码组 1000 0000 0000
2015年 / 第3期 物联网技术 35
署 [1]。Modbus 协议以其良好的开放特性,广泛应用于各种智 能设备,因此对于数据传输的可靠性显的尤为重要。为了保证 数据在传送的过程中的正确无误,不仅需要高可靠的硬件电 路,同时还需差错检查机制,对数据信息进行校验以检测数 据传输是否错误。通常的做法就是使用校验码,而 CRC(循 环冗余校验码,Cyclic Redundancy Check )就是其中最常用 的一种校验码。为此本文对 Modbus RTU 及 CRC 原理进行了 分析,详细介绍了 CRC-16 字节型算法的实现过程,并给出了 项目实践中应用的关键代 1 Modbus RTU 协议 1.1 Modbus 协议简介
Modbus 协议是一种工业自动化系统常采用的通用标准 协议,最初于 1979 年由 Modicon 公司提出。以其开放、标 准、免收许可费等特点,被大量应用于自动化控制器和测控 仪表,已成为我国工业自动化网络协议规范的国家标准之一。 Modbus 协议支持多种结构的网络系统之间的数据通信,通过 此协议,智能控制器相互之间、智能控制器通过网络和其它设 备之间可以通信。不同厂商生产的智能控制设备可以藉此连接 成工业网络,更好的进行集中监控。
图 1 Modbus RTU 信息帧格式 Modbus RTU 采用主 - 从方式的通讯方式 [3],通信过程由 主机首先发起,从机在正确接收数据之后将处理报文返回主 机,主机可以通过广播模式与从机进行数据传输,也可以利 用不同功能码修改从机内存,实现数据双向读写的功能。其 查询响应流程如图 2 所示。
crc计算方法

crc计算方法CRC是循环冗余校验(Cyclic Redundancy Check)的简称,用于数据通信中检测数据传输中的错误。
其具有检验速度快、检验精度高等特点,因此广泛应用于各种通信协议中。
以下就是CRC计算方法的详细介绍。
1. CRC原理CRC校验采用除法运算和模2余数运算的方法,利用生成多项式G对数据进行校验,生成多项式G和数据D的长度一致,生成多项式G的最高次项系数为1,其余系数均为0。
在进行CRC校验时,需要将数据D在末尾填充一定位数的“0”,使其长度与生成多项式G一致。
然后将填充后的数据D除以生成多项式G,得到余数R,将余数R附加到输入数据D的末尾,形成校验码,发送至对方,对方接收到数据后也进行CRC校验,若余数R为0,则说明数据传输无误,否则说明数据传输存在错误。
2. CRC计算步骤(1)选择生成多项式G:生成多项式G的选择有多种方法,通常情况下会采用标准的CRC校验生成多项式,如CCITT标准的生成多项式为G(x)=x^16+x^12+x^5+1。
(2)将数据D在末尾补充r位“0”,其中r为生成多项式G的次数减一。
例如,若生成多项式G为x^16+x^12+x^5+1,则需要在数据D的末尾补充16+12+5=33位“0”。
(3)将填充后的数据D和生成多项式G转换为二进制,并将填充后的数据D 看作一个多项式。
(4)将生成多项式G左移至与数据D的最高位对齐,然后进行异或(XOR)运算。
(5)将异或后的结果右移一位,并将余数的最高位填充为0。
(6)重复上述步骤,直到生成多项式G无法再左移。
(7)将最终得到的余数R附加到输入数据D的末尾,形成校验码。
3. 示例以下示例采用16位的CRC校验生成多项式G(x)=x^16+x^12+x^5+1。
(1)假设输入数据D为0x1234(即0001001000110100)。
(2)将数据D末尾补充16+12+5=33位“0”,即D=000100100011010000000000000000000。
nodejs crc16modbus校验计算方法

nodejs crc16modbus校验计算方法CRC16是一种循环冗余校验(Cyclic Redundancy Check)的算法,广泛应用于通信协议和数据校验中,其中CRC16 Modbus校验是Modbus协议中采用的一种CRC校验方式。
下面将介绍CRC16 Modbus校验计算方法。
CRC16 Modbus校验计算方法基于一种多项式除法算法,通过将数据进行位操作运算,从而得到CRC校验值。
以下是计算CRC16 Modbus校验的步骤:1. 初始化CRC寄存器为0xFFFF。
2. 从数据的低位开始,依次进行以下操作:2.1 将低位和CRC寄存器进行异或运算,得到结果。
2.2 将CRC寄存器右移一个位。
2.3 若上一步的结果的最低位为1,将一个特定的多项式(0xA001)与CRC寄存器进行异或运算。
2.4 重复2.1~2.3步骤,直到数据的所有位都被处理。
3. CRC寄存器的当前值即为CRC16 Modbus校验值。
下面是一个基于Node.js实现CRC16 Modbus校验的示例代码:```javascriptfunction calculateCRC16Modbus(data) {let crc = 0xFFFF;for (let i = 0; i < data.length; i++) {crc ^= data[i];for (let j = 0; j < 8; j++) {if (crc & 0x0001) {crc = (crc >> 1) ^ 0xA001; // 异或的多项式0xA001} else {crc = crc >> 1;}}}return crc;}// 示例数据:[0x01, 0x02, 0x03]const data = Buffer.from([0x01, 0x02, 0x03]);const crc = calculateCRC16Modbus(data);console.log(crc.toString(16)); // 输出CRC16 Modbus校验值(十六进制格式)```上述示例代码中,calculateCRC16Modbus函数接受一个数据数组作为参数,并返回CRC16 Modbus校验值。
MODBUS_RTU 通讯协议(计数器)

MODBUS_RTU 通讯协议
1、数据传输格式:1位起始位、8位数据位、1位停止位、无奇偶校验位。
2、仪表数据格式:2字节寄存器值=寄存器数高8位二进制数+寄存器低8位二进制数
3、仪表通讯帧格式:
读寄存器命令格式:
1 2 3 4 5 6 7~8 DE 3 起始寄存器高位起始寄存器低位寄存器数高位寄存器数低位CRC 应答:
1 2 3 4~5 6~7 …M*2+2~M*2+3 M*2+4~M*2+5 DE 3 字节计数M*2 寄存器数据1 寄存器数据2…寄存器数据M CRC DE: 设备地址 (1~200)单字节
CRC: 校验字节 采用CRC-16循环冗余错误校验
举例对比说明:(LED计数器)以实际通讯数据内容为准
发送:\01\03\00\00\00\10\44\06
回收:01 03 20 01 00 08 00 8F 02 00 00 00 00 00 00 00 00 00 00 E8 00 00 00 03 55
00 00 00 00 00 00 00 00 00 00 5C 55
仪表动态数据格式
编号参数名称数据格式地址备注
1 E2PROM参数修改标志单字节定点数 0000
2 仪表类型单字节定点数 0001
3 实时测量值三字节定点数 0002
4 第一报警状态(AL1)单字节定点数 0004
5 第二报警状态(AL2)单字节定点数 0005。
MODBUS(RTU模式)通讯规约

MODBUS (RTU 模式)通讯规约采用RS-485, 波特率为9600BPS ,1位起始位,8位数据位,无校验,1位停止位,共10位注:消弧柜出厂时站址和通讯波特率已设置好,站址都为01。
CRC 校验权值为CRC-16=X16+X15+X5+1 1. 主站询问下行报文格式为:地址+功能码+起始地址+字长度+16位CRC 校验码 a.读命令功能码为03H从站应答上行报文格式为:地址+功能码+字长度+数据长度+16位CRC 校验码数据格式定义:地址 状态定义备注 01H 隔离刀闸位置 熔丝熔断 接触器分合 隔离刀熔丝C 熔丝B 熔丝A 接触器C 接触器B 接触器A 02H 开口谐振,开口过压过压 谐振 03H 三相PT 短线位置C 相 B 相 A 相 04H 三相金属接地位置C 相 B 相 A 相 05H三相弧光接地位置C 相B 相A 相注:0为分,1为合。
例:若设备地址为1 1.读取状态数据:主站发送:01 03 00 00 00 05 85 C9 ,其中 85 C9为CRC 校验码设备回应:01 03 05 40 00 00 00 00 B3 5D ,其中B3 5D 为CRC 校验码。
此时,刀闸处于合状态,其他状态均正常。
2. 远动复位 上位机进行远动复位,数据长度0001H ,并将接收的命令地址数据回应给上位机 主站发送:01 06 00 00 00 01 48 0A ,其中 48 0A 为CRC 校验码 设备回应:01 06 01 00 00 01 49 F6 ,其中 49 F6为CRC 校验码, 第6位为1表示远动复位完成。
03H ADR 00H 00H 00H 起始地址 05H CRC 低 CRC 高字节长CRC 校验功能码 地址03H ADR 05H 5个字节 字节长度CRC 低 CRC 高数据 CRC 校验功能码 地址。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
MODBUS RTU模式下的CRC方法
使用RTU模式,消息包括了一基于CRC方法的错误检测域。
CRC域检测了整个消息的内容。
CRC域是两个字节,包含一16位的二进制值。
它由传输设备计算后加入到消息中。
接收设备重新计算收到消息的CRC,并与接收到的CRC域中的值比较,如果两值不同,则有误。
CRC是先调入一值是全“1”的16位寄存器,然后调用一过程将消息中连续的8位字节各当前寄存器中的值进行处理。
仅每个字符中的8Bit数据对CRC有效,起始位和停止位以及奇偶校验位均无效。
CRC产生过程中,每个8位字符都单独和寄存器内容相或(O R),结果向最低有效位方向移动,最高有效位以0填充。
L SB被提取出来检测,如果LSB为1,寄存器单独和预置的值或一下,如果LSB为0,则不进行。
整个过程要重复8次。
在最后一位(第8位)完成后,下一个8位字节又单独和寄存器的当前值相或。
最终寄存器中的值,是消息中所有的字节都执行之后的C RC值。
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) ;
}。