Modbus协议(翻自wiki)

原文

Modbus

译文

Modbus


来自维基百科,自由的百科全书

Modbus 是一种串行通信协议,最初由Modicon(现为施耐德电气)于 1979 年出版,用于其可编程逻辑控制器( PLC )。 Modbus 已成为约定俗成的标准通信协议,现在已成为连接工业电子设备的常用方法。 1 在工业环境中使用 Modbus 的主要原因是:

  • 在考虑工业应用的情况下开发,
  • 公开发布,免版税,
  • 易于部署和维护,
  • 允许供应商无限制移动原始位或字。

Modbus 支持连接到同一网络的许多设备之间的通信,例如,测量温度和湿度的系统,并将结果传送给计算机。 Modbus 通常用于将监控计算机与远程终端单元( RTU )连接在监控和数据采集( SCADA )系统中。 许多数据类型都是从其在驱动继电器中的使用命名的:单比特物理输出称为线圈,单比特物理输入称为离散输入或接触。

自 2004 年 4 月施耐德电气将权利转让给该组织以来,Modbus 协议的开发和更新已由 Modbus 组织 2 管理。3 Modbus 组织是 Modbus 兼容设备的用户和供应商协会,主张继续使用该技术。4

Modbus对象类型


以下是 Modbus 从站设备向 Modbus 主站设备提供的对象类型表

对象类型权限大小
线圈读写1 bit
离散输入只读1 bit
输入寄存器只读16 bits
保持寄存器读写16 bits

协议版本


对于串行端口以及支持 Internet 协议套件的以太网和其他协议,存在 Modbus 协议的版本。 Modbus 协议有很多种变体:

  • Modbus RTU - 用于串行通信,并使用紧凑的二进制数据表示协议通信。 RTU 格式遵循命令/数据,循环冗余校验和校验和作为错误检查机制,以确保数据的可靠性。 Modbus RTU 是 Modbus 最常用的实现方式。必须连续传输 Modbus RTU 消息,而不会出现字符间的犹豫。 Modbus 消息由空闲(静默)时段构成(分离)。
  • Modbus ASCII - 用于串行通信,并使用 ASCII 字符进行协议通信。 ASCII 格式使用纵向冗余校验校验和。 Modbus ASCII 消息由前导冒号(“:”)和尾随换行符(CR / LF)构成。
  • Modbus TCP / IP或Modbus TCP - 这是一种 Modbus 变体,用于通过 TCP / IP 网络进行通信,通过端口 502 连接。5它不需要校验和计算,因为较低层已经提供校验和保护。
  • TCP / IP上的Modbus或TCP上的Modbus或Modbus RTU / IP - 这是一种 Modbus 变体,与 Modbus TCP 的不同之处在于,与 Modbus RTU 一样,有效载荷中包含校验和。
  • 基于UDP的Modbus - 一些人尝试在IP网络上使用 Modbus over UDP ,这消除了 TCP 所需的开销。6
  • Modbus Plus(Modbus +,MB +或MBP) - Modbus Plus 是施耐德电气专有的,与其他变体不同,它支持多个主站之间的点对点通信。7它需要一个专用的协处理器来处理类似 HDLC 的快速令牌轮换。它使用 1 Mbit / s 的双绞线,并在每个节点处包含变压器隔离,这使其转换/边沿触发而不是电压/电平触发。将 Modbus Plus 连接到计算机(通常是用于 ISA , PCI 或 PCMCIA 总线的卡)需要特殊硬件。
  • Pemex Modbus - 这是标准 Modbus 的扩展,支持历史和流量数据。它专为 Pemex 石油和天然气公司设计,用于过程控制,从未得到广泛采用。
  • Enron Modbus - 这是 Enron 公司开发的标准 Modbus 的另一个扩展,支持 32 位整数和浮点变量以及历史和流量数据。使用标准地址映射数据类型。8历史数据符合美国石油协会( API )行业标准,用于存储数据。[需要引证]

对于前4种协议变量,数据模型和函数调用是相同的; 只有封装是不同的。 但是,变体不可互操作,帧格式也不可互操作。

通讯和设备


