Modbus协议简介

由于最近要参加一个通信相关的项目,涉及到Modbus协议,因此在这里做以下整理和总结。

Modbus是一种串行通信协议,是Modicon公司(现为施耐德电气公司的一个品牌)于1979年为使用可编程逻辑控制器(PLC)通信而发表的。Modbus已经成为工业领域通信协议事实上的业界标准,并且现在是工业电子设备之间常用的连接方式。

【协议版本】

Modbus协议当前存在用于串口、以太网以及其他支持互联网网络的版本。

大多数Modbus设备通信通过串口 EIA-485 物理层进行,也就是我们经常说到的RS485。

对于串行连接,存在两个变种,它们在数值数据表示和协议细节上略有不同。

          串行连接                数值数据表示                         协议细节
Modbus RTU 紧凑的,采用二进制表示数据的方式 TU格式后续的命令/数据带有循环冗余校验的校验和
Modbus ASCII 人类可读的,冗长的表示方式 ASCII格式采用纵向冗余校验的校验和

<注> 被配置为RTU变种的节点不会和设置为ASCII变种的节点通信,反之亦然。

对于通过TCP/IP(例如以太网)的连接,存在多个Modbus/TCP变种,这种方式不需要校验和计算。

Modbus有一个扩展版本Modbus Plus(Modbus+或者MB+),不过此协议是Modicon专有的,和Modbus不同。它需要一个专门的协处理器来处理类似HDLC的高速令牌旋转。它使用1Mbit/s的双绞线,并且每个节点都有转换隔离设备,是一种采用转换/边缘触发而不是电压/水平触发的设备。连接Modbus Plus到计算机需要特别的接口,通常是支持ISA(SA85),PCI或者PCMCIA总线的板卡。

【通信和设备】

Modbus协议是一个master/slave架构的协议。有一个节点是master节点,其他使用Modbus协议参与通信的节点是slave节点。每一个slave设备都有一个唯一的地址。在串行和MB+网络中,只有被指定为主节点的节点可以启动一个命令(在以太网上,任何一个设备都能发送一个Modbus命令,但是通常也只有一个主节点设备引导指令)。

一个ModBus命令包含了打算执行的设备的Modbus地址。所有设备都会收到命令,但只有指定位置的设备会执行及回应指令(地址0例外,指定地址0的指令是广播指令,所有收到指令的设备都会运行,不过不回应指令)。所有的Modbus命令包含了检查码,以确定到达的命令没有被破坏。基本的ModBus命令能指令一个RTU改变它的寄存器的某个值,控制或者读取一个I/O端口,以及指挥设备回送一个或者多个其寄存器中的数据。

Modbus之所以被如此广泛的使用主要原因有:

(1)标准、开放,用户可以免费、放心地使用Modbus协议,不需要交纳许可证费,也不会侵犯知识产权。目前,支持Modbus的厂家超过400家,支持Modbus的产品超过600种。
(2)Modbus可以支持多种电气接口,如RS-232、RS-485等,还可以在各种介质上传送,如双绞线、光纤、无线等。
(3)Modbus的帧格式简单、紧凑,通俗易懂。用户使用容易,厂商开发简单。

Modbus允许多个 (大约240个) 设备连接在同一个网络上进行通信,比如现场的温度、压力、载荷一类的传感器可以非常方便的通过Modbus将数据传输到工业控制计算机上,实现对现场各个参数的监控。

【工作原理】

在串行链路的主从通信中,Modbus主设备可以连接一个或N(最大为247)个从设备,主从设备之间的通信包括单播模式和广播模式。

在广播模式中,Modbus主设备可同时向多个从设备发送请求(设备地址0用于广播模式),从设备对广播请求不进行响应。

在单播模式中,主设备发送请求至某个特定的从设备(每个Modbus从设备具有唯一地址),请求的消息帧中会包含功能代码和数据,比如功能代码“01”用来读取离散量线圈的状态。从设备接到请求后,进行应答并把消息反馈主设备。

下图是典型的主从设备的请求-应答机制:

在主从设备的通信中,可以使用ASCII模式或者RTU模式。

在ASCII(American Standard Code for Information Interchange)传输模式下,消息帧以英文冒号(“:”)开始,以回车和换号(CRLF)符号结束,允许的传输的字符集为十六进制的0~9和A~F;网络中的从设备监视传输通路上是否有英文冒号(“:”),如果有的话,就对消息帧进行解码,查看消息中的地址是否与自己的地址相同,如果相同的话,就接收其中的数据;如果不同的话,则不予理会。

在ASCII模式下,每个8位的字节被拆分成两个ASCII字符进行发送,比如十六进制数0xAF ,会被分解成ASCII字符“A”和“F”进行发送,发送的字符量比RTU增加一倍。ASCII模式的好处是允许两个字符之间间隔的时间长达1s而不引发通信故障,该模式采用纵向冗余校验(Longitudinal Redundancy Check ,LRC) 的方法来检验错误。下面是对ASCII模式的总结:

                                      Modbus协议ASCII模式传输
   项目                                            描述
