首页资源分类工业控制工业网络 > modbus协议

modbus协议

已有 456763个资源

下载专区

上传者其他资源

文档信息举报收藏

标    签: Modbus

分    享:

文档简介

标准modbus中文版通讯协议

文档预览

欢迎来到控制中文网 GB/T ××××—×××× http://www.cechinamag.com 前言 -----------串行链路和 TCP/IP 上的 MODBUS 标准介绍 该标准包括两个通信规程中使用的 MODBUS 应用层协议和服务规范: ·串行链路上的 MODBUS MODBUS 串行链路取决于 TIA/EIA 标准:232-F 和 485-A。 ·TCP/IP 上的 MODBUS MODBUS TCP/IP 取决于 IETF 标准:RFC793 和 RFC791 有关。 串行链路和 TCP/IP 上的 MODBUS 是根据相应 ISO 层模型说明的两个通信规程。 下图强调指出了该标准的主要部分。绿色方框表示规范。灰色方框表示已有的国际标准 (TIA/EIA 和 IETF 标准)。 Modbus 协议规范 45 页 MODBUS 应用层 MODBUS 报文 传输在 TCP/IP 上的实现指南 49 页 在 TCP/IP 上的 MODBUS 映射 TCP IETF RFC 793 MODBUS 报 文 传输在串行链路 上的实现指南 45 页 串行链路主站/从站 IP IETF RFC 791 以太网 II/802.3 IEEE 802.2 TIA/EIA-232-F TIA/EIA-485-A 以太网物理层 MODBUS 标准分为三部分。第一部分(“Modbus 协议规范”)描述了 MODBUS 事 物处理。第二部分(“MODBUS 报文传输在 TCP/IP 上的实现指南”)提供了一个有助于 开发者实现 TCP/IP 上的 MODBUS 应用层的参考信息。第三部分(“MODBUS 报文传 输在串行链路上的实现指南”)提供了一个有助于开发者实现串行链路上的 MODBUS 应用层的参考信息。 0 GB/T ××××—×××× 第一部分:Modbus 协议 欢迎来到控制中文网 http://www.cechinamag1 .com GB/T ××××—×××× 第一部分:Modbus 协议 1 引言 1.1 范围 MODBUS 是 OSI 模型第 7 层上的应用层报文传输协议,它在连接至不同类型总线或网络的设备 之间提供客户机/服务器通信。 自从 1979 年出现工业串行链路的事实标准以来,MODBUS 使成千上万的自动化设备能够通信。 目前,继续增加对简单而雅观的 MODBUS 结构支持。互联网组织能够使 TCP/IP 栈上的保留系统端 口 502 访问 MODBUS。 MODBUS 是一个请求/应答协议,并且提供功能码规定的服务。MODBUS 功能码是 MODBUS 请求/应答 PDU 的元素。本文件的作用是描述 MODBUS 事务处理框架内使用的功能码。 1.2 规范性引用文件 1.RFC791,互联网协议,Sep81 DARPA 2.MODBUS 协议参考指南 Rev J,MODICON,1996 年 6 月,doc#PI_MBUS_300 MODBUS 是一项应用层报文传输协议,用于在通过不同类型的总线或网络连接的设备之间的客 户机/服务器通信。 目前,使用下列情况实现 MODBUS: 以太网上的 TCP/IP。 各种媒体(有线:EIA/TIA-232-E、EIA-422、EIA/TIA-485-A;光纤、无线等等)上的异步串行 传输。 MODBUS PLUS,一种高速令牌传递网络。 MODBUS 应用层 基于 TCP 的 Modbus TCP IP 其它 其它 MODBUS+/HDL 主站/从站 物理层 EIA/TIA-232 或 EIA/TIA-485 图 1:MODBUS 通信栈 2 缩略语 ADU 应用数据单元 2 以太网 II/802.3 以太网物理层 HDLC 高级数据链路控制 HMI 人机界面 IETF 因特网工程工作组 I/O 输入/输出设备 IP 互连网协议 MAC 介质访问控制 MB MODBUS 协议 MBAP MODBUS 协议 PDU 协议数据单元 PLC 可编程逻辑控制器 TCP 传输控制协议 这里应该是应用协议吧 GB/T ××××—×××× 3 背景概要 MODBUS 协议允许在各种网络体系结构内进行简单通信。 MODBUS 通信 驱动器 PLC HMI I/O MODBUS ON TCP/IP 网关 网关 I/O PLC I/O 网关 MODBUS ON RS485 MODBUS ON RS232 MODBUS ON MB+ I/O PLC HMI 驱动器 I/O 驱动器 PLC I/O I/O 驱动器 图 2:MODBUS 网络体系结构的实例 每种设备(PLC、HMI、控制面板、驱动程序、动作控制、输入/输出设备)都能使用 MODBUS 协议来启动远程操作。 在基于串行链路和以太 TCP/IP 网络的 MODBUS 上可以进行相同通信。 一些网关允许在几种使用 MODBUS 协议的总线或网络之间进行通信。 4 总体描述 4.1 协议描述 MODBUS 协议定义了一个与基础通信层无关的简单协议数据单元(PDU)。特定总线或网络上 的 MODBUS 协议映射能够在应用数据单元(ADU)上引入一些附加域。 3 GB/T ××××—×××× 地址域 功能码 ADU 数据 差错校验 PDU 图 3:通用 MODBUS 帧 启动 MODBUS 事务处理的客户机创建 MODBUS 应用数据单元。功能码向服务器指示将执行哪 种操作。 MODBUS 协议建立了客户机启动的请求格式。 用一个字节编码 MODBUS 数据单元的功能码域。有效的码字范围是十进制 1-255(128-255 为 异常响应保留)。当从客户机向服务器设备发送报文时,功能码域通知服务器执行哪种操作。 向一些功能码加入子功能码来定义多项操作。 从客户机向服务器设备发送的报文数据域包括附加信息,服务器使用这个信息执行功能码定义 的操作。这个域还包括离散项目和寄存器地址、处理的项目数量以及域中的实际数据字节数。 在某种请求中,数据域可以是不存在的(0 长度),在此情况下服务器不需要任何附加信息。功 能码仅说明操作。 如果在一个正确接收的 MODBUS ADU 中,不出现与请求 MODBUS 功能有关的差错,那么服 务器至客户机的响应数据域包括请求数据。如果出现与请求 MODBUS 功能有关的差错,那么域包 括一个异常码,服务器应用能够使用这个域确定下一个执行的操作。 例如,客户机能够读一组离散量输出或输入的开/关状态,或者客户机能够读/写一组寄存器的数 据内容。 当服务器对客户机响应时,它使用功能码域来指示正常(无差错)响应或者出现某种差错(称 为异常响应)。对于一个正常响应来说,服务器仅对原始功能码响应。 客户机 服务器 启动请求 功能码 数据请求 执行操作 启动响应 接收响应 操作码 数据响应 图 4:MODBUS 事务处理(无差错) 对于异常响应,服务器返回一个与原始功能码等同的码,设置该原始功能码的最高有效位为逻 辑 1。 4 客户机 GB/T ××××—×××× 服务器 启动请求 功能码 数据请求 接收响应 在操作中检测的差错 启动差错 差错码 异常码 图 5 MODBUS 事务处理(异常响应) F 注释:需要管理超时,以便明确地等待可能不会出现的应答。 串行链路上第一个 MODBUS 执行的长度约束限制了 MODBUS PDU 大小(最大 RS485ADU=256 字节)。 因此,对串行链路通信来说,MODBUS PDU=256-服务器地址(1 字节)-CRC(2 字节)=253 字节。 从而: RS232 / RS485 ADU = 253 字节+服务器地址(1 byte) + CRC (2 字节) = 256 字节。 TCP MODBUS ADU = 249 字节+ MBAP (7 字节) = 256 字节。 MODBUS 协议定义了三种 PDU。它们是: l MODBUS 请求 PDU,mb_req_pdu l MODBUS 响应 PDU,mb_rsp_pdu l MODBUS 异常响应 PDU,mb_excep_rsp_pdu 定义 mb_req_pdu 为: mb_req_pdu = { function_code, request_data},其中 function_code - [1 个字节] MODBUS 功能码 request_data - [n 个字节],这个域与功能码有关,并且通常包括诸如可变参考、变量、数据偏移 量、子功能码等信息。 定义 mb_rsp_pdu 为: mb_rsp_pdu = { function_code, response_ data},其中 function_code - [1 个字节] MODBUS 功能码 response_data - [n 个字节],这个域与功能码有关,并且通常包括诸如可变参考、变量、数据偏 移量、子功能码等信息。 定义 mb_excep_rsp_pdu 为: mb_excep_rsp_pdu = { function_code, request_data},其中 function_code - [1 个字节] MODBUS 功能码 + 0x80 exception_code - [1 个字节],在下表中定义了 MODBUS 异常码。 4.2 数据编码 l MODBUS 使用一个‘big-Endian’ 表示地址和数据项。这意味着当发射多个字节时,首先发 送最高有效位。例如: 寄存器大小 值 5 GB/T ××××—×××× 16 – 比特 0x1234 F 注释:更详细的信息参见[1]。 发送的第一字节为 0x12 然后 0x34 4.3 MODBUS 数据模型 MODBUS 以一系列具有不同特征表格上的数据模型为基础。四个基本表格为: 基本表格 对象类型 访问类型 内容 离散量输入 线圈 输入寄存器 保持寄存器 单个比特 单个比特 16-比特字 16-比特字 只读 读写 只读 读写 I/O 系统提供这种类型数据 通过应用程序改变这种类型数据 I/O 系统提供这种类型数据 通过应用程序改变这种类型数据 输入与输出之间以及比特寻址的和字寻址的数据项之间的区别并没有暗示任何应用操作。如果 这是对可疑对象核心部分最自然的解释,那么这种区别是可完全接受的,而且很普通,以便认为四 个表格全部覆盖了另外一个表格。 对于基本表格中任何一项,协议都允许单个地选择 65536 个数据项,而且设计那些项的读写操 作可以越过多个连续数据项直到数据大小规格限制,这个数据大小规格限制与事务处理功能码有关。 很显然,必须将通过 MODBUS 处理的所有数据放置在设备应用存储器中。但是,存储器的物 理地址不应该与数据参考混淆。要求仅仅是数据参考与物理地址的链接。 MODBUS 功能码中使用的 MODBUS 逻辑参考数字是以 0 开始的无符号整数索引。 l MODBUS 模型实现的实例 下例实例示出了两种在设备中构造数据的方法。可能有不同的结构,这个文件中没有全部描述 出来。每个设备根据其应用都有它自己的数据结构。 实例 1:有 4 个独立块的设备 下例实例示出了设备中的数据结构,这个设备含有数字量和模拟量、输入量和输出量。由于不 同块中的数据不相关,每个块是相互独立。按不同 MODBUS 功能码访问每个块。 6 设备应用存储器 GB/T ××××—×××× MODBUS 访问 输入离散量 线圈 输入寄存器 保存寄存器 MODBUS 请求 MODBUS 服务器设备 图 6:带有独立块的 MODBUS 数据模型 实例 2:仅有 1 个块的设备 在这个实例中,设备仅有 1 个数据块。通过几个 MODBUS 功能码可能得到一个相同数据,或 者通过 16 比特访问或 1 个访问比特。 设备应用存储器 MODBUS 访问 R W 输入离散量 线圈 R 输入寄存器 W 保存寄存器 MODBUS 请求 MODBUS 服务器设备 图 7:仅带有 1 个块的 MODBUS 数据模型 4.4 MODBUS 事务处理的定义 下列状态图描述了在服务器侧 MODBUS 事务处理的一般处理过程。 7 GB/T ××××—×××× 发 送 Modbus 异常响应 等待 MB 指示 异常码_1 异常码_2 异常码_3 异常码_4_5_6 [接收 MB 指示] 确认操作码 [无效的] [有效的] 确认数据地址 [无效的] [有效的] 确认数据值 [无效的] [有效的] 执行 MB 操作 [无效的] [有效的] 发 送 Modbus 响应 图 8:MODBUS 事务处理的状态图 一旦服务器处理请求,使用合适的 MODBUS 服务器事务建立 MODBUS 响应。 根据处理结果,可以建立两种类型响应: l 一个正 MODBUS 响应: ● 响应功能码 = 请求功能码 l 一个 MODBUS 异常响应(参见第 6.14 节): l 用来为客户机提供处理过程中与被发现的差错相关的信息; l 响应功能码 = 请求功能码 + 0x80; l 提供一个异常码来指示差错原因。 5 功能码分类 有三类 MODBUS 功能码。它们是: 公共功能码 l 是较好地被定义的功能码, l 保证是唯一的, l MODBUS 组织可改变的, l 公开证明的, l 具有可用的一致性测试, l MB IETF RFC 中证明的, 8 GB/T ××××—×××× l 包含已被定义的公共指配功能码和未来使用的未指配保留供功能码。 用户定义功能码 l 有两个用户定义功能码的定义范围,即 65 至 72 和十进制 100 至 110。 l 用户没有 MODBUS 组织的任何批准就可以选择和实现一个功能码 l 不能保证被选功能码的使用是唯一的。 l 如果用户要重新设置功能作为一个公共功能码,那么用户必须启动 RFC,以便将改变引入 公共分类中,并且指配一个新的公共功能码。 保留功能码 l 一些公司对传统产品通常使用的功能码,并且对公共使用是无效的功能码。 127 公共功能码 110 用户定义功能码 100 公共功能码 72 用户定义功能码 65 公共功能码 1 图 9:MODBUS 功能码分类 9 GB/T ××××—×××× 5.1 公共功能码定义 比特访问 物理离散 量输入 内部比特 或 物理线圈 读输入离散量 读线圈 写单个线圈 写多个线圈 功能码 码 子码 (十六进制) 页 02 02 11 01 01 10 05 05 16 15 0F 37 数 输入存储 读输入寄存器 04 据 器 访 读多个寄存器 03 问 16 比 特 访 内部存储 写单个寄存器 06 问 器 或 写多个寄存器 16 物理输出 读 / 写 多 个 寄 存 23 存储器 器 屏蔽写寄存器 22 04 14 03 13 06 17 10 39 17 47 16 46 文件记录访问 封装接口 6 功能码描述 6.1 01 (0x01)读线圈 读文件记录 写文件记录 读设备识别码 20 6 21 6 43 14 14 42 15 44 2B 在一个远程设备中,使用该功能码读取线圈的 1 至 2000 连续状态。请求 PDU 详细说明了起始 地址,即指定的第一个线圈地址和线圈编号。从零开始寻址线圈。因此寻址线圈 1-16 为 0-15。 根据数据域的每个比特将响应报文中的线圈分成为一个线圈。指示状态为 1= ON 和 0= OFF。 第一个数据字节的 LSB(最低有效位)包括在询问中寻址的输出。其它线圈依次类推,一直到这个 字节的高位端为止,并在后续字节中从低位到高位的顺序。 如果返回的输出数量不是八的倍数,将用零填充最后数据字节中的剩余比特(一直到字节的高 位端)。字节数量域说明了数据的完整字节数。 请求 PDU 功能码 1 个字节 0x01 起始地址 2 个字节 0x0000 至 0xFFFF 线圈数量 2 个字节 1 至 2000(0x7D0) 响应 PDU 功能码 1 个字节 0x01 字节数 1 个字节 N* 线圈状态 N 个字节 n=N 或 N+1 10 *N=输出数量/8,如果余数不等于 0,那么N = N+1 GB/T ××××—×××× 错误 功能码 异常码 1 个字节 1 个字节 功能码+0x80 01 或 02 或 03 或 04 这是一个请求读离散量输出 20-38 的实例: 请求 响应 域名 (十六进制) 域名 功能 01 功能 起始地址 Hi 00 字节数 起始地址 Lo 13 输出状态 27-20 输出数量 Hi 输出数量 Lo 00 输出状态 35-28 13 输出状态 38-36 (十六进制) 01 03 CD 6B 05 将输出 27-20 的状态表示为十六进制字节值 CD,或二进制 1100 1101。输出 27 是这个字节的 MSB,输出 20 是 LSB。 通常,将一个字节内的比特表示为 MSB 位于左侧,LSB 位于右侧。第一字节的输出从左至右 为 27 至 20。下一个字节的输出从左到右为 35 至 28。当串行发射比特时,从 LSB 向 MSB 传输:20 . . . 27、28 . . . 35 等等。 在最后的数据字节中,将输出状态 38-36 表示为十六进制字节值 05,或二进制 0000 0101。输出 38 是左侧第六个比特位置,输出 36 是这个字节的 LSB。用零填充五个剩余高位比特。 注:用零填充五个剩余比特(一直到高位端)。 11 GB/T ××××—×××× 进入 MB 服务器接收 mb_req_pdu NO 支持的功能码 异常码=01 YES NO 0x0001≤输出数量≤0x07D0 异常码=03 YES NO 异常码=02 起始地址==OK 和 起始地址+输出数量==OK YES 请求处理 NO 异常码=04 读取离散输出==OK YES MB 服务器发送 mb_rsp MB 服务器发送 mb_exception_rsp 退出 图 10:读取线圈状态图 6.2 02 (0x02)读离散量输入 在一个远程设备中,使用该功能码读取离散量输入的 1 至 2000 连续状态。请求 PDU 详细说明 了起始地址,即指定的第一个输入地址和输入编号。从零开始寻址输入。因此寻址输入 1-16 为 0-15。 根据数据域的每个比特将响应报文中的离散量输入分成为一个输入。指示状态为 1= ON 和 0= OFF。第一个数据字节的 LSB(最低有效位)包括在询问中寻址的输入。其它输入依次类推,一直 到这个字节的高位端为止,并在后续字节中从低位到高位的顺序。 如果返回的输入数量不是八的倍数,将用零填充最后数据字节中的剩余比特(一直到字节的高 位端)。字节数量域说明了数据的完整字节数。 12 请求 PDU 功能码 起始地址 输入数量 1 个字节 2 个字节 2 个字节 GB/T ××××—×××× 0x02 0x0000 至 0xFFFF 1 至 2000(0x7D0) 响应 PDU 功能码 1 个字节 0x82 字节数 1 个字节 N* 输入状态 N*×1 个字节 *N=输出数量/8,如果余数不等于 0,那么N = N+1 错误 差错码 异常码 1 字节 1 字节 0x82 01 或 02 或 03 或 04 这是一个请求读取离散量输入 197-218 的实例: 请求 响应 域名 (十六进制) 域名 功能 起始地址 Hi 起始地址 Lo 输出数量 Hi 输出数量 Lo 02 功能 00 字节数 C4 输入状态 204-197 00 输入状态 212-205 输入状态 218-213 16 (十六进制) 02 03 AC DB 35 将离散量输入状态 204-197 表示为十六进制字节值 AC,或二进制 1010 1100。输入 204 是这个 字节的 MSB,输入 197 是这个字节的 LSB。 将离散量输入状态 218-213 表示为十六进制字节值 35,或二进制 0011 0101。输入 218 位于左侧 第 3 比特,输入 213 是 LSB。 注:用零填充 2 个剩余比特(一直到高位端)。 13 GB/T ××××—×××× 进入 MB 服务器接 收 mb_req_pdu NO 支持的功能码 异常码=01 YES NO 0x0001≤输入数量≤0x07D0 异常码=03 YES NO 异常码=02 起始地址==OK 和 起始地址+输入数量==OK YES 请求处理 NO 异常码=04 读取离散输入==OK YES MB 服务器发送 mb_rsp MB 服务器发送 mb_exception_rsp 退出 图 11:读离散量输入的状态图 6.3 03 (0x03)读保持寄存器 在一个远程设备中,使用该功能码读取保持寄存器连续块的内容。请求 PDU 说明了起始寄存器 地址和寄存器数量。从零开始寻址寄存器。因此,寻址寄存器 1-16 为 0-15。 将响应报文中的寄存器数据分成每个寄存器有两字节,在每个字节中直接地调整二进制内容。 对于每个寄存器,第一个字节包括高位比特,并且第二个字节包括低位比特。 请求 功能码 1 个字节 0x03 起始地址 2 个字节 0x0000 至 0xFFFF 寄存器数量 2 个字节 1 至 125(0x7D) 14 响应 功能码 字节数 寄存器值 *N=寄存器的数量 错误 差错码 异常码 1 个字节 1 个字节 N*×2 个字节 1 个字节 1 个字节 0x03 2×N* GB/T ××××—×××× 0x83 01 或 02 或 03 或 04 这是一个请求读寄存器 108-110 的实例: 请求 响应 域名 (十六进制) 域名 功能 高起始地址 低起始地址 高寄存器编号 低寄存器编号 03 功能 00 字节数 6B 寄存器值 Hi(108) 00 寄存器值 Lo(108) 寄存器值 Hi(109) 03 寄存器值 Lo(109) 寄存器值 Hi(110) 寄存器值 Lo(110) (十六进制) 03 06 02 2B 00 00 00 64 将寄存器 108 的内容表示为两个十六进制字节值 02 2B,或十进制 555。将寄存器 109-110 的内 容分别表示为十六进制 00 00 和 00 64,或十进制 0 和 100。 15 GB/T ××××—×××× 进入 MB 服务器接 收 mb_req_pdu NO 支持的功能码 异常码=01 YES NO 0x0001≤寄存器数量≤0x007D 异常码=03 YES NO 异常码=02 起始地址==OK 和 起始地址+寄存器数量==OK YES 请求处理 NO 异常码=04 读多个寄存器==OK YES MB 服务器发送 mb_rsp MB 服务器发送 mb_exception_rsp 退出 图 12:读保持寄存器的状态图 6.4 04(0x04)读输入寄存器 在一个远程设备中,使用该功能码读取 1 至大约 125 的连续输入寄存器。请求 PDU 说明了起始 地址和寄存器数量。从零开始寻址寄存器。因此,寻址输入寄存器 1-16 为 0-15。 将响应报文中的寄存器数据分成每个寄存器为两字节,在每个字节中直接地调整二进制内容。 对于每个寄存器,第一个字节包括高位比特,并且第二个字节包括低位比特。 请求 功能码 起始地址 输入寄存器数量 1 个字节 2 个字节 2 个字节 0x04 0x0000 至 0xFFFF 0x0001 至 0x007D 16 响应 功能码 字节数 输入寄存器 *N=输入寄存器的数量 错误 差错码 异常码 1 个字节 1 个字节 N*×2 个字节 1 个字节 1 个字节 0x04 2×N* GB/T ××××—×××× 0x84 01 或 02 或 03 或 04 这是一个请求读输入寄存器 9 的实例: 请求 域名 (十六进制) 功能 04 起始地址 Hi 00 起始地址 Lo 08 输入寄存器数量 Hi 00 输入寄存器数量 Lo 01 响应 域名 功能 字节数 输入寄存器 9 Hi 输入寄存器 9 Lo (十六进制) 04 02 00 0A 将输入寄存器 9 的内容表示为两个十六进制字节值 00 0A,或十进制 10。 17 GB/T ××××—×××× 进入 MB 服务器接 收 mb_req_pdu NO 支持的功能码 异常码=01 YES NO 0x0001≤寄存器的数量≤0x007D 异常码=03 YES NO 异常码=02 起始地址==OK 和 起始地址+寄存器数量==OK YES 请求处理 NO 异常码=04 读输入寄存器==OK YES MB 服务器发送 mb_rsp MB 服务器发送 mb_exception_rsp 退出 图 13:读输入寄存器的状态图 6.5 05 (0x05)写单个线圈 在一个远程设备上,使用该功能码写单个输出为 ON 或 OFF。 请求数据域中的常量说明请求的 ON/OFF 状态。十六进制值 FF 00 请求输出为 ON。十六进制值 00 00 请求输出为 OFF。其它所有值均是非法的,并且对输出不起作用。 请求 PDU 说明了强制的线圈地址。从零开始寻址线圈。因此,寻址线圈 1 为 0。线圈值域的常 量说明请求的 ON/OFF 状态。十六进制值 0XFF00 请求线圈为 ON。十六进制值 0X0000 请求线圈为 OFF。其它所有值均为非法的,并且对线圈不起作用。 正常响应是请求的应答,在写入线圈状态之后返回这个正常响应。 18 请求 功能码 输出地址 输出值 响应 功能码 输出地址 输出值 错误 差错码 异常码 1 个字节 2 个字节 2 个字节 1 个字节 2 个字节 2 个字节 1 个字节 1 个字节 GB/T ××××—×××× 0x05 0x0000 至 0xFFFF 0x0000 至 0x00 0x05 0x0000 至 0xFFFF 0x0000 至 0xFF00 0x85 01 或 02 或 03 或 04 这是一个请求写线圈 173 为 ON 的实例: 请求 响应 域名 (十六进制) 域名 功能 输出地址 Hi 输出地址 Lo 输出值 Hi 输出值 Lo 05 功能 00 输出地址 Hi AC 输出地址 Lo FF 输出值 Hi 输出值 Lo 00 (十六进制) 05 00 AC FF 00 19 GB/T ××××—×××× 进入 MB 服务器 接收 mb_req_pdu NO 异常码=01 NO 异常码=03 支持的功能码 YES 输出值=0x0000 或 0xFF00 YES NO 输出地址==OK 异常码=02 YES 请求处理 NO 异常码=04 写单个输出==OK YES MB 服务器发送 mb_rsp MB 服务器发送 mb_exception_rsp 退出 图 14:写单个输出状态图 6.6 06 (0x06)写单个寄存器 在一个远程设备中,使用该功能码写单个保持寄存器。 请求 PDU 说明了被写入寄存器的地址。从零开始寻址寄存器。因此,寻址寄存器 1 为 0。 正常响应是请求的应答,在写入寄存器内容之后返回这个正常响应。 请求 功能码 寄存器地址 寄存器值 1 个字节 2 个字节 2 个字节 0x06 0x0000 至 0xFFFF 0x0000 至 0xFFFF 20 响应 功能码 寄存器地址 寄存器值 错误 差错码 异常码 1 个字节 2 个字节 2 个字节 1 个字节 1 个字节 GB/T ××××—×××× 0x06 0x0000 至 0xFFFF 0x0000 至 0xFFFF 0x86 01 或 02 或 03 或 04 这是一个请求将十六进制 00 03 写入寄存器 2 的实例: 请求 响应 域名 (十六进制) 域名 功能 寄存器地址 Hi 寄存器地址 Lo 寄存器值 Hi 寄存器值 Lo 06 功能 00 输出地址 Hi 01 输出地址 Lo 输出值 Hi 00 输出值 Lo 03 (十六进制) 06 00 01 00 03 21 GB/T ××××—×××× 进入 MB 服务器接 收 mb_req_pdu NO 异常码=01 NO 异常码=03 支持的功能码 YES 0x0000≤寄存器值≤0xFFFF YES NO 寄存器地址==OK 异常码=02 YES 请求处理 NO 异常码=04 MB 服务器发送 mb_exception_rsp 写单个寄存器==OK YES MB 服务器发送 mb_rsp 退出 图 15:写单个寄存器状态图 6.7 15 (0x0F) 写多个线圈 在一个远程设备中,使用该功能码强制线圈序列中的每个线圈为 ON 或 OFF。请求 PDU 说明了 强制的线圈参考。从零开始寻址线圈。因此,寻址线圈 1 为 0。 请求数据域的内容说明了被请求的 ON/OFF 状态。域比特位置中的逻辑“1”请求相应输出为 ON。域比特位置中的逻辑“0”请求相应输出为 OFF。 正常响应返回功能码、起始地址和强制的线圈数量。 22 请求 PDU 功能码 1 个字节 起始地址 2 个字节 输出数量 2 个字节 字节数 1 个字节 输出值 N*×1 个字节 *N=输出数量/8,如果余数不等于 0,那么N = N+1 GB/T ××××—×××× 0x0F 0x0000 至 0xFFFF 0x0001 至 0x07B0 N* 响应 PDU 功能码 起始地址 输出数量 1 个字节 2 个字节 2 个字节 0x0F 0x0000 至 0xFFFF 0x0001 至 0x07B0 错误 差错码 异常码 1 个字节 1 个字节 0x8F 01 或 02 或 03 或 04 这是一个请求从线圈 20 开始写入 10 个线圈的实例: 请求的数据内容为两个字节:十六进制 CD 01 (二进制 1100 1101 0000 0001)。使用下列方法, 二进制比特对应输出。 比特:1 1 0 0 1 1 0 1 0 0 0 0 0 0 0 1 输出:27 26 25 24 23 22 21 20 – – – – – – 29 28 传输的第一字节(十六进制 CD)寻址为输出 27-20,在这种设置中,最低有效比特寻址为最低输 出(20)。 传输的下一字节(十六进制 01)寻址为输出 29-28,在这种设置中,最低有效比特寻址为最低输出 (28)。 应该用零填充最后数据字节中的未使用比特。 请求 响应 域名 (十六进制) 域名 (十六进制) 功能 0F 功能 0F 起始地址 Hi 00 起始地址 Hi 00 起始地址 Lo 13 起始地址 Lo 13 输出数量 Hi 00 输出数量 Hi 00 输出数量 Lo 输出数量 Lo 0A 0A 字节数 输出值 Hi 02 输出值 Lo CD 01 23 GB/T ××××—×××× 进入 MB 服 务器接收 mb_req_pdu NO 支持的功能码 *N=输出数量/8,如果余数 不等于 0,那么 N=N+1 异常码=01 NO 异常码=03 YES 0x0001≤输出数量≤0x07B0 和 字节数=N* NO 异常码=02 YES 起始地址==OK 和 起始地址+输出数量=OK YES 请求处理 NO 异常码=04 写多个输出==OK YES MB 服务器发送 mb_rsp MB 服务器发送 mb_exception_rsp 退出 图 16:写多个输出的状态图 6.8 16 (0x10) 写多个寄存器 在一个远程设备中,使用该功能码写连续寄存器块(1 至约 120 个寄存器)。 在请求数据域中说明了请求写入的值。每个寄存器将数据分成两字节。 正常响应返回功能码、起始地址和被写入寄存器的数量。 24 请求 PDU 功能码 起始地址 寄存器数量 字节数 寄存器值 *N=寄存器数量 响应 PDU 功能码 起始地址 寄存器数量 错误 差错码 异常码 1 个字节 2 个字节 2 个字节 1 个字节 N*×2 个字节 1 个字节