准备使用 Modbus 进行通信的每个设备都有一个唯一的地址。在串行和 MB + 网络中,只有指定为主节点的节点才能发起命令。在以太网上,任何设备都可以发送 Modbus 命令,尽管通常只有一个主设备会这样做。 Modbus 命令包含设备的 Modbus 地址(1到247)。只有预期的设备才会对该命令起作用,即使其他设备可能会收到它(例外情况是发送到节点 0 的特定可广播命令,它们被作用但未被确认)。所有 Modbus 命令都包含校验和信息,以允许接收方检测传输错误。基本 Modbus 命令可以指示 RTU 更改其中一个寄存器中的值,控制或读取 I / O 端口,并命令设备发回其寄存器中包含的一个或多个值。

有许多调制解调器和网关支持 Modbus ,因为它是一个非常简单且经常被复制的协议。其中一些是专门为此协议设计的。不同的实现使用有线,无线通信,例如在 ISM 频带中,甚至是短消息服务( SMS )或通用分组无线服务( GPRS )。无线网络的一种常见设计利用网状网络。设计人员必须克服的典型问题包括高延迟和时序问题。

帧格式


Modbus帧由应用数据单元(ADU)组成,它包含协议数据单元(PDU):9

  • ADU =地址+ PDU +错误检查,
  • PDU =功能代码+数据。

所有Modbus变体都选择以下帧格式之一。1

Modbus RTU 帧格式(主要用于 EIA-485 等 8 位异步线路)

名称长度(bits)功能
开始28至少3又1/2 个字符的沉默时间(标记条件)
地址8站地址
功能8功能码; 例如,读取线圈/保持寄存器
数据n * 8数据+长度将根据消息类型填充
CRC16循环冗余校验
停止28帧之间至少有3又1/2个字符的静音时间

关于CRC的说明:

  • 多项式:x16 + x15 + x2+ 1(CRC-16-ANSI 也称为 CRC-16-IBM ,正常十六进制代数多项式为 8005 ,反转 A001 )。
    初始值:65,535。
  • 以十六进制表示的帧示例:01 04 02 FF FF B8 80(从01到FF的 CRC-16-ANSI 计算给出 80B8 ,它首先发送最低有效字节)。

Modbus ASCII 帧格式(主要用于 7 位或 8 位异步串行线)

名称长度(bytes)功能
开始1以冒号开头:(ASCII十六进制值为3A)
地址2站地址
功能2功能码; 例如,读取线圈/保持寄存器
数据n * 2数据+长度将根据消息类型填充
LRC2校验和(纵向冗余校验)
停止2回车 - 换行(CR / LF)对(ASCII值为0D,0A)

地址,函数,数据和LRC都是表示 8 位值(0-255)的大写十六进制可读字符对。 例如,122(7×16 + 10)将表示为 7A 。

LRC计算为 8 位值之和,取反(二进制补码)并编码为 8 位值。 示例:如果地址,函数和数据编码为 247,3,19,137,0 和 10 ,则它们的和为 416 。转化为8位的二进制补码(-416)为 96(例如256×2 - 416), 它将以十六进制表示为 60 。 因此,以下框架:: F7031389000A60 <CR> <LF>。

Modbus TCP帧格式(主要用于以太网)

名称长度(bytes)功能
传输标识符2用于服务器和客户端的消息之间的同步
协议标识符20表示 Modbus / TCP协议
长度字段2此帧中的剩余字节数
单元标识符1从站地址(如果不使用则为255)
功能码1功能码与其他变体一样
数据n数据作为响应或命令

单元标识符与 Modbus / TCP 设备一起使用,这些设备是几个 Modbus 设备的组合,例如, 在 Modbus / TCP 到 Modbus RTU 网关上。 在这种情况下,单元标识符告知网关后面的设备的从属地址。 本机 Modbus / TCP 功能设备通常忽略单元标识符。

Modbus 数据帧中值的字节顺序是 big-endian(MSB,首先接收的值的最高有效字节)。

支持的功能代码


各种读,写和其他操作分类如下。10 最原始的读取和写入以粗体显示。 许多来源使用替代术语,例如 Force Single Coil ,其中标准使用Write Single Coil11
Modbus 中的突出实体是:

  • 线圈:可读写,1位(关/开)
  • 离散输入:可读,1位(关/开)
  • 输入寄存器:可读,16位(0到65,535),基本上是测量和状态
  • 保持寄存器:可读写,16位(0到65,535),基本上是配置值

主要功能代码的请求和响应数据格式


请求和响应遵循上述帧格式。 本节详细介绍了大多数使用过的功能代码的数据格式。

功能代码 1(读取线圈)和功能代码 2(读取离散输入)

