技术手册 PD4-E Modbus TCP

函数代码说明

FC 3 (03h) 读输入寄存器 / FC 4 (04h) 读保持寄存器

可使用此函数代码读取一个或多个 16 位值。此函数可应用于 NanoJ 对象(参见NanoJ 对象)或进程数据对象(最小 4 字节对齐,参见进程数据对象 (PDO))。

请求
名称 长度
亊务标识符 2 字节 0000h
协议标识符 2 字节 0000h
长度 2 字节 0006h
单位标识符 1 字节 00h
函数代码 1 字节 03h / 04h
起始地址 2 字节 0000h 至 FFFFh
寄存器数 2 字节 1 至 (7Dh)
响应(“M”对应要读取的寄存器数量)
名称 长度
亊务标识符 2 字节 0000h
协议标识符 2 字节 0000h
长度 2 字节 0003h + 2*M
单位标识符 1 字节 00h
函数代码 1 字节 03h / 04h
字节数 1 字节 2 * M
寄存器值 2 字节
错误
名称 长度
亊务标识符 2 字节 0000h
协议标识符 2 字节 0000h
长度 2 字节 0003h
单位标识符 1 字节 00h
故障代码 1 字节 83h / 84h
异常代码 1 字节 01、02、03 或 04

示例

以下为读取请求和寄存器 5000 (1388h) 及后续寄存器(2 个寄存器)的响应示例:

请求
响应

FC 6 (06h) 写单寄存器

此函数代码可用于写入一个 16 位值。此函数可用于进程数据对象(参见进程数据对象 (PDO))。

请求
名称 长度
亊务标识符 2 字节 0000h
协议标识符 2 字节 0000h
长度 2 字节 0006h
单位标识符 1 字节 00h
函数代码 1 字节 06h
寄存器地址 2 字节 0000h 至 FFFFh
寄存器值 2 字节 0000h 至 FFFFh
响应
名称 长度
亊务标识符 2 字节 0000h
协议标识符 2 字节 0000h
长度 2 字节 0006h
单位标识符 1 字节 00h
函数代码 1 字节 06h
寄存器地址 2 字节 0000h 至 FFFFh
寄存器值 2 字节 0000h 至 FFFFh
错误
名称 长度
亊务标识符 2 字节 0000h
协议标识符 2 字节 0000h
长度 2 字节 0003h
单位标识符 1 字节 00h
故障代码 1 字节 86h
异常代码 1 字节 01、02、03 或 04

示例

以下为向寄存器 6000 (1770h) 写入值“0001h”的请求与响应示例:

请求
响应

FC 16 (10h) 写多个寄存器

可使用此函数代码写入一个或多个 16 位值。此函数可应用于 NanoJ 对象(参见进程数据对象 (PDO))或进程数据对象(参见NanoJ 对象)。

请求(“N”为要写入的寄存器数量)
名称 长度
亊务标识符 2 字节 0000h
协议标识符 2 字节 0000h
长度 2 字节 0007h + N * 2
单位标识符 1 字节 00h
函数代码 1 字节 10h
起始地址 2 字节 0000h 至 FFFFh
寄存器数 2 字节 0001h 至 007Bh
字节数 1 字节 2 * N
寄存器值 N * 2 字节
响应
名称 长度
亊务标识符 2 字节 0000h
协议标识符 2 字节 0000h
长度 2 字节 0006h
单位标识符 1 字节 00h
函数代码 1 字节 10h
起始地址 2 字节 0000h 至 FFFFh
寄存器数 2 字节 0001h 至 007Bh
错误
名称 长度
亊务标识符 2 字节 0000h
协议标识符 2 字节 0000h
长度 2 字节 0003h
单位标识符 1 字节 00h
故障代码 1 字节 90h
异常代码 1 字节 01、02、03 或 04

示例

以下为从寄存器地址 6000 (1770h) 开始写入值“0102h”和“0304h”的示例,寄存器数为 2,数据长度为 4:

请求
响应

FC 23 (17h) 读/写多个寄存器

可使用此函数代码同时读取和写入一个或多个 16 位值。此函数可应用于 NanoJ 对象(参见进程数据对象 (PDO))或进程数据对象(参见NanoJ 对象)。