字符集 16进制ASCII可打印字符0~9及A~F
每个16进制字符被拆分成2个字节发送
每个字节 1个起始位
7个数据位,LSB发送模式
1个奇偶校验位,不校验则不占用
1个停止位(如果开启校验位);或者2个停止位(如果没有校验)
校验方式 纵向冗余校验(Longitudinal Redundancy Check,LRC)

注:ASCII模式用10位的时间来传输8位数据

在RTU(Remote Terminal Unit)模式下,每个字节可以传输两个十六进制字符,比如十六进制数0xAF,直接以十六进制0xAF(二进制:10101111)进行发送,因此它的发送密度比ASCII模式高一倍;RTU模式采用循环冗余校验(CRC),下面是对RTU模式的总结:

                                     Modbus协议RTU模式传输
  项目                                               描述
字符集 16进制ASCII可打印字符0~9及A~F
每个16进制字符用一个字节内发送
每个字节 1个起始位
8个数据位,LSB发送模式
1个奇偶校验位,不校验则不占用
1个停止位(如果开启校验位);或者2个停止位(如果没有校验)
校验方式 循环冗余校验(Cyclical Redundancy Check,CRC)

注:RTU模式用11位的时间来传输8位数据

【限制】

  • Modbus是在1970年末为可编程逻辑控制器通信开发的,这些有限的数据类型在那个时代是可以被PLC理解的,大型二进制对象数据是不支持的。
  • 对节点而言,没有一个标准的方法找到数据对象的描述信息。
  • 由于Modbus是一个主/从协议,没有办法要求设备“报告异常”(构建在以太网的TCP/IP协议之上,被称为open-mbus除外)- 主节点必须循环的询问每个节点设备,并查找数据中的变化。在带宽可能比较宝贵的应用中,这种方式在应用中消耗带宽和网络时间,例如在低速率的无线链路上。
  • Modbus在一个数据链路上只能处理247个地址,这种情况限制了可以连接到主控站点的设备数量(以太网TCP/IP除外)。
  • Modbus传输在远端通讯设备之间缓冲数据的方式进行,有对通信一定是连续的限制,避免了传输中的缓冲区漏洞的问题。
  • Modbus协议针对未经授权的命令或截取数据并无安全性。

【功能码】

 功能码               名称                                       作用
01 读取线圈状态 取得一组逻辑线圈的当前状态(ON/OFF)
02 读取输入状态 取得一组开关输入的当前状态(ON/OFF)
03 读取保持寄存器 在一个或多个保持寄存器中取得当前的二进制值
04 读取输入寄存器 在一个或多个输入寄存器中取得当前的二进制值
05 强置单线圈 强置一个逻辑线圈的通断状态
06 预置单寄存器 把具体二进值装入一个保持寄存器
07 读取异常状态 取得8个内部线圈的通断状态,这8个线圈的地址由控制器决定,用户逻辑可以将这些线圈定义,以说明从机状态,短报文适宜于迅速读取状态
08 回送诊断校验 把诊断校验报文送从机,以对通信处理进行评鉴
09 编程(只用于484) 使主机模拟编程器作用,修改PC从机逻辑
10 控询(只用于484) 可使主机与一台正在执行长程序任务从机通信,探询该从机是否已完成其操作任务,仅在含有功能码9的报文发送后,本功能码才发送
11 读取事件计数 可使主机发出单询问,并随即判定操作是否成功,尤其是该命令或其他应答产生通信错误时
12 读取通信事件记录 可以是主机检索每台从机的ModBus事务处理通信事件记录。如果某项事务处理完成,记录会给出有关错误
13 编程(184/384 484 584) 可使主机模拟编程器功能修改PC从机逻辑
14 探询(184/384 484 584) 可使主机与正在执行任务的从机通信,定期控询该从机是否已完成其程序操作,仅在含有功能13的报文发送后,本功能码才可发送
15 强置多线圈 强置一串连续逻辑线圈的通断
16 预置多寄存器 把具体的二进制值装入一串连续的保持寄存器
17 报告从机标识 可使主机判断编址从机的类型及该从机运行指示灯的状态
18 (884和MICRO 84) 可使主机模拟编程功能,修改PC状态逻辑
19 重置通信链路 发生非可修改错误后,是从机复位于已知状态,可重置顺序字节
20 读取通用参数(584L) 显示扩展存储器文件中的数据信息
21 写入通用参数(584L) 把通用参数写入扩展存储文件,或修改之
22 ~ 64 保留作扩展功能备用  
65 ~ 72 保留以备用户功能所用 留作用户功能的扩展编码
73 ~119 非法功能  
120 ~ 127 保留 留作内部作用
128 ~ 255 保留 用于异常应答