请求

  • 读取的第一个线圈/离散输入的地址( 16 位)
  • 读取的线圈/离散输入数量( 16 位)

正常响应

  • 要跟随的线圈/离散输入值的字节数( 8 位)
  • 线圈/离散输入值(每个字节 8 个线圈/离散输入)

每个线圈/离散输入的值是二进制的( 0 表示关闭,1 表示打开)。 首先请求的线圈/离散输入被存储为作为答复的第一字节的最低有效位。
如果线圈/离散输入的数量不是 8 的倍数,则最后一个字节的最高有效位将填充零。
例如,如果请求 11 个线圈,则需要两个字节的值。 假设这些连续线圈的状态为开,关,开,关,开,开,开,关,开,开,则响应将为十六进制的 02 E5 06 。

由于应答消息中返回的字节数仅为 8 位宽,协议开销为 5 字节,因此最多可以同时读取 2000(250 x 8)个离散输入或线圈。

功能码 5(强制/写入单线圈)

请求

  • 线圈地址( 16 位)
  • 强制/写入的值:0 表示关闭,65,280(FF00表示十六进制)表示打开

正常响应:与请求相同。

功能码 15(强制/写入多个线圈)

请求

  • 强制/写入的第一个线圈的地址( 16 位)
  • 强制/写入的线圈数( 16 位)
  • 要遵循的线圈值的字节数( 8 位)
  • 线圈值(每个字节 8 个线圈值)

每个线圈的值是二进制的(0 表示关闭,1 表示打开)。 首先请求的线圈被存储为请求中的第一字节的最低有效位。
如果线圈数不是 8 的倍数,则最后一个字节的最高有效位应填充零。 请参阅功能代码 1 和 2 的示例。

正常响应

  • 第一个线圈的地址( 16 位)
  • 线圈数( 16 位)

功能代码 4(读取输入寄存器)和功能代码 3(读取保持寄存器)

请求

  • 第一个读取寄存器的地址( 16 位)
  • 要读取的寄存器数( 16 位)

正常响应
要遵循的寄存器值的字节数( 8 位)
寄存器值(每个寄存器 16 位)
由于寄存器值的字节数为 8 位宽,因此一次只能读取 125 个寄存器。12

功能码 6(预置/写入单个保持寄存器)

请求

  • 保持寄存器预置/写入的地址( 16 位)
  • 保持寄存器的新值( 16 位)

正常响应:与请求相同。

功能码 16(预置/写入多个保持寄存器)

请求

  • 第一个保持寄存器的地址预置/写入( 16 位)
  • 预置/写入的保持寄存器数( 16 位)
  • 要遵循的寄存器值的字节数( 8 位)
  • 保持寄存器的新值(每个寄存器 16 位)

由于寄存器值为 2 字节宽,并且只能发送 127 个字节的值,因此一次只能预置/写入 63 个保持寄存器。

正常响应

  • 第一个预置/写入保持寄存器的地址( 16 位)
  • 预置/写入保持寄存器的数量( 16 位)

异常响应:

对于正常响应,从站重复功能代码。 如果从站想报告错误,它将回复所请求的功能代码加上 128(十六进制 0x80 )( 3 变为 131 =十六进制 0x83 ),并且只包含一个字节的数据,称为异常代码。

主要的Modbus异常代码

异常代码长度(bytes)功能
1非法功能从设备无法识别或允许在查询中接收的功能代码
2非法数据地址从设备中不允许或不存在部分或全部所需实体的数据地址
3非法数据值从设备不接受该数据
4从设备故障从设备尝试执行请求的操作时发生不可恢复的错误)
5确认从设备已接受请求并正在处理它,但需要很长的时间。 返回此响应以防止在主设备中发生超时错误。 主设备可以接下来发出一个 Poll Program Complete 消息来确定处理是否完成
6从设备忙从设备参与处理长时间命令。 主设备应该稍后再试)
7否认从设备无法执行编程功能。 主设备应从从设备请求诊断或错误信息
8内存奇偶校验错误从设备检测到内存中的奇偶校验错误。 主设备可以重试请求,但可能需要在从设备上提供服务
10网关路径不可用专门用于 Modbus 网关。 表示配置错误的网关
                    11        网关目标设备无法响应专门用于 Modbus 网关。 从站无法响应时发送

线圈,离散输入,输入寄存器,保持寄存器编号和地址


