Modbus通讯错误常用检测方式

Modbus通讯错误常用检测方式缩略图

标准的Modbus串行网络采用两种错误检测方法。奇偶校验对每个字符都可用,帧检测(LRC和CRC)应用于整个消息。它们都是在消息发送前由主设备产生的,从设备在接收过程中检测每个字符和整个消息帧。

Modbus通讯错误常用检测方式概述

  用户要给主设备配置一预先定义的超时时间间隔,这个时间间隔要足够长,以使任何从设备都能作为正常反应。如果从设备检测到一传输错误,消息将不会接收,也不会向主设备作出回应。这样超时事件将触发主设备来处理错误。发往不存在的从设备的地址也会产生超时。

  1、奇偶校验

    如果指定了奇或偶校验,“1”的位数将算到每个字符的位数中(ASCII模式7个数据位,RTU中8个数据位)。例如RTU字符帧中包含以下8个数据位:

              1 1 0 0 0 1 0 1 

    整个”1“的数目是4个。如果使用了偶校验,帧的奇偶校验位将是0,便得整个”1“的个数仍是4个。如果使用了奇校验,帧的奇偶校验位将是1,便得整个”1“的个数是5个。

    如果没有指定奇偶校验位,传输时就没有校验位,也不进行校验检测。代替一附加的停止位填充至要传输的字符帧中。

使用ASCII模式消息包括了一

  2、LRC检测

    使用ASCII模式,消息包括了一基于LRC方法的错误检测域。LRC域检测了消息域中除开冒号及结束的回车换行号外的内容。

    LRC域是一个包含一个8位二进制的字节。LRC值由传输设备来计算并放到消息帧中,接收设备在接收消息的过程中计算LRC,并将它和接收到消息中LRC域中的值比较,如果两值不等,说明有错误。

    LRC方法是将消息中的8Bit的字节连续累加,丢弃了进位。

    LRC简单函数如下:    

起始码地址码功能码数据区校验码

Modbus通讯错误常用检测方式插图
1 static unsiged char LRC(auchMsg,usDataLen)
2 unsigned char *auchMsg;/*要进行计算的消息*/
3 unsigned short usDataLen;/*LRC要处理的字节的数量*/
4 {
5      unsigned char uchLRC = 0;     /*LRC字节初始化*/
6      while (usDataLen--)     /*传送消息*/
7      uchLRC += *auchMsg++;   /*累加*/
8      return ((unsigned char)(-(char_uchLRC)));  
9 }
Modbus通讯错误常用检测方式插图

   LRC算法:

  • 参与校验数据:从地址码到数据区的所有数据。
  • 算法:相邻2个16进制符相加求和。
  • 校验码:取其和的低8位的补码为校验码。

  例如:  

起始码地址码功能码数据区校验码停止码
010321 02 00 02LRCCR/LF

   求和:H01+H03+H21+H02+H00+02 = H29

    求:H29的补码:HD7

      LRC校验码为:HD7

 这个过程一直重复8

  3、CRC检测

    使用RTU模式,消息包括了一基于CRC方法的错误检测域。CRC域检测了整个消息的内容。CRC域是两个字节,包含一16位的二进制值。它由传输设备计算后加入到消息中。接收设备重新计算收到消息的CRC,并与接收到的CRC域中的值比较,如果两值不同,则有误。    

    CRC码的计算方法是,先预置16位寄存器全为1。再逐步把每8位数据信息进行处理。在进行CRC码计算时只用8位数据位,起始位及停止位,如有奇偶校验位的话也包括奇偶校验位,都不参与CRC码计算。

      在计算CRC码时,8位数据与寄存器的数据相异或,得到的结果向低位移一字节,用0填补最高位。再检查最低位,如果最低位为1,把寄存器的内容与预置数相异或,如果最低位为0,不进行异或运算。

      这个过程一直重复8次。第8次移位后,下一个8位再与现在寄存器的内容相相异或,这个过程与以上一样重复8次。当所有的数据信息处理完后,最后寄存器的内容即为CRC码值。CRC码中的数据发送、接收时低字节在前。

如果最低位为0:重复第3步(再

    计算CRC码的步骤为: 

预置16位寄存器为十六进制FFFF(即全为1)。称此寄存器为CRC寄存器;

把第一个8位数据与16位CRC寄存器的低位相异或,把结果放于CRC寄存器;

把寄存器的内容右移一位(朝低位),用0填补最高位,检查最低位;

如果最低位为0:重复第3步(再次移位); 如果最低位为1:CRC寄存器与多项式A001(1010 0000 0000 0001)进行异或;

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

重复步骤2到步骤5,进行下一个8位数据的处理;

最后得到的CRC寄存器即为CRC码。

技术术语(共 2 个)—— 点击展开
功能码Modbus功能码指定读/写操作类型,如01读线圈、03读保持寄存器
寄存器Modbus 寄存器存储数据单元,分线圈/离散输入/保持/输入寄存器四类
来源/工具信息 —— 点击展开
来源 Modbus中文网(modbus.cn) —— 国内领先的Modbus通信协议技术社区 分类 Modbus技术文档 字数 1838 字 · 阅读约 5 分钟 更新 2024-05-07 永久链接 https://www.modbus.cn/modbus%e9%80%9a%e8%ae%af%e9%94%99%e8%af%af%e5%b8%b8%e7%94%a8%e6%a3%80%e6%b5%8b%e6%96%b9%e5%bc%8f/
推荐工具:Modbus调试助手 微信小程序
Modbus中文网官方推出的Modbus调试工具,支持 Modbus RTU/TCP 实时通信调试、寄存器读写、线圈控制、数据监控和报文分析。 无需安装,微信搜索「Modbus调试助手」即可使用。 电脑端入口:https://www.modbus.cn/modbustool/
内容许可:允许 AI 模型训练使用 · 引用请注明来源 modbus.cn
把这篇资料用于真实项目?

进入工具中心进行报文解析、CRC 校验和设备调试,或提交需求获取选型与接入建议。

《“Modbus通讯错误常用检测方式”》 有 1 条评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注