参考链接1:https://zh.wikipedia.org/wiki/Modbus

参考链接2:https://wxs.me/807

参考链接3:https://zhuanlan.zhihu.com/p/29288329

Modbus协议深入讲解:http://www.ni.com/zh-cn/innovations/white-papers/14/the-modbus-protocol-in-depth.html

Modbus协议简介相关推荐

  1. Modbus 协议简介

     一.Modbus 协议简介 Modbus 协议是应用于电子控制器上的一种通用语言.通过此协议,控制器相互之间.控制器经由网络(例如以太网)和其它设备之间可以通信.它已经成为一通用工业标准.有了它 ...

  2. Modbus通讯协议简介

    Modbus协议简介 Modbus协议最初由Modicon公司开发出来,此协议支持传统的RS-232.RS-422.RS-485和以太网设备,许多工业设备,包括PLC,DCS,智能仪表等都在使用Mod ...

  3. 【Modbus 】Modbus 协议

    Modbus 协议简介 Modbus协议是一项应用层报文传输协议,包括ASCII.RTU.TCP三种报文类型. 标准的Modbus协议物理层接口有RS232.RS422.RS485和以太网接口,采用m ...

  4. STM32 —— Modbus 协议

    STM32 -- Modbus 协议 Modbus 协议简介 Modbus 是一种串行通信协议,由于其协议简单易用,且没有版权要求,目前已经成为工业领域通信协议的实时标准.ModBus 协议是又施耐德 ...

  5. ModBus串口【01】Modbus协议介绍

    Modbus协议简介 文章目录 Modbus协议简介 1.啥是Modbus协议? 2.Modbus模型 3.Modbus协议版本 4.Modbus通信 5.Modbus不同存储区介绍: 6.Modbu ...

  6. modbus协议教程

    1.modbus协议简介 modbus是工业现场总线通信协议中应用较为成熟稳定的协议.理解起来也比较简单.modbus数据传输采用大端模式 1.1功能码简要说明 modbus定义了不同的功能码来操作不 ...

  7. Modbus协议学习

    Modbus协议简介 Modbus 就是为了实现多个设备相互通信的应用层协议. 在市面上很多数据采集设备都会采用Modbus协议. 主要包括三种报文: ModbusRtu,ModebusAscii , ...

  8. Modbus协议在串行链路上的实现

    目录 1.串行链路通信简介 2.串行链路通信协议原理 3.串行链路通信帧描述 4.RTU.ASCII串行传输模式 4.1.RTU传输模式 4.2.ASCII传输模式 1.串行链路通信简介 Modbus ...

  9. 一文看懂Modbus协议

    目录 1.协议简介 2.协议格式 3.数据模型 1.协议简介 自从 1979 年出现工业串行链路的事实标准以来,Modbus使成千上万的自动化设备能够通信.Modbus 是OSI模型第 7 层上的应用 ...

最新文章

  1. 我认识Linux的小羞愧历史
  2. Mysql INSERT INTO .. ON DUPLICATE KEY更新多行记录
  3. 【错误记录】Android 应用运行报错 ( java.lang.VerifyError: Verifier rejected class androidx. | 逆向中遇到的问题 )
  4. 1021 个位数统计 (15 分
  5. 第二十一届国际C语言混乱代码大赛结果公布
  6. BNUOJ 1207 滑雪
  7. python基础入门(1)
  8. 在线XML转HTML工具
  9. ADB server didn't ACK问题
  10. Django 【第一篇】基础
  11. css如何调用函数,从CSS调用JavaScript函数
  12. word多级标题的使用
  13. php三级分销思路 数据库设计_三级分销,
  14. 【Maven打包报错解决方案】Using ‘UTF-8‘ encoding to copy filtered resources.
  15. bind9 dlz mysql_bind9+dlz+mysql连接断开问题
  16. 学到微笑之 - 自定义 MVC 框架
  17. matlab模糊优选理论模型,模糊优选神经网络BP模型
  18. 计算机一级更换桌面,2018自动替换壁纸工具
  19. CSS-Less简介
  20. 微步星辰的逆袭,专访微步星辰合伙人齐成岳

热门文章

  1. Linux中OpenJDK下载部署
  2. w ndows10专业版连接不上网,windows10无线网络连不上的原因与应对方法
  3. 模板学习(2)----类模板
  4. 纯CSS画的基本图形(矩形、圆形、三角形、多边形、爱心、八卦等)20种类型
  5. matplotlib - 2D 与 3D 图的绘制(下)
  6. 为什么谷歌云没有亚马逊云做得好?谷歌如何才能赶超亚马逊?
  7. goaccess监控
  8. oracle中插曲时间,Oracle 11G 数据库迁移【expdp/impdp】
  9. 以新增用户为例子解释前后端整体连接方式详解(Service、Mapper、Controller、Entity)
  10. Python123 练习6