一些约定控制如何引用对 Modbus 实体(线圈,离散输入,输入寄存器,保持寄存器)的访问。

在实体编号和实体地址之间进行区分非常重要:

  • 实体编号在其描述表中组合实体类型和实体位置。
  • 实体地址是起始地址,是 Modbus 帧数据部分中的 16 位值。 因此它的范围从 0 到 65,535 。

在传统标准中,这些实体的数字以数字开头,后跟 1-9,999 范围内的 4 位数字:

  • 线圈编号从 0 开始,跨度从 00001 到 09999 ,
  • 离散输入数字从 1 开始,跨度从 10001 到 19999 ,
  • 输入寄存器编号从 3 开始,跨度从 30001 到 39999 ,
  • 保持寄存器号从 4 开始,跨度从 40001 到 49999 。

这转换为数据帧中 0 到 9,998 之间的地址。 例如,为了从数字 40001 开始读取保持寄存器,数据帧中的相应地址将为 0 ,功能代码为 3(如上所示)。 对于保持从编号 40100 开始的寄存器,地址将为 99 等等。

这将每个实体的地址数限制为 9,999 。 事实上的引用将其扩展到最大值 65,536 。13 它只是在前一个列表中添加一个数字:

  • 线圈编号从 000001 到 065536 ,
  • 离散输入数字从 100001 到 165536 ,
  • 输入寄存器编号范围从 300001 到 365536 ,
  • 保持寄存器号码范围从 400001 到 465536 。

使用扩展引用时,所有数字引用必须正好有 6 位数。 这避免了线圈和其他实体之间的混淆。 例如,要知道保持寄存器#40001 和线圈 #40001 之间的区别,如果线圈 #40001 是目标,则它必须显示为 #040001 。

JBUS映射
与 Modbus 密切相关的另一个事实协议出现在它之后,由 PLC 品牌 April Automates 定义,这是法国公司 Renault Automation 和 Merlin Gerin et Cie 于 1985 年合作努力的成果: JBUS 。 当时 Modbus 和 JBUS 之间的差异(实体数量,从站数量)现在无关紧要,因为该协议几乎与 AEG 施耐德自动化于 1994 年购买的四月 PLC 系列一起消失,然后使它们过时。 然而,JBUS 的名称在某种程度上存活了下来。

JBUS支持功能代码 1,2,3,4,5,6,15 和 16 ,因此支持上述所有实体。 但是 JBUS 的编号不同:

  • 数字和地址重合:实体 #x 在数据帧中具有地址 x。
  • 因此,实体编号不包括实体类型。 例如,在 Modbus 中保存寄存器 #40010 将保持寄存器# 9 ,位于 JBUS 的地址 9 。
  • 不支持数字 0(因此地址 0)。 从设备不应该在此数字和地址处实现任何实际数据,并且它可以返回空值或在请求时抛出错误。

实现


几乎所有的实现都有官方标准的变化。 不同品种可能无法在不同供应商的设备之间正确沟通。 一些最常见的变体是:

数据类型

  • IEEE浮点数-
  • 32 位整数
  • 8 位数据
  • 混合数据类型
  • 整数中的位字段
  • 用于将数据更改为整数的乘数。 10,100,1000,256 …

协议扩展

  • 16 位从机地址
  • 32 位数据大小( 1 个地址=返回的 32 位数据)
  • 换字数据

限制


  • 由于Modbus是在 20 世纪 70 年代后期设计的,用于与可编程逻辑控制器通信,因此数据类型的数量仅限于 PLC 当时所理解的数据类型。不支持大型二进制对象。
  • 节点没有标准方法来查找数据对象的描述,例如,确定寄存器值是否表示 30 到 175 度之间的温度。
  • 由于 Modbus 是主/从协议,因此现场设备无法“异常报告”(以太网 TCP / IP 除外,称为 open-mbus ) - 主节点必须定期轮询每个现场设备并查找更改在数据中。这在带宽可能昂贵的应用中消耗带宽和网络时间,例如通过低比特率无线电链路。
  • Modbus 仅限于在一条数据链路上寻址 254 个设备,这限制了可能连接到主站的现场设备的数量(再次,以太网 TCP / IP 是一个例外)。
  • Modbus 传输必须是连续的,这将远程通信设备的类型限制为可以缓冲数据以避免传输中的间隙的设备。
  • Modbus协议本身不能防止未经授权的命令或数据拦截。14