请求(“N”为要读取的寄存器数量):
名称 长度
亊务标识符 2 字节 0000h
协议标识符 2 字节 0000h
长度 2 字节 000Bh + 2 * N
单位标识符 1 字节 00h
函数代码 1 字节 17h
读取:起始地址 2 字节 0000h 至 FFFFh
读取:寄存器数 2 字节 0001h 至 0079h
写入:起始地址 2 字节 0000h 至 FFFFh
写入:寄存器数 2 字节 0001h 至 0079h
写入:字节数 1 字节 2 * N
写入:寄存器值 N * 2 字节
响应(“M”对应要写入的字节数):
名称 长度
亊务标识符 2 字节 0000h
协议标识符 2 字节 0000h
长度 2 字节 0003h + 2 * M
单位标识符 1 字节 00h
函数代码 1 字节 17h
字节数 1 字节 2 * M
寄存器读取 M * 2 字节
错误
名称 长度
亊务标识符 2 字节 0000h
协议标识符 2 字节 0000h
长度 2 字节 0003h
单位标识符 1 字节 00h
故障代码 1 字节 97h
异常代码 1 字节 01、02、03 或 04

示例

以下为读取从寄存器 5000 (1388h) 开始的两个寄存器以及将 4 个字节的数据“0102h”和“0304h”写入从寄存器 6000 (1770h) 开始的两个寄存器的示例:

请求
响应

FC 8 (08h) 诊断

Modbus 函数代码 FC08 提供多种测试,用于检查客户端和服务器之间的通信系统,或检查服务器中的各种内部错误状态。

此函数在请求中使用两字节子函数代码定义测试类型。在正常响应中,服务器重复函数代码和子函数代码。一些诊断在正常响应的数据字段中包含设备数据。

请求:
名称 长度
函数代码 1 字节 08h
子函数代码 2 字节
数据 N x 2 字节
响应:
名称 长度
函数代码 1 字节 08h
子函数代码 2 字节
数据 N x 2 字节
错误:
名称 长度
函数代码 1 字节 88h
异常代码 1 字节 01 或 03 或 04

FC 8.10 (08h.0Ah) 清除计数器和诊断寄存器

此请求的目的是重置所有计数器和诊断寄存器。打开控制器时也会重置计数器。

子函数 数据范围
请求 响应
00h 0Ah 00h - 00h 请求数据的回显

示例

请求
响应

FC 8.11 (08h.0Bh) 返回总线报文计数

响应数据范围返回从上次重启、“清除计数器和诊断寄存器”请求或打开控制器开始,通信系统检测到的报文数量。

子函数 数据范围
请求 响应
00h 0Bh 00h - 00h 总报文计数

FC 8.12 (08h.0Ch) 返回总线通信错误计数

响应数据范围返回从上次重启、“清除计数器和诊断寄存器”请求或打开控制器开始,CRC 错误的数量。

子函数 数据范围
请求 响应
00h 0Ch 00h - 00h CRC 错误计数

示例

请求
响应

FC 8.13 (08h.0Dh) 返回总线异常错误计数

响应数据范围返回从上次重启、“清除计数器和诊断寄存器”请求或打开控制器开始,Modbus 异常的数量。

子函数 数据范围
请求 响应
00h 0Dh 00h - 00h 异常错误计数

示例

请求
响应

FC 8.14 (08h.0Eh) 返回服务器报文计数

响应数据范围返回发往设备的报文数量以及控制器处理的广播消息数量。对从上次重启、“清除计数器和诊断寄存器”请求或打开控制器开始的消息进行计数。

子函数 数据范围
请求 响应
00h 0Eh 00h - 00h 服务器报文计数

示例

请求
响应

FC 8.15 (08h.0Fh) 返回服务器无响应计数

响应数据范围返回发往控制器,且没有响应(包括正常响应和异常响应)的报文数量。对从上次重启、“清除计数器和诊断寄存器”请求或打开控制器开始的消息进行计数。

子函数 数据范围
请求 响应
00h 0Fh 00h - 00h 无响应计数

示例

请求
响应

FC 8.16 (08h.10h) 返回服务器 NAK 计数

响应数据范围返回收到“反确认 (NAK)”异常响应的报文数量。对从上次重启、“清除计数器和诊断寄存器”请求或打开控制器开始的消息进行计数。

子函数 数据范围
请求 响应
00h - 10h 00h - 00h 服务器 NAK 计数

示例

请求
响应

FC 8.17 (08h.11h) 返回服务器忙计数

响应数据范围返回收到“服务器设备忙”异常响应的报文数量。对从上次重启、“清除计数器和诊断寄存器”请求或打开控制器开始的消息进行计数。

子函数 数据范围
请求 响应
00h - 11h 00h - 00h 服务器 NAK 计数

示例

请求
响应

