Modbus
来自维基百科,自由的百科全书
Modbus 是一种串行通信协议,最初由Modicon(现为施耐德电气)于 1979 年出版,用于其可编程逻辑控制器( PLC )。 Modbus 已成为约定俗成的标准通信协议,现在已成为连接工业电子设备的常用方法。 1 在工业环境中使用 Modbus 的主要原因是:
Modbus 支持连接到同一网络的许多设备之间的通信,例如,测量温度和湿度的系统,并将结果传送给计算机。 Modbus 通常用于将监控计算机与远程终端单元( RTU )连接在监控和数据采集( SCADA )系统中。 许多数据类型都是从其在驱动继电器中的使用命名的:单比特物理输出称为线圈,单比特物理输入称为离散输入或接触。
自 2004 年 4 月施耐德电气将权利转让给该组织以来,Modbus 协议的开发和更新已由 Modbus 组织 2 管理。3 Modbus 组织是 Modbus 兼容设备的用户和供应商协会,主张继续使用该技术。4
以下是 Modbus 从站设备向 Modbus 主站设备提供的对象类型表
对象类型 | 权限 | 大小 |
---|---|---|
线圈 | 读写 | 1 bit |
离散输入 | 只读 | 1 bit |
输入寄存器 | 只读 | 16 bits |
保持寄存器 | 读写 | 16 bits |
对于串行端口以及支持 Internet 协议套件的以太网和其他协议,存在 Modbus 协议的版本。 Modbus 协议有很多种变体:
对于前4种协议变量,数据模型和函数调用是相同的; 只有封装是不同的。 但是,变体不可互操作,帧格式也不可互操作。
准备使用 Modbus 进行通信的每个设备都有一个唯一的地址。在串行和 MB + 网络中,只有指定为主节点的节点才能发起命令。在以太网上,任何设备都可以发送 Modbus 命令,尽管通常只有一个主设备会这样做。 Modbus 命令包含设备的 Modbus 地址(1到247)。只有预期的设备才会对该命令起作用,即使其他设备可能会收到它(例外情况是发送到节点 0 的特定可广播命令,它们被作用但未被确认)。所有 Modbus 命令都包含校验和信息,以允许接收方检测传输错误。基本 Modbus 命令可以指示 RTU 更改其中一个寄存器中的值,控制或读取 I / O 端口,并命令设备发回其寄存器中包含的一个或多个值。
有许多调制解调器和网关支持 Modbus ,因为它是一个非常简单且经常被复制的协议。其中一些是专门为此协议设计的。不同的实现使用有线,无线通信,例如在 ISM 频带中,甚至是短消息服务( SMS )或通用分组无线服务( GPRS )。无线网络的一种常见设计利用网状网络。设计人员必须克服的典型问题包括高延迟和时序问题。
Modbus帧由应用数据单元(ADU)组成,它包含协议数据单元(PDU):9
所有Modbus变体都选择以下帧格式之一。1
Modbus RTU 帧格式(主要用于 EIA-485 等 8 位异步线路)
名称 | 长度(bits) | 功能 |
---|---|---|
开始 | 28 | 至少3又1/2 个字符的沉默时间(标记条件) |
地址 | 8 | 站地址 |
功能 | 8 | 功能码; 例如,读取线圈/保持寄存器 |
数据 | n * 8 | 数据+长度将根据消息类型填充 |
CRC | 16 | 循环冗余校验 |
停止 | 28 | 帧之间至少有3又1/2个字符的静音时间 |
关于CRC的说明:
Modbus ASCII 帧格式(主要用于 7 位或 8 位异步串行线)
名称 | 长度(bytes) | 功能 |
---|---|---|
开始 | 1 | 以冒号开头:(ASCII十六进制值为3A) |
地址 | 2 | 站地址 |
功能 | 2 | 功能码; 例如,读取线圈/保持寄存器 |
数据 | n * 2 | 数据+长度将根据消息类型填充 |
LRC | 2 | 校验和(纵向冗余校验) |
停止 | 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
Modbus TCP帧格式(主要用于以太网)
名称 | 长度(bytes) | 功能 |
---|---|---|
传输标识符 | 2 | 用于服务器和客户端的消息之间的同步 |
协议标识符 | 2 | 0表示 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 Coil。11
Modbus 中的突出实体是:
请求和响应遵循上述帧格式。 本节详细介绍了大多数使用过的功能代码的数据格式。
请求:
正常响应:
每个线圈/离散输入的值是二进制的( 0 表示关闭,1 表示打开)。 首先请求的线圈/离散输入被存储为作为答复的第一字节的最低有效位。
如果线圈/离散输入的数量不是 8 的倍数,则最后一个字节的最高有效位将填充零。
例如,如果请求 11 个线圈,则需要两个字节的值。 假设这些连续线圈的状态为开,关,开,关,开,开,开,关,开,开,则响应将为十六进制的 02 E5 06 。
由于应答消息中返回的字节数仅为 8 位宽,协议开销为 5 字节,因此最多可以同时读取 2000(250 x 8)个离散输入或线圈。
请求:
正常响应:与请求相同。
请求:
每个线圈的值是二进制的(0 表示关闭,1 表示打开)。 首先请求的线圈被存储为请求中的第一字节的最低有效位。
如果线圈数不是 8 的倍数,则最后一个字节的最高有效位应填充零。 请参阅功能代码 1 和 2 的示例。
正常响应:
请求:
正常响应:
要遵循的寄存器值的字节数( 8 位)
寄存器值(每个寄存器 16 位)
由于寄存器值的字节数为 8 位宽,因此一次只能读取 125 个寄存器。12
请求:
正常响应:与请求相同。
请求:
由于寄存器值为 2 字节宽,并且只能发送 127 个字节的值,因此一次只能预置/写入 63 个保持寄存器。
正常响应:
对于正常响应,从站重复功能代码。 如果从站想报告错误,它将回复所请求的功能代码加上 128(十六进制 0x80 )( 3 变为 131 =十六进制 0x83 ),并且只包含一个字节的数据,称为异常代码。
异常代码 | 长度(bytes) | 功能 |
---|---|---|
1 | 非法功能 | 从设备无法识别或允许在查询中接收的功能代码 |
2 | 非法数据地址 | 从设备中不允许或不存在部分或全部所需实体的数据地址 |
3 | 非法数据值 | 从设备不接受该数据 |
4 | 从设备故障 | 从设备尝试执行请求的操作时发生不可恢复的错误) |
5 | 确认 | 从设备已接受请求并正在处理它,但需要很长的时间。 返回此响应以防止在主设备中发生超时错误。 主设备可以接下来发出一个 Poll Program Complete 消息来确定处理是否完成 |
6 | 从设备忙 | 从设备参与处理长时间命令。 主设备应该稍后再试) |
7 | 否认 | 从设备无法执行编程功能。 主设备应从从设备请求诊断或错误信息 |
8 | 内存奇偶校验错误 | 从设备检测到内存中的奇偶校验错误。 主设备可以重试请求,但可能需要在从设备上提供服务 |
10 | 网关路径不可用 | 专门用于 Modbus 网关。 表示配置错误的网关 |
11 | 网关目标设备无法响应 | 专门用于 Modbus 网关。 从站无法响应时发送 |
一些约定控制如何引用对 Modbus 实体(线圈,离散输入,输入寄存器,保持寄存器)的访问。
在实体编号和实体地址之间进行区分非常重要:
在传统标准中,这些实体的数字以数字开头,后跟 1-9,999 范围内的 4 位数字:
这转换为数据帧中 0 到 9,998 之间的地址。 例如,为了从数字 40001 开始读取保持寄存器,数据帧中的相应地址将为 0 ,功能代码为 3(如上所示)。 对于保持从编号 40100 开始的寄存器,地址将为 99 等等。
这将每个实体的地址数限制为 9,999 。 事实上的引用将其扩展到最大值 65,536 。13 它只是在前一个列表中添加一个数字:
使用扩展引用时,所有数字引用必须正好有 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 的编号不同:
几乎所有的实现都有官方标准的变化。 不同品种可能无法在不同供应商的设备之间正确沟通。 一些最常见的变体是:
数据类型:
协议扩展:
Modbus Organization,Inc。是一个促进和发展 Modbus 协议的行业协会。2
尽管有这个名字,Modbus Plus 15并不是 Modbus 的变种。 它是一种不同的协议,涉及令牌传递。
它是施耐德电气的专有规格,虽然它未发表而不是专利。 它通常使用仅适用于 Schneider 合作伙伴的定制芯片组实现。
Drury, Bill (2009). Control Techniques Drives and Controls Handbook (PDF) (2nd ed.).Institution of Engineering and Technology . pp. 508–. (Subscription required (help)). ↩︎ ↩︎
“Modbus home page” Modbus. Modbus Organization, Inc. Retrieved 2 August 2013. ↩︎ ↩︎
“Modbus FAQ” Modbus. Modbus Organization, Inc. Retrieved 1 November 2012. ↩︎
“About Modbus Organization”. Modbus. Modbus Organization, Inc. Retrieved 8 November 2012. ↩︎
Modbus Messaging on TCP/IP Implementation Guide V1.0b (PDF), Modbus Organization, Inc., October 24, 2006, retrieved 2017-01-07 ↩︎
“Java Modbus Library - About”. 2010. Retrieved 2017-02-07. ↩︎
“What is the difference between Modbus and Modbus Plus?”. Schneider Electric. Retrieved 2017-02-07. ↩︎
“Simply Modbus - About Enron Modbus”. Simply Modbus. Retrieved 2017-02-07. ↩︎
“Modbus Messaging On TCP/IP Implementation Guide” (PDF). Modbus Organization. Modbus-IDA. ↩︎
“Modbus Application Protocol V1.1b3”(PDF). Modbus. Modbus Organization, Inc. Retrieved 2 August 2013. ↩︎
Clarke, Gordon; Reynders, Deon (2004). Practical Modern Scada Protocols: Dnp3, 60870.5 and Related Systems. Newnes. pp. 47–51. ISBN 0-7506-5799-5. ↩︎
http://modbus.org/docs/PI_MBUS_300.pdf ↩︎
“Modbus 101 – Introduction to Modbus”. Control Solutions, Inc. ↩︎
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. ↩︎
“Modbus Plus - Modbus Plus Network - Products overview - Schneider Electric United States”. Schneider-electric.com. Retrieved 2014-01-03. ↩︎