【Modbus】 RTU CRC校验码计算方法



Modbus是美国Modicon公司(即现在的Schneider Electric公司)于1979年开发的一种通信协议,其目的是采用一根双绞线实现多个设备之间的通信。

Modbus 协议采用问答式的通信方式,具有简单、硬件便宜、通用性强、使用方便的优点,容易开发和实现。Modbus RTU几乎成了国产PLC和变频器首选的通信协议。

 Modbus 协议不需要专门的通信模块,通信所需的堆栈和协议机制是以软件形式实现的,属于ISO-OSI 参考模型的第7层。它的另一个优点是可以通过任何传输媒介进行通信,包括双绞线、无线通信、光导纤维、以太网、电话调制解调器、移动电话以及微波等。这样可以很容易地在一个新的或者是现有的工厂里建立起Modbus连接。


目前使用的Modbus有三个版本:Modbus ASCII、Modbus RTU和Modbus/TCP。

1.Modbus ASCII协议需要将一个字节的数据转换为两个字节的ASCII码后发送。Modbus RTU协议的数据以二进制进行编码,每个字节的数据只需要一个字节的通信量。

 

2.Modbus RTU通信采用主-从方式,最多传送255个字节的数据。主设备与一个或多个从设备进行通信。比较典型的主设备是PLC、PC、DCS(集散控制系统)或者RTU(远程终端单元)。Modbus RTU的从设备一般是现场设备。当Modbus RTU主设备想要从一台从设备得到数据的时候,主设备发送一条包含该从设备站地址、所需要的数据以及一个用于检测错误的CRC校验码。网络上所有其它设备都可以接收到这条信息,但是只有地址被指定的从设备才会作出反应。Modbus网络上的从设备不能发起通信,它们只能在主设备对它说话的时候回答。

 Modbus RTU采用16位的循环冗余校验码(CRC)。通过一个对数据进行“或”运算以及移位运算的复杂程序,由主设备产生CRC,并且由接收设备进行检查。如果双方计算出的CRC值不符,从设备就会要求重新传送信息。
    Modbus RTU协议分为Modbus RTU主站协议和Modbus RTU从站协议。Modbus通信是由功能码来控制的,主站直接访问从站的数据区。


3.Modbus /TCP可以被理解为以太网上的Modbus。Modbus /TCP不过是采用TCP/IP标准,简单地把Modbus信息包打包压缩而已。这样Modbus /TCP设备就可以通过以太网和光纤网络进行连接和通信。与RS-485接口相比,Modbus /TCP还允许使用更多的地址、可以采用多主站架构、传送速率可以达到GB/s的水平。Modbus /TCP网络的从站数量仅受限于网络物理层的能力。通常从站的数量一般在1024个左右。
   

附:Modbus RTU CRC校验码计算方法


在CRC计算时只用8个数据位,起始位及停止位,如有奇偶校验位也包括奇偶校验位,都不参与CRC计算。


CRC计算方法是:


1、  加载一值为0XFFFF的16位寄存器,此寄存器为CRC寄存器。


2、  把第一个8位二进制数据(即通讯信息帧的第一个字节)与16位的CRC寄存器的相异或,异或的结果仍存放于该CRC寄存器中。


3、  把CRC寄存器的内容右移一位,用0填补最高位,并检测移出位是0还是1。


4、  如果移出位为零,则重复第三步(再次右移一位);如果移出位为1,CRC寄存器与0XA001进行异或。


5、  重复步骤3和4,直到右移8次,这样整个8位数据全部进行了处理。


6、  重复步骤2和5,进行通讯信息帧下一个字节的处理。


7、  将该通讯信息帧所有字节按上述步骤计算完成后,得到的16位CRC寄存器的高、低字节进行交换


8、  最后得到的CRC寄存器内容即为:CRC校验码



直接上代码:

///<summary>

/// 转换成CRC码

///</summary>

///<param name="Array"></param>

///<param name="Rcvbuf"></param>

///<param name="Len"></param>

///<returns></returns>

//modbus CRC16

publicvoid CRC16Calc(byte[] dataBuff, int dataLen)

