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



【Modbus】 RTU CRC校验码计算方法相关推荐

  1. 16进制(CRC16)(MODBUS RTU通讯)校验码在线计算器

    最近在项目上遇到,用485协议命令控制灯光继电器的开关需要计算16进制(CRC16)(MODBUS RTU通讯)校验码来写控制命令,这种在网上有现成的计算器,我们直接使用即可,以下为我用的一个计算器的 ...

  2. PLC中用scl语言编写算法求解modbus crc校验码

    PLC中用scl语言编写算法求解modbus crc校验码 因为不是严格的modbus协议,是用的自由口通讯,传输数据里面得加上CRC校验,所以得搞个算法根据发送不同的数据生成相应的CRC校验码. 现 ...

  3. CRC校验码简介及CRC16的计算方法

    [导读]什么是CRC校验?CRC即循环冗余校验码(Cyclic Redundancy Check):是数据通信领域中最常用的一种查错校验码,其特征是信息字段和校验字段的长度可以任意选定.奇偶校验虽然简 ...

  4. 16位CRC校验码计算,485MODBUS计算

    CRC计算方法是: 1. 加载一值为0XFFFF的16位寄存器,此寄存器为CRC寄存器. 2. 把第一个8位二进制数据(即通讯信息帧的第一个字节)与16位的CRC寄存器的相异或,异或的结果仍存放于该C ...

  5. 详述CRC校验码(附代码)

    关注+星标公众号,不错过精彩内容 来源 | 一口Linux CRC校验应用比较广泛,通常在通信领域用的比较多,即便是自定义通信协议,也可以添加CRC校验码,使其通信更加可靠. 今天就来进一步描述CRC ...

  6. 一文讲透CRC校验码-附赠C语言实例

    一口君最近工作用到CRC校验,顺便整理本篇文章和大家一起研究. 一.CRC概念 1. 什么是CRC? CRC(Cyclic Redundancy Checksum)是一种纠错技术,代表循环冗余校验和. ...

  7. 32位crc校验码程序_CRC码计算及校验原理的最通俗诠释

    CRC校验原理 CRC校验原理看起来比较复杂,好难懂,因为大多数书上基本上是以二进制的多项式形式来说明的.其实很简单的问题,其根本思想就是先在要发送的帧后面附加一个数(这个就是用来校验的校验码,但要注 ...

  8. STM32开发 -- CRC校验码

    如需转载请注明出处:https://blog.csdn.net/qq_29350001/article/details/79518638 通信协议里有CRC校验码,计算从报文的起始字节到报文内容最后一 ...

  9. 基于表格的CRC校验码实现

    关于CRC的理论计算方法不做赘述,本文介绍基于查表的CRC优化算法的实现. 常规计算方法是如何实现的? 理论方法不赘述,这里简单说明程序实现.因为要处理的信息可能非常长,所以直接使用除法指令是不可行的 ...

  10. java crc 校验码_java实现CRC校验码

    这两天项目中要使用到CRC校验功能,网上大量的例子是针对c.delphi的例子,前期没有做过,理论上也欠缺很多知识,在这里对java如何实现我们想要的crc校验功能做一下自己的总结,以下内容有本分转自 ...

最新文章

  1. Entrust - Laravel 用户权限系统解决方案
  2. 布局文件中fill_parent、match_parent和wrap_content有什么区别?
  3. mysql 之后,装完MySQL之后的一些操作
  4. ODataModel.submitBatch by default Asynchronous
  5. 乐高无限的服务器怎么建,乐高无限悬空房子怎么建造 建造方法介绍
  6. Python写入文件的工具类
  7. vue计算属性与监听器的区别
  8. Cannot resolve plugin org.apache.maven.plugins:xxxx
  9. 海康SDK接口调用的主要流程
  10. scrt_sfx安装
  11. java导出word特殊符号,Word2019中输入特殊符号的方法
  12. foxpro导入 mysql_无法导入、导出或链接到 FoxPro 数据库 | Microsoft Docs
  13. 使用Dhtml和poi导出excle表格出现Error Type:LoadXMl Incorrect Json错误
  14. 几个必须知道的Python工具
  15. golang rabbitMQ 生产者复用channel以及生产者组分发策略
  16. [JS]Array对象
  17. fastboot 刷system.img 提示 sending 'system' (*KB)... FAILED (remote: data too large)
  18. beta值是一种风险指数
  19. 【历史上的今天】8 月 25 日:Linux 诞生;我国第一个计算机科学技术研究所成立
  20. OCR光学字符识别技术及其应用场景

热门文章

  1. 玩转3D全息图像!AI即刻生成
  2. 《深入浅出统计学》读书笔记
  3. Python移动应用开发
  4. 联想智能农业移动应用开发系统用户手册
  5. Android上的抓包工具 Packet Capture
  6. Java开发 明华usbkey_v3 明华二次开发包,usbkey 内有很多demo程序。 USB develop 238万源代码下载- www.pudn.com...
  7. VS安装VAssistX插件导致WPF-XAML文件输入中文出现乱码问题解决方案
  8. Modelsim的下载及安装
  9. 十大算法(动图讲解)❤️超详细!
  10. 【matlab深度学习工具箱】classificationLayer参数详解