开放型 Modbus/TCP 规范
修订版 1.0,1999 年 3 月 29 日
Andy Swales
Schneider 电气公司
aswales@modicon.com
目录
目录............................................................................................................................ 2
1.该规范的发展概况................................................................................................. 3
2.概述......................................................................................................................... 3
2.1 面向连接……………………………………………………………………….. 3
2.2 数据编码………………………………………………………………………..4
2.3 参考编号的解释………………………………………………………………..4
2.4 隐含长度基本原则............................................................................................. 5
3. 一致性等级概述................................................................................................... 5
3.1 类型 0………………………………………………………………………...... 5
3.2 类型 1.................................................................................................................. 5
3.3 类型 2………………………………………………………………………...... 6
3.4 机器/厂家/网络的特殊功能................................................................................ 7
4.协议结构.................................................................................................................. 7
5. 一致性等级的协议参考值.................................................................................... 8
5.1 类型 0 指令详述.................................................................................................. 9
5.1.1 读乘法寄存器 (FC 3)....................................................................................... 9
5.1.2 写乘法寄存器 (FC 16)..................................................................................... 9
5.2 类型 1 指令详述.................................................................................................. 10
5.2.1 读线圈 (FC 1)................................................................................................... 10
5.2.2 读离散输入 (FC 2).......................................................................................... 10
5.2.3 读输入寄存器 (FC 4)...................................................................................... 11
5.2.4 写线圈(FC 5).................................................................................................... 11
5.2.5 写单一寄存器 (FC 6)...................................................................................... 12
5.2.6 读异常状态字 (FC 7)....................................................................................... 12
5.3 类型 2 指令详述.................................................................................................. 13
5.3.1 强制多点线圈 (FC 15).................................................................................... 13
5.3.2 读一般参考值 (FC 20)..................................................................................... 14
5.3.3 写一般参考值 (FC 21).................................................................................... 15
5.3.4 掩模写寄存器 (FC 22)..................................................................................... 16
5.3.5 读/写寄存器 (FC 23)........................................................................................ 16
5.3.6 读 FIFO 队列 (FC 24)..................................................................................... 17
6. 异常代码……………………………………………………………………….... 17
附录............................................................................................................................. 19
A.客户机和服务器应用指导……………………………………………………..... 19
A.1 客户机设计......................................................................................................... 19
A.2 服务器设计.......................................................................................................... 19
A.2.1 多线程服务器………………………………………………………………...20
A.2.2 单线程服务器................................................................................................... 20
A.3 必需的及期望的性能………………………………………………………….. 21
B. 非指令数据的编码............................................................................................... 22
B.1 指令字中的比特数……………………………………………………………... 22
B.2 多指令字变量...................................................................................................... 23
B.2.1 984 数据类型……………………………………………………………….... 23
B.2.2 IEC-1131 数据类型......................................................................................... 24
该规范的发展概况
原始版本 1997 年 9 月 3 日
作为公共评论的草案。
再版 1999 年 3 月 29 日,即修订版 1.0。
没有大的技术改动,仅作了补充说明。
增加了附录 A 和 B 作为对一些常用执行问题的回应。
该 MODBUS/TCP 规范在万维网上公开发行。它表明开发者的意愿是把它作
为工业自动化领域具有互用性的标准。
既然 MODBUS 和 MODBUS/TCP 作为事实上的“实际”标准,而且很多生
产商已经实现了它的功能,此规范主要是阐述在互连网上具有普遍可用性的基于
TCP 通讯协议的 MODBUS 报文的特殊编码。
2.概述
MODBUS/TCP 是简单的、中立厂商的用于管理和控制自动化设备的 MODBUS 系列通
讯协议的派生产品。显而易见,它覆盖了使用 TCP/IP 协议的“Intranet”和“Internet”环境
中 MODBUS 报文的用途。协议的最通用用途是为诸如 PLC’s,I/O 模块,以及连接其它
简单域总线或 I/O 模块的网关服务的。
MODBUS/TCP 协议是作为一种(实际的)自动化标准发行的。既然 MODBUS 已经广
为人知,该规范只将别处没有收录的少量信息列入其中。然而,本规范力图阐明 MODBUS
中哪种功能对于普通自动化设备的互用性有价值,哪些部分是 MODBUS 作为可编程的协议
交替用于 PLC’s 的“多余部分”。
它通过将配套报文类型“一致性等级”,区别那些普遍适用的和可选的,特别是那些适
用于特殊设备如 PLC’s 的报文。
2.1 面向连接
在 MODBUS 中,数据处理传统上是无国界的,使它们对由噪音引起的中断有高的抵抗
力,而且在任一端只需要最小的维护信息。
编程操作,另一方面,期望一种面向连接的方法。这种方法对于简单变量通过唯一的“登
录”符号完成,对于 Modbus Plus 变量,通过明确的“程序路径”容量来完成,而“程序路
径”容量维持了一种双向连接直到被彻底击穿。
MODBUS/TCP 处理两种情况。连接在网络协议层很容易被辨认,单一的连接可以支持
多个独立的事务。此外,TCP 允许很大数量的并发连接,因而很多情况下,在请求时重新
连接或复用一条长的连接是发起者的选择。
熟悉 MODBUS 的开发者会感到惊讶:为什么面向连接 TCP 协议比面向数据报的 UDP
要应用广泛。主要原因是通过封装独立的“事务”在一个连接中,此连接可被识别,管理和
取消而无须请求客户和服务器采用特别的动作。这就使进程具有对网络性能变化的适应能
力,而且容许安全特色如防火墙和代理可以方便的添加。
类似的推理被最初的万维网的开发者所采用,他们选用 TCP 及端口 80 去实现一个作为
单一事务的最小的环球网询问。
2.2 数据编码
MODBUS 采用“big-endian”来表示地址和数据对象。 这就意味着当一个数字表示的
数量大于所传输的单一字节,最大有效字节将首先被发送。例如:
16 - bits 0x1234 将为 0x12 0x34
32 - bits 0x12345678L 将为 0x12 0x34 0x56 0x78
2.3 参考编号的解释
MODBUS 将其数据模型建立在一系列具有不同特征的表的基础之上。这四个基本表如下
离散输入 单比特,由 I/O 系统提供,只读
离散输出 单比特,由应用程序更改,读写
输入寄存器 16 比特,数值,由 I/O 系统提供 ,只读
输出寄存器 16 比特,数值,由应用程序更改,读写
输入和输出之间以及可寻址位和可寻址代码的数据对象之间的差别并不意味着任何应
用性能的不同。如果这是我们所讨论的目标机械的最自然的解释,那么认为所有的四个基本
表是相互覆盖的看法也是非常普通而完全可以接受的。
对于每一个基本表,协议允许单独选择 65536 个数据对象中的任何一个,而且对那些对
象的读写操作可以跨越多个连续的数据对象,直到达到基于处理事务功能代码的数据大小限
制。
这儿没有假定数据对象代表一种真正邻接的数据阵列,而这是大多数简单 PLC’s 的解
释。
“读写常用参考”功能代码被定义为携带 32 位的参考值并且能允许在“非常”大的空间里
可以直接访问数据对象。现在没有可以利用这一特点的 PLC 设备。
一个易造成混乱的潜在来源是用于 MODBUS 功能的参考值和用于 Modicon PLC’s 的
“寄存器值”之间的关系。由于历史原因,用户参考值使用从 1 开始的十进制数表示。而
MODBUS 采用更普通的从 0 开始的无符号整数进行软件数据整理分析。
于是,请求从 0 读取寄存器的 Modbus 消息将已知值返回建立在寄存器 4:00001(存储类
型 4=输出寄存器,参考值 00001)中的应用程序。
2.4 隐含长度基本原则
所有的 MODBUS 请求和响应都被设计成在此种方法下工作,即接收者可确认消息的完
整性。 对于请求和响应为固定长度的功能代码,仅发送功能代码就足够了。对于在请求和
响应中携带不定长数据的功能代码,数据部分前将加上一个字节的数据统计。
当 Modbus 通过 TCP 运送,前缀中携带附加的长度信息以便接收者识别消息的边界,
甚至消息被分成若干组进行传输。 外在的和隐含的长度准则的存在,以及 CRC-32 检错代
码(以太网)的使用使请求和响应消息中发生未被识别的错误的机率减至无限小。
3. 一致性等级概述
当从草稿开始定义一种新的协议,有可能加强编码方式和阐述的一致性。MODBUS 由
于其先进的特性,已经在很多地方得到了实施,必须避免破坏它已经存在的实施。
因此,已经存在的成套的处理类型被划分出一致性等级:等级 0 代表普遍使用且总体上
一致的功能;等级 2 代表有用的功能,但带有某些特性。现存装置的不适应于互用性的功能
也已确认。
必须注意到,将来对该标准的扩充将定义附加的功能代码来处理现存事实标准不适用的
情形。然而,被提议扩充的详细资料出现在本手册中将会另人误解。通过将代码“随机的”
发送或者即便是通过检查异常响应的类型来确定特别的目标装置是否支持特别的功能代码
总是可能的,而且该方法将保证引入这些扩充的现使用的 MODBUS 设备的连续的互用性。
事实上,这就是当前功能代码的分级原则。
3.1 等级 0
这是最小的有用功能,对主站和从站来说。
读乘法寄存器 (fc 3)
写乘法寄存器 (fc 16)
3.2 等级 1
这是附加的被普遍实现的和能共同使用的成套功能,正如前面介绍过的,许多从站把输
入,输出,离散值和寄存器值作为同等的进行处理。
读线圈 (fc 1)
读离散输入 (fc 2)
读寄存器输入 (fc 4)
写线圈 (fc 5)
写单一寄存器 (fc 6)
读异常状态字 (fc 7)
此功能对于每一个从站系列显然具有不同的含义。
3.3 等级 2
这些是需要 HMI 和管理等例行操作的数据传送功能。
强制型多路线圈 (fc 15)
读一般参考值 (fc 20)
该功能可以处理并发的多个请求,而且能接收 32 位的参考数值。当前的 584 和
984PLC’s 仅使用此功能接收类型 6 的参考值(扩展的寄存器文件)。
该功能最适于扩充以处理大的寄存器空间和缺少诸如“未定位”变量的参考值的数据对
象。
写一般参考值 (fc 21)
此功能可以处理并发的多个请求 ,也可接收 32 位的参考数值。当前的 584 和
984PLC’s 仅使用此功能接收类型 6 的参考值(扩展的寄存器文件)。
该功能最适于扩充以处理大的寄存器空间和缺少诸如“未定位”变量的参考值的数据对
象。
掩膜写寄存器 (fc 22)
读/写寄存器 (fc 23)
此功能把一定范围的寄存器输入和输出当作单一的处理事务。使用 MODBUS 是执行规
则的带有 I/O 模块的状态影象交换的最好办法。
如此,高性能的通用的数据采集装置可以执行功能 3,16 和 23,从而把快捷的数据规
则交换(23)和执行特殊数据对象的需求询问或更新的能力结合起来(3 和 16)。
读 FIFO 队列 (fc 24)
一个有点专用的功能,打算将表结构的数据象 FIFO(用到 584/984 上的 FIN 和 FOUT
功能模块)一样传送到主机。对于某种事件录入软件很有用。
3.4 机器/厂家/网络的特殊功能
以下所有的功能,虽然在 MODBUS 协议手册中提到,但由于它们有很强的机器依赖性,
因而不适于互用性的目的。
诊断 (fc 8)
编程 (484) (fc 9)
轮询 (484) (fc 10)
获取通讯事件计数器值(Modbus) (fc 11)
获取通讯事件记录(Modbus) (fc 12)
编程 (584/984) (fc 13)
轮询(584/984) (fc 14)
通告从站 ID (fc 17)
编程 (884/u84) (fc 18)
恢复通讯连接 (884/u84) (fc 19)
编程 (原理) (fc 40)
固件置换 (fc 125)
编程 (584/984) (fc 126)
通告本地地址 (Modbus) (fc 127)
4. 协议结构
本部分阐述了通过 MODBUS/TCP 网络携带的 MODBUS 请求和或响应封装的一般格
式。必须注意到请求和响应本体(从功能代码到数据部分的末尾)的结构和其它 MODBUS
变量具有完全相同的版面格式和含义,如:
MODBUS 串行端口 - ASCII 编码
MODBUS 串行端口 - RTU (二进制) 编码
MODBUS PLUS 网络 – 数据通道
这些其它案例仅在组帧次序,检错模式和地址描述等格式有所不同。
所有的请求通过 TCP 从寄存器端口 502 发出。
请求通常是在给定的连接以半双工的方式发送。也就是说,当单一连接被响应所占用,
就不能发送其它的请求。有些装置采用多条 TCP 连接来维持高的传输速率。 然而一些客户
端设备尝试“流水线式”的请求。允许服务器以这种方式工作的技术在附录 A 中阐述。
MODBUS “从站地址”字段被单字节的“单元标识符”替换,从而用于通过网桥和网
关等设备的通讯,这些设备用单一 IP 地址来支持多个独立的终接单元。
请求和响应带有六个字节的前缀,如下:
byte 0: 事务处理标识符 –由服务器复制 –通常为 0
byte 1: 事务处理标识符 –由服务器复制 –通常为 0
byte 2: 协议标识符= 0
byte 3: 协议标识符= 0
byte 4: 长度字段 (上半部分字节) = 0 (所有的消息长度小于 256)
byte 5: 长度字段 (下半部分字节) = 后面字节的数量
byte 6: 单元标识符 (原“从站地址”)
byte 7: MODBUS 功能代码
byte 8 on: 所需的数据
因而处理示例“以 4 的偏移从 UI 9 读 1 寄存器”返回 5 的值将是
请求:00 00 00 00 00 06 09 03 00 04 00 01
响应:00 00 00 00 00 05 09 03 02 00 05
一致性等级 0-2 的功能代码的应用的例子见后续部分
熟悉 MODBUS 的设计师将注意到 MODBUS/TCP 中不需要“CRC-16”或“LRC”检查
字段。而是采用 TCP/IP 和链路层(以太网)校验和机制来校验分组交换的准确性。
5. 一致性等级的协议参考值
注意到在例子中,请求和响应列在功能代码字节的前面。如前所述,在 MODBUS/TCP
案例中有一个依赖传输的包含 7 个字节的前缀。
ref ref 00 00 00 len unit
前面两个字节的“ref ref”在服务器中没有具体的值,只是为方便客户端而从请求和响
应中逐字的复制过来。单客户机通常将该值置为 0。
在这个例子中,请求和响应的格式如下(例子是“读寄存器”请求,详述见后面部分)。
03 00 00 00 01 => 03 02 12 34
这表示给前缀加上一个十六进制的串联的字节,这样,TCP 连接上的整个消息将是(假
设单元标识符还是 09)
请求: 00 00 00 00 00 06 09 03 00 00 00 01
响应: 00 00 00 00 00 05 09 03 02 12 34
(所有的这些请求和响应通过查询 Modicon Quantum PLC 规范采用自动工具来进行校验。