{

int CRCResult = 0xFFFF;

if (dataLen < 2)

{

   return;

}

for (int i = 0; i < (dataLen - 2); i++)

{

    CRCResult = CRCResult ^ dataBuff[i];

for (int j = 0; j < 8; j++)

{

if ((CRCResult & 1) == 1)

CRCResult = (CRCResult >> 1) ^ 0xA001;

else CRCResult >>= 1;

}

}

dataBuff[dataLen - 1] =Convert.ToByte(CRCResult >> 8);

dataBuff[dataLen - 2] =Convert.ToByte(CRCResult & 0xff);

}


部分参考:http://blog.sina.com.cn/s/blog_762cf5f80101ctkt.html


  • 9
    点赞
  • 71
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: Modbus RTU CRC校验算法是一种用于Modbus RTU通信协议的数据校验方法。它通过对数据进行循环冗余校验,来确保数据的完整性和准确性。具体实现方法是将数据进行位运算,然后将结果与预设的校验进行比较,如果相同则说明数据正确,否则说明数据出现错误。这种校验算法在工业自动化领域广泛应用,可以有效地保证数据传输的可靠性。 ### 回答2: Modbus RTU通讯协议是工业领域中最为常用的一种通讯协议,为了保证通讯的可靠性,在数据传输过程中需要对数据进行校验。其中,CRC校验Modbus RTU协议中最常用的一种校验算法。 CRC校验算法是通过计算数据传输过程中所有数据的校验和,来判断数据的传输是否正确。CRC校验算法可以保证在传输过程中,数据是否被恶意篡改或者发生了校验错误。 Modbus RTU协议的CRC校验算法是采用CRC-16/Modbus算法,它是一种基于位的多项式算法。CRC-16/Modbus算法的生成多项式是0x8005,也就是1000000000100001。生成多项式是指CRC算法生成CRC校验的基础多项式,用于在生成校验的时候作为参照。 在Modbus RTU通讯协议中,通讯数据的CRC校验是指用来校验通讯数据的正确性的一个固定长度的校验CRC校验的长度为2个字节,也就是16位。 Modbus RTU通讯协议中的CRC校验算法,是对通讯数据的每个字节都进行多次位移和异或运算,在运算完成后,生成一个16位的校验。这个16位的校验作为通讯数据的最后2个字节附加在数据末尾,接收方收到数据后也会进行相同的校验算法运算,计算出校验,然后再将计算出的校验和接收到的数据校验进行比较,从而判断数据是否正确。 ### 回答3: Modbus RTU是一种常用的串行通信协议,常用于工业自动化领域。CRC校验算法是Modbus RTU用来保证数据传输安全性的重要手段之一。 CRC全名为循环冗余校验(Cyclic Redundancy Check),是一种常用的数据校验方法,它通过计算数据的校验,来检查数据是否被篡改或传输中出现了错误。 Modbus RTU通过在数据帧的末尾添加两个字节的CRC校验,来检测数据的完整性。CRC校验的计算过程如下: 首先将所有需要校验的数据按照位序从高到低依次排列为一个大二进制数。然后向这个二进制数左侧填充一个位数等于校验位数的0,这个0填充表示某些传输时候的一些人为的符号,保证在任何条件下总长度不变。 接下来,生成由校验位数表示的幂的模2除法除数,并将除数与上述二进制数相异或。得到的结果继续除以上面方式进行直到不能再被除(余数小于除数),得到的余数就是CRC校验。 举一个简化的例子,有一组需要校验的数据0x01 0x02 0x03 0x04,校验位16位,则计算过程如下: 1.将这四个字节按位序从高到低依次排列成一个大的二进制数,得到00000001000000100000001100000100。 2.根据校验位数为16位,生成0110 0011 1000 0000作为除数,然后将除数与上述二进制数相异或运算,得到结果为0111 1111 0010 0010 0111 1001 0111 1011 。 3.将上述结果作为被除数,继续执行除以0110 0011 1000 0000的操作,一直除到余数小于除数为止,得到最终的CRC校验为0xB39C。 CRC校验可以被添加到Modbus RTU数据帧的末尾,接收端接收到数据后,也按照上述算法重新计算CRC校验,如果计算结果与接收到的数据中的CRC校验不一致,则说明数据已经被篡改或出现了错误。此时,接收端需要进行相应的处理,例如重新请求数据、报警等。因此,CRC校验算法在Modbus RTU中具有重要的安全保障作用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值