FC 8.18 (08h.12h) 返回总线字符溢出计数

响应数据范围返回发往控制器,但由于字符溢出而无法进行处理的报文数量。对从上次重启、“清除计数器和诊断寄存器”请求或打开控制器开始的消息进行计数。当字符到达控制器的速度超过存储速度或由于硬件故障导致字符丢失时,会发生字符溢出。

子函数 数据范围
请求 响应
00h - 12h 00h - 00h 服务器字符溢出计数

示例

请求
响应

FC 43 (2Bh) 封装接口传输

此功能便于对 CANopen 对象目录进行简单访问。如需了解更多详细信息,请参见以下文档:

  1. MODBUS APPLICATION PROTOCOL SPECIFICATION V1.1b3(MODBUS 应用协议规范 V1.1b3),日期:2014 年 4 月 26 日,版本:1.1b3
  2. CiA 309 Draft Standard Proposal - Access from other networks - Part 2: Modbus/TCP mapping V1.3(CiA 309 标准草案提案 - 从其他网络访问 - 第 2 部分:Modbus/TCP 映射 V1.3)日期:2015 年 7 月 30 日,版本:1.3
注: 另一个字节序列部分适用于封装接口传输的消息,参见概述一章。

请求和响应定义

名称 长度 示例/数字范围
亊务标识符 2 字节 0000h
协议标识符 2 字节 0000h
长度 2 字节 00NNh
单位标识符 1 字节 00h
函数代码 1 字节 2Bh (43d)
MEI 类型 1 字节 0Dh (13d)
协议选项范围 2 至 5 字节
地址和数据范围 N 字节

协议选项范围

名称 长度 示例/数字范围
协议控制 1 至 2 字节 参见说明
保留 1 字节 始终为 0
(可选)计数器字节 1 字节
(可选)网络 ID 1 字节
(可选)编码数据 1 字节

协议控制:

“协议控制”字段包含控制消息协议所需要的标志。如果设定了“扩展”标志,则“协议控制”字段的字节定义如下(否则将忽略第二个字节):

“协议控制”字节 1 最重要的位 (MSB) 是位 0,“协议控制”字节 2 最重要的位是位 8。“协议控制”字节 1 最不重要的位 (LSB) 是位 7,“协议控制”字节 2 最不重要的位是位 15。

名称 说明
0 “扩展”标志 如果对象目录数据集超过适合 Modbus 命令的大小,则将使用此位。然后,数据集将跨越多条 Modbus 消息;每条消息包含数据集的一部分。“0”= 无多消息事务或多消息事务结束“1”= 部分多消息事务。
1 扩展协议控制 协议控制的长度,值“0”表示长度为 1 字节,值“1”表示长度为 2 字节。
2 计数器字节选项 此位设为“1”时表示此消息中使用“计数器字节”字段。如果此位设为“0”,则此消息中不含“计数器字节”字段。
3 和 4 保留 0
5 网络 ID 选项 不支持,必须为“0”。
6 编码数据选项 不支持,必须为“0”。
7 访问标志 此位表示所请求命令的访问方式。“0”= 读取,“1”= 写入。
8 to 15 保留 0

地址和数据范围

下表中定义了地址和数据范围:

名称 字节大小和字节顺序 示例/范围
节点 ID 1 字节 01h 至 7Fh
索引 1 字节,高 0000h 至 FFFFh
1 字节,低
子索引 1 字节 00h 至 FFh
起始地址 1 字节,高 0000h 至 FFFFh
1 字节,低
数据值数 1 字节,高 0000h 至 00FDh
1 字节,低
写入/读取数据 n 字节 数据的编码如概述一章中所述。

示例:

如需读取对象 6042h:00h(16 位值),主站必须发送以下消息(所有值均以十六进制表示)。

请求
响应

如下方附加示例所示,主站向从站发送 Modbus 消息序列,从而在“速度”模式下旋转电机:

设定 6060 =“02h”(速度模式)
请求
响应
设定 2031 =“203E8h”(1000 mA)
请求
响应
设定 6040 =“00h
请求
响应
设定 6040 =“80h
请求
响应
设定 6040 =“06h
请求
响应
设定 6040 =“07h
请求
响应
设定 6040 =“0Fh
请求
响应

以下为读取对象的两个示例:

读取 6041h:00h
请求
响应
读取 6061h:00h
请求
响应

错误响应

发生错误时将发送以下错误消息:

