函数代码说明 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 对象目录进行简单访问。如需了解更多详细信息,请参见以下文档: MODBUS APPLICATION PROTOCOL SPECIFICATION V1.1b3(MODBUS 应用协议规范 V1.1b3),日期:2014 年 4 月 26 日,版本:1.1b3 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 字节: 请求 响应
函数代码说明 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 对象目录进行简单访问。如需了解更多详细信息,请参见以下文档: MODBUS APPLICATION PROTOCOL SPECIFICATION V1.1b3(MODBUS 应用协议规范 V1.1b3),日期:2014 年 4 月 26 日,版本:1.1b3 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 字节: 请求 响应
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 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 对象目录进行简单访问。如需了解更多详细信息,请参见以下文档: MODBUS APPLICATION PROTOCOL SPECIFICATION V1.1b3(MODBUS 应用协议规范 V1.1b3),日期:2014 年 4 月 26 日,版本:1.1b3 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 字节: 请求 响应
错误响应 发生错误时将发送以下错误消息: 名称 长度 示例值 亊务标识符 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 字节: 请求 响应
错误响应 发生错误时将发送以下错误消息: 名称 长度 示例值 亊务标识符 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 字节: 请求 响应
错误响应 发生错误时将发送以下错误消息: 名称 长度 示例值 亊务标识符 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 字节: 请求 响应