zoukankan      html  css  js  c++  java
  • Modbus通讯错误检测方法

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

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

      1、奇偶校验

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

                  1 1 0 0 0 1 0 1 

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

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

      2、LRC检测

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

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

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

        LRC简单函数如下:    

    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 }

       LRC算法:

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

      例如:  

    LRC算法举例
    起始码 地址码 功能码 数据区 校验码 停止码
    01 03 21 02 00 02 LRC CR/LF

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

        求:H29的补码:HD7

          LRC校验码为:HD7

      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码中的数据发送、接收时低字节在前。

        计算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码。

     

       参考:http://www.360doc.com/content/14/0120/10/7991404_346584755.shtml

  • 相关阅读:
    HBase with MapReduce (MultiTable Read)
    HBase with MapReduce (SummaryToFile)
    HBase with MapReduce (Summary)
    HBase with MapReduce (Read and Write)
    HBase with MapReduce (Only Read)
    Hbase中的BloomFilter(布隆过滤器)
    HBase的快照技术
    How To Use Hbase Bulk Loading
    Cloudera-Manager修改集群的IP
    Java中的HashSet和TreeSet
  • 原文地址:https://www.cnblogs.com/wmcoder/p/5209329.html
Copyright © 2011-2022 走看看