名称 长度 示例值
亊务标识符 2 字节 0000h
协议标识符 2 字节 0000h
长度 2 字节 000Bh
单位标识符 1 字节 00h
函数代码 1 字节 2Bh +80h (171d = 43d + 128d)(表示出错)
Modbus 异常代码 1 字节 FFh(“扩展异常”)
扩展异常长度 2 字节 6
MEI 类型 1 字节 0Dh
异常代码 1 字节 CEh
故障代码 4 个字节 CANopen 故障代码

如果设定了不支持的控制选项位,则将发送以下错误消息:

名称 长度 示例值
亊务标识符 2 字节 0000h
协议标识符 2 字节 0000h
长度 2 字节 0008/0009h
单位标识符 1 字节 00h
函数代码 1 字节 2Bh +80h (171d = 43d + 128d)(表示出错)
Modbus 异常代码 1 字节 FFh(“扩展异常”)
扩展异常长度 2 字节 2 +“不支持的协议控制”长度
MEI 类型 1 字节 0Dh
异常代码 1 字节 AEh
不支持的协议控制 1 或 2 个字节 见下表
名称 说明
0 “扩展”标志 如果对象目录数据集超过适合 Modbus 命令的大小,则将使用此位。然后,数据集将跨越多条 Modbus 消息;每条消息包含数据集的一部分。“0”= 无多消息事务或多消息事务结束“1”= 部分多消息事务。
1 扩展协议控制 协议控制的长度,值“0”表示长度为 1 字节,值“1”表示长度为 2 字节。
2 计数器字节选项 此位设为“1”时表示此消息中使用“计数器字节”字段。如果此位设为“0”,则此消息中不含“计数器字节”字段。
3 和 4 保留 0
5 网络 ID 选项 不支持,必须为“0”。
6 编码数据选项 不支持,必须为“0”。
7 访问标志 此位表示所请求命令的访问方式。“0”= 读取,“1”= 写入。
8 to 15 保留 0

以下示例显示了发生错误请求时的错误。请求读取 6061h:00,长度为 2 字节,但此对象大小仅为 1 字节:

请求
响应

FC 101 (65h) 读取完整对象目录

此函数代码用于读取完整对象目录。

如需启动或重启对象目录读取,必须发送子函数代码 55h。此代码可重置对象 0000h 上的对象目录读取。然后,所有后续对象目录框架都必须包含子函数代码 AAh。最后,读取所有对象后,将立即通过中止代码“无可用数据”生成“错误响应”。

各个“读取对象”的格式如下:

请求:
名称 长度 值/说明
从站地址 1 字节
函数代码 1 字节 65h
子函数代码 1 字节 55h 或 AAh
数据长度 1 字节 00h
CRC 2 字节
响应:
名称 长度 值/说明
从站地址 1 字节 65h
函数代码 1 字节
子函数代码 1 字节
数据长度 1 字节
“对象目录框架”的 n 倍 1 - 252 字节
CRC 2 字节
对象目录框架由以下字节组成:
名称 值/说明
索引低位字节 1 字节
索引高位字节 1 字节
子索引 1 字节
字节数 1 字节 数据字段中的有效数据的数量 m
数据字节 m-1 字节

示例

以下所有数值均为十六进制格式。

开始通过请求读取对象目录:

响应为:

通过请求读取下一部分的对象目录:

响应为:

通过以前的请求重复读取对象目录,直到响应错误:

错误响应

发生错误时将发送以下错误消息:

名称 长度 示例值
亊务标识符 2 字节 0000h
协议标识符 2 字节 0000h
长度 2 字节 000Bh
单位标识符 1 字节 00h
函数代码 1 字节 2Bh +80h (171d = 43d + 128d)(表示出错)
Modbus 异常代码 1 字节 FFh(“扩展异常”)
扩展异常长度 2 字节 6
MEI 类型 1 字节 0Dh
异常代码 1 字节 CEh
故障代码 4 个字节 CANopen 故障代码

如果设定了不支持的控制选项位,则将发送以下错误消息:

名称 长度 示例值
亊务标识符 2 字节 0000h
协议标识符 2 字节 0000h
长度 2 字节 0008/0009h
单位标识符 1 字节 00h
函数代码 1 字节 2Bh +80h (171d = 43d + 128d)(表示出错)
Modbus 异常代码 1 字节 FFh(“扩展异常”)
扩展异常长度 2 字节 2 +“不支持的协议控制”长度
MEI 类型 1 字节 0Dh
异常代码 1 字节 AEh
不支持的协议控制 1 或 2 个字节 见下表
名称 说明
0 “扩展”标志 如果对象目录数据集超过适合 Modbus 命令的大小,则将使用此位。然后,数据集将跨越多条 Modbus 消息;每条消息包含数据集的一部分。“0”= 无多消息事务或多消息事务结束“1”= 部分多消息事务。
1 扩展协议控制 协议控制的长度,值“0”表示长度为 1 字节,值“1”表示长度为 2 字节。
2 计数器字节选项 此位设为“1”时表示此消息中使用“计数器字节”字段。如果此位设为“0”,则此消息中不含“计数器字节”字段。
3 和 4 保留 0
5 网络 ID 选项 不支持,必须为“0”。
6 编码数据选项 不支持,必须为“0”。
7 访问标志 此位表示所请求命令的访问方式。“0”= 读取,“1”= 写入。
8 to 15 保留 0

以下示例显示了发生错误请求时的错误。请求读取 6061h:00,长度为 2 字节,但此对象大小仅为 1 字节:

请求
响应

FC 102 (66h) 读取完整数组或记录

此函数代码用于从对象目录中读取完整数组或记录。

如需启动或重启数组读取,必须发送子函数代码 55h。此代码可重置带子索引 00h 的对象读取。然后,所有后续请求都必须包含子函数代码 AAh。最后,读取所有对象后,将立即生成“错误响应”。

各个“读取对象”的格式如下:

请求:
名称 长度 值/说明
亊务标识符 2 字节 0000h
协议标识符 2 字节 0000h
长度 2 字节 0007h
单位标识符 1 字节 00h
函数代码 1 字节 66h
子函数代码 1 字节 55h 或 AAh
数据长度 1 字节 00h
要读取的数组的索引 2 字节
响应:
名称 长度 值/说明
亊务标识符 2 字节 0000h
协议标识符 2 字节 0000h
长度 2 字节 0004h+n
单位标识符 1 字节 00h
函数代码 1 字节
子函数代码 1 字节
数据长度 1 字节
对象目录框架的 n 倍 1 - 252 字节
对象目录框架由以下字节组成:
名称 值/说明
索引低位字节 1 字节
索引高位字节 1 字节
子索引 1 字节
字节数 1 字节 数据字段中的有效数据的数量 m
数据字节 m-1 字节

示例

以下所有数值均为十六进制格式;要读取的对象的索引为 2400h

开始通过请求读取数组:

响应为:

错误响应

发生错误时将发送以下错误消息:

名称 长度 示例值
亊务标识符 2 字节 0000h
协议标识符 2 字节 0000h
长度 2 字节 000Bh
单位标识符 1 字节 00h
函数代码 1 字节 2Bh +80h (171d = 43d + 128d)(表示出错)
Modbus 异常代码 1 字节 FFh(“扩展异常”)
扩展异常长度 2 字节 6
MEI 类型 1 字节 0Dh
异常代码 1 字节 CEh
故障代码 4 个字节 CANopen 故障代码

如果设定了不支持的控制选项位,则将发送以下错误消息:

名称 长度 示例值
亊务标识符 2 字节 0000h
协议标识符 2 字节 0000h
长度 2 字节 0008/0009h
单位标识符 1 字节 00h
函数代码 1 字节 2Bh +80h (171d = 43d + 128d)(表示出错)
Modbus 异常代码 1 字节 FFh(“扩展异常”)
扩展异常长度 2 字节 2 +“不支持的协议控制”长度
MEI 类型 1 字节 0Dh
异常代码 1 字节 AEh
不支持的协议控制 1 或 2 个字节 见下表
名称 说明
0 “扩展”标志 如果对象目录数据集超过适合 Modbus 命令的大小,则将使用此位。然后,数据集将跨越多条 Modbus 消息;每条消息包含数据集的一部分。“0”= 无多消息事务或多消息事务结束“1”= 部分多消息事务。
1 扩展协议控制 协议控制的长度,值“0”表示长度为 1 字节,值“1”表示长度为 2 字节。
2 计数器字节选项 此位设为“1”时表示此消息中使用“计数器字节”字段。如果此位设为“0”,则此消息中不含“计数器字节”字段。
3 和 4 保留 0
5 网络 ID 选项 不支持,必须为“0”。
6 编码数据选项 不支持,必须为“0”。
7 访问标志 此位表示所请求命令的访问方式。“0”= 读取,“1”= 写入。
8 to 15 保留 0

以下示例显示了发生错误请求时的错误。请求读取 6061h:00,长度为 2 字节,但此对象大小仅为 1 字节:

请求
响应
▶   下一个

目录