贸易集团


Modbus Organization,Inc。是一个促进和发展 Modbus 协议的行业协会。2

Modbus Plus


尽管有这个名字,Modbus Plus 15并不是 Modbus 的变种。 它是一种不同的协议,涉及令牌传递。

它是施耐德电气的专有规格,虽然它未发表而不是专利。 它通常使用仅适用于 Schneider 合作伙伴的定制芯片组实现。

参考


  1. Drury, Bill (2009). Control Techniques Drives and Controls Handbook (PDF) (2nd ed.).Institution of Engineering and Technology . pp. 508–. (Subscription required (help)). ↩︎ ↩︎

  2. “Modbus home page” Modbus. Modbus Organization, Inc. Retrieved 2 August 2013. ↩︎ ↩︎

  3. “Modbus FAQ” Modbus. Modbus Organization, Inc. Retrieved 1 November 2012. ↩︎

  4. “About Modbus Organization”. Modbus. Modbus Organization, Inc. Retrieved 8 November 2012. ↩︎

  5. Modbus Messaging on TCP/IP Implementation Guide V1.0b (PDF), Modbus Organization, Inc., October 24, 2006, retrieved 2017-01-07 ↩︎

  6. “Java Modbus Library - About”. 2010. Retrieved 2017-02-07. ↩︎

  7. “What is the difference between Modbus and Modbus Plus?”. Schneider Electric. Retrieved 2017-02-07. ↩︎

  8. “Simply Modbus - About Enron Modbus”. Simply Modbus. Retrieved 2017-02-07. ↩︎

  9. “Modbus Messaging On TCP/IP Implementation Guide” (PDF). Modbus Organization. Modbus-IDA. ↩︎

  10. “Modbus Application Protocol V1.1b3”(PDF). Modbus. Modbus Organization, Inc. Retrieved 2 August 2013. ↩︎

  11. Clarke, Gordon; Reynders, Deon (2004). Practical Modern Scada Protocols: Dnp3, 60870.5 and Related Systems. Newnes. pp. 47–51. ISBN 0-7506-5799-5. ↩︎

  12. http://modbus.org/docs/PI_MBUS_300.pdf ↩︎

  13. “Modbus 101 – Introduction to Modbus”. Control Solutions, Inc. ↩︎

  14. Palmer; Shenoi, Sujeet, eds. (23–25 March 2009). Critical Infrastructure Protection III. Third IFIP WG 11. 10 International Conference. Hanover, New Hampshire: Springer. p. 87. ISBN 3-642-04797-1. ↩︎

  15. “Modbus Plus - Modbus Plus Network - Products overview - Schneider Electric United States”. Schneider-electric.com. Retrieved 2014-01-03. ↩︎

课程背景 Modbus 协议是工业自动化控制系统中常见的通信协议协议的全面理解是个痛点。 本课程主讲老师集10多年在Modbus协议学习、使用中的经验心得,结合当前物联网浪潮下Modbus协议开发的痛点,推出这套面向Modbus 协议初学者的课程。本课程不同于以往市面课程只是协议讲解无实现代码,而是采用讲解与实践并重的方式,结合STM32F103ZET6开发板进行手把手编程实践,十分有利于初学者学习。 涵盖了学习者在Modbus协议方面会遇到的方方面面的问题,是目前全网首个对Modbus协议进行全面总结的课程。 课程名称    <<Modbus协议讲解及实现>> 课程内容 1、Modbus 协议的基础。 2、Modbus协议栈函数编程实现。 3、Modbus协议在串行链路编程实现。 4、Modbus协议在以太网链路编程实现。 5、常见问题的解决方法。 带给您的价值 通过学习本课程,您可以做到如下: 1、全面彻底的理解Modbus协议。 2、理解在串行链路,以太网链路的实现。 3、掌握Modbus协议解析的函数编程方法,调试工具的使用。 4、掌握多个串口,网口同时运行同一个Modbus协议栈的方法。 5、掌握Modbus协议下,负数,浮点数等处理方法。 讲师简介 许孝刚,山东大学工程硕士,副高职称,技术总监。 10多年丰富嵌入式系统开发经验,国家软考“嵌入式系统设计师”。 2017年获得“华为开发者社区杰出贡献者”奖励。
©️2020 CSDN 皮肤主题: 技术黑板 设计师:CSDN官方博客 返回首页