MODBUS协议如何确认上行8583报文39域里的数据域是什么数据

modbus通信协议中的功能码使用以及异常功能码和错误码的使用
Modbus协议主要构成是地址码/标识码,功能码,寄存器地址,数据报文等内容。由于modbus协议是请求/应答通信协议,其其中功能码主要用于表述该数据报文执行的功能,当服务器对客户机进行响应时,它使用功能码域来指示正常响应(无差错)或者异常响应(即出现某种差错),其中的modbus协议的功能码众多,在此我们一一列出与大家分享。
功能码(十六进制)
异常功能码
物理离散量输入
读输入离散量
内部比特或者物理线圈
写单个线圈
写多个线圈
16比特访问
输入存储器
读输入寄存器
内部存储器或物理输出存储器(保持寄存器)
读多个寄存器
写单个寄存器
写多个寄存器
读/写多个寄存器
屏蔽写寄存器
文件记录访问
读文件记录
写文件记录
其中物理离散量输入和输入寄存器只能有I/O系统提供的数据类型,即只能是由I/O系统改变离散量输入和输入寄存器的数值,而上位机程序不能改变的数据类型,在数据读写上表现为只读,而内部比特或者物理线圈和内部寄存器或物理输出寄存器(保持寄存器)则是上位机应用程序可以改变的数据类型,在数据读写上表现为可读可写。
错误代码表
对于服务器(或从站)来说,询问中接收到的功能码是不可允许的操作,可能是因为功能码仅适用于新设备而被选单元中不可实现同时,还指出服务器(或从站)在错误状态中处理这种请求,例如:它是未配置的,且要求返回寄存器值。
非法数据地址
对于服务器(或从站)来说,询问中接收的数据地址是不可允许的地址,特别是参考号和传输长度的组合是无效的。对于带有100个寄存器的控制器来说,偏移量96和长度4的请求会成功,而偏移量96和长度5的请求将产生异常码02。
非法数据值
对于服务器(或从站)来说,询问中包括的值是不可允许的值。该值指示了组合请求剩余结构中的故障。例如:隐含长度是不正确的。modbus协议不知道任何特殊寄存器的任何特殊值的重要意义,寄存器中被提交存储的数据项有一个应用程序期望之外的值。
从站设备故障
当服务器(或从站)正在设法执行请求的操作时,产生不可重新获得的差错。
与编程命令一起使用,服务器(或从站)已经接受请求,并且正在处理这个请求,但是需要长持续时间进行这些操作,返回这个响应防止在客户机(或主站)中发生超时错误,客户机(或主机)可以继续发送轮询程序完成报文来确认是否完成处理。
从属设备忙
与编程命令一起使用,服务器(或从站)正在处理长持续时间的程序命令,当服务器(或从站)空闲时,客户机(或主站)应该稍后重新传输报文。
存储奇偶性差错
与功能码20和21以及参考类型6一起使用,指示扩展文件区不能通过一致性校验。服务器(或从站)设备读取记录文件,但在存储器中发现一个奇偶校验错误。客户机(或主机)可重新发送请求,但可以在服务器(或从站)设备上要求服务。
不可用网关路径
与网关一起使用,指示网关不能为处理请求分配输入端口值输出端口的内部通信路径,通常意味着网关是错误配置的或过载的。
网关目标设备响应失败
与网关一起使用,指示没有从目标设备中获得响应,通常意味着设备未在网络中。
我们以Modbus RTU协议为例,地址码为0x01,写操作0x10,寄存器地址为0x018E,CRC校验。如寄存器可读写的话,返回正常,如寄存器只读,返回异常。
下发指令:01 10 01 8E 00 01 02 00 00 69 BE(向寄存器0x018E写入一个数值为0的数据)
正确回应指令:01 10 01 8E 00 01 60 1E(向寄存器地址0x018E写操作一个寄存器)
错误回应指令:01 90 01 8D C0(写操作非法功能,可能是向输入寄存器写数据)相关内容推荐
about echojb.com爱脚本网(www.echojb.com)为你提供软件编程和硬件技术方面资料,信息,方法,是你完成项目及工作的好帮手。当前位置: >>
Modbus协议说明(优化版)
GB/T ××××―××××前言-----------串行链路和 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 793MODBUS 报 文 传输在串行链路 上的实现指南 45 页串行链路主站/从站IP IETF RFC 791以太网 II/802.3 IEEE 802.2TIA/EIA-232-FTIA/EIA-485-A以太网物理层MODBUS 标准分为三部分。第一部分(“ Modbus 协议规范”)描述了 MODBUS1 GB/T ××××―××××事物处理。第二部分(“MODBUS 报文传输在 TCP/IP 上的实现指南”)提供了一个有 助于开发者实现 TCP/IP 上的 MODBUS 应用层的参考信息。第三部分(“MODBUS 报 文传输在串行链路上的实现指南”)提供了一个有助于开发者实现串行链路上的 MODBUS 应用层的参考信息。2 GB/T ××××―××××第一部分:Modbus 协议3 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-422、 EIA/TIA-485-A;光纤、 各种媒体(有线:EIA/TIA-232-E、 无线等等)上的异步串行传 输。 MODBUS PLUS,一种高速令牌传递网络。MODBUS 应用层基于 TCP 的 Modbus TCP IP其它 其它MODBUS+/HDL 物理层主站/从站 EIA/TIA-232 或 EIA/TIA-485以太网 II/802.3 以太网物理层图 1:MODBUS 通信栈4 GB/T ××××―××××2 缩略语 ADU 应用数据单元 HDLC 高级数据链路控制 HMI 人机界面 IETF 因特网工程工作组 I/O 输入/输出设备 IP 互连网协议 MAC 介质访问控制 MB MODBUS 协议 MBAP MODBUS 协议 PDU 协议数据单元 PLC 可编程逻辑控制器 TCP 传输控制协议 3 背景概要 MODBUS 协议允许在各种网络体系结构内进行简单通信。MODBUS 通信驱动器 PLC HMI I/O I/O PLC I/OMODBUS ON TCP/IP 网关 网关 网关MODBUS ON RS232MODBUS ON RS485MODBUS ON MB+PLC HMI 驱动器PLC I/O I/O 驱动器I/OI/O驱动器图 2:MODBUS 网络体系结构的实例 HMI、 每种设备(PLC、 控制面板、 驱动程序、 动作控制、 输入/输出设备)都能使用 MODBUS 协 议来启动远程操作。 在基于串行链路和以太 TCP/IP 网络的 MODBUS 上可以进行相同通信。 一些网关允许在几种使用 MODBUS 协议的总线或网络之间进行通信。5 GB/T ××××―××××4 总体描述 4.1 协议描述MODBUS 协议定义了一个与基础通信层无关的简单协议数据单元(PDU)。 特定总线或网络上 的 MODBUS 协议映射能够在应用数据单元(ADU)上引入一些附加域。ADU 地址域 功能码 PDU图 3:通用 MODBUS 帧 启动 MODBUS 事务处理的客户机创建 MODBUS 应用数据单元。功能码向服务器指示将执行哪 种操作。 MODBUS 协议建立了客户机启动的请求格式。 用一个字节编码 MODBUS 数据单元的功能码域。有效的码字范围是十进制 1-255(128-255 为 异常响应保留)。当从客户机向服务器设备发送报文时,功能码域通知服务器执行哪种操作。 向一些功能码加入子功能码来定义多项操作。 从客户机向服务器设备发送的报文数据域包括附加信息,服务器使用这个信息执行功能码定义 的操作。这个域还包括离散项目和寄存器地址、处理的项目数量以及域中的实际数据字节数。 在某种请求中,数据域可以是不存在的( 0 长度),在此情况下服务器不需要任何附加信息。 功能码仅说明操作。 如果在一个正确接收的 MODBUS ADU 中,不出现与请求 MODBUS 功能有关的差错,那么服 务器至客户机的响应数据域包括请求数据。 如果出现与请求 MODBUS 功能有关的差错,那么域包括 一个异常码,服务器应用能够使用这个域确定下一个执行的操作。 例如,客户机能够读一组离散量输出或输入的开 /关状态,或者客户机能够读/写一组寄存器的 数据内容。 当服务器对客户机响应时,它使用功能码域来指示正常(无差错)响应或者出现某种差错(称 为异常响应)。对于一个正常响应来说,服务器仅对原始功能码响应。客户机 服务器数据差错校验启动请求功能码数据请求执行操作 启动响应接收响应 操作码 数据响应图 4:MODBUS 事务处理(无差错) 对于异常响应,服务器返回一个与原始功能码等同的码,设置该原始功能码的最高有效位为逻 辑 1。6 GB/T ××××―××××客户机服务器启动请求功能码数据请求在操作中检测的差错 启动差错接收响应 差错码 异常码图 5 MODBUS 事务处理(异常响应) ??注释:需要管理超时,以便明确地等待可能不会出现的应答。 串 行 链 路 上 第 一 个 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。它们是: ? MODBUS 请求 PDU,mb_req_pdu ? MODBUS 响应 PDU,mb_rsp_pdu ? 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 数据编码 ? MODBUS 使用一个‘big-Endian’ 表示地址和数据项。 这意味着当发射多个字节时,首先发送最高有效位。例如: 寄存器大小 值7 GB/T ××××―××××0x1234 发送的第一字节为 ??注释:更详细的信息参见[1]。 4.3 MODBUS 数据模型16 C 比特0x12 然后 0x34MODBUS 以一系列具有不同特征表格上的数据模型为基础。四个基本表格为:基本表格 离散量输入 线圈 输入寄存器 保持寄存器 对象类型 单个比特 单个比特 16-比特字 16-比特字 访问类型 只读 读写 只读 读写 内容 I/O 系统提供这种类型数据 通过应用程序改变这种类型数据 I/O 系统提供这种类型数据 通过应用程序改变这种类型数据输入与输出之间以及比特寻址的和字寻址的数据项之间的区别并没有暗示任何应用操作。如果 这是对可疑对象核心部分最自然的解释,那么这种区别是可完全接受的,而且很普通,以便认为四 个表格全部覆盖了另外一个表格。 对于基本表格中任何一项,协议都允许单个地选择 65536 个数据项,而且设计那些项的读写操 作可以越过多个连续数据项直到数据大小规格限制,这个数据大小规格限制与事务处理功能码有关。 很显然,必须将通过 MODBUS 处理的所有数据放置在设备应用存储器中。 但是,存储器的物理 地址不应该与数据参考混淆。要求仅仅是数据参考与物理地址的链接。 MODBUS 功能码中使用的 MODBUS 逻辑参考数字是以 0 开始的无符号整数索引。 ? MODBUS 模型实现的实例 下例实例示出了两种在设备中构造数据的方法。可能有不同的结构,这个文件中没有全部描述 出来。每个设备根据其应用都有它自己的数据结构。 实例 1:有 4 个独立块的设备 下例实例示出了设备中的数据结构,这个设备含有数字量和模拟量、 输入量和输出量。 由于不同 块中的数据不相关,每个块是相互独立。按不同 MODBUS 功能码访问每个块。8 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 事务处理的一般处理过程。9 GB/T ××××―××××等待 MB 指示[接收 MB 指示] 确认操作码异常码_1[无效的] [有效的] 确认数据地址 [无效的]异常码_2[有效的] 确认数据值异常码_3[无效的] [有效的] 执行 MB 操作 [无效的]异常码_4_5_6发 送 Modbus 异常响应[有效的] 发 送 Modbus 响应图 8:MODBUS 事务处理的状态图 一旦服务器处理请求,使用合适的 MODBUS 服务器事务建立 MODBUS 响应。 根据处理结果,可以建立两种类型响应: ? 一个正 MODBUS 响应: ● 响应功能码 = 请求功能码 ? 一个 MODBUS 异常响应(参见第 6.14 节): ? 用来为客户机提供处理过程中与被发现的差错相关的信息; ? 响应功能码 = 请求功能码 + 0x80; ? 提供一个异常码来指示差错原因。 5 功能码分类 有三类 MODBUS 功能码。它们是: 公共功能码 ? 是较好地被定义的功能码, ? 保证是唯一的, ? MODBUS 组织可改变的, ? 公开证明的, ? 具有可用的一致性测试, ? MB IETF RFC 中证明的,10 GB/T ××××―××××包含已被定义的公共指配功能码和未来使用的未指配保留供功能码。 用户定义功能码 ? 有两个用户定义功能码的定义范围,即 65 至 72 和十进制 100 至 110。 ? 用户没有 MODBUS 组织的任何批准就可以选择和实现一个功能码 ? 不能保证被选功能码的使用是唯一的。 ? 如果用户要重新设置功能作为一个公共功能码,那么用户必须启动 RFC,以便将改变引入 公共分类中,并且指配一个新的公共功能码。 保留功能码 ? 一些公司对传统产品通常使用的功能码,并且对公共使用是无效的功能码。?127 110 100公共功能码用户定义功能码 公共功能码72 65用户定义功能码 公共功能码1 1图 9:MODBUS 功能码分类11 GB/T ××××―××××5.1公共功能码定义 功能码 物理 离散 量输入 内部比特 或 物理线圈 输入 存储 器 16 比 特 访 问 内部 存储 器 或 物理输出 存储器 读输入离散量 读线圈 写单个线圈 写多个线圈 读输入寄存器 读多个寄存器 写单个寄存器 写多个寄存器 读/写多个寄存 器 屏蔽写寄存器 读文件记录 写文件记录 读设备识别码 码 02 01 05 15 04 03 06 16 23 22 20 21 43 6 6 14 子码 (十六进制) 02 01 05 0F 04 03 06 10 17 16 14 15 2B 页 11 10 16 37 14 13 17 39 47 46 42 44比特访问 数 据 访 问文件记录访问 封装接口12 GB/T ××××―××××6 功能码描述 6.1 01 (0x01)读线圈在一个远程设备中,使用该功能码读取线圈的 1 至 2000 连续状态。请求 PDU 详细说明了起始 地址,即指定的第一个线圈地址和线圈编号。从零开始寻址线圈。因此寻址线圈 1-16 为 0-15。 根据数据域的每个比特将响应报文中的线圈分成为一个线圈。指示状态为 1= ON 和 0= OFF。第 一个数据字节的 LSB(最低有效位)包括在询问中寻址的输出。其它线圈依次类推,一直到这个字 节的高位端为止,并在后续字节中从低位到高位的顺序。 如果返回的输出数量不是八的倍数,将用零填充最后数据字节中的剩余比特(一直到字节的高 位端)。字节数量域说明了数据的完整字节数。 请求 PDU功能码 起始地址 线圈数量 1 个字节 2 个字节 2 个字节 0x01 0x0000 至 0xFFFF 1 至 D0)响应 PDU *N=输出数量/8,如果余数不等于 0,那么?N = N+1功能码 字节数 线圈状态 1 个字节 1 个字节 N 个字节 0x01 N* n=N 或 N+1错误 功能码 异常码1 个字节 1 个字节功能码+0x80 01 或 02 或 03 或 04这是一个请求读离散量输出 20-38 的实例: 请求 域名 (十六进制) 01 功能 00 起始地址 Hi 13 起始地址 Lo 00 输出数量 Hi 13 输出数量 Lo响应 域名 功能 字节数 输出状态 27-20 输出状态 35-28 输出状态 38-36(十六进制) 01 03 CD 6B 05将输出 27-20 的状态表示为十六进制字节值 CD ,或二进制
。输出 27 是这个字节的 MSB,输出 20 是 LSB。 通常,将一个字节内的比特表示为 MSB 位于左侧,LSB 位于右侧。 第一字节的输出从左至右为 27 至 20。 下一个字节的输出从左到右为 35 至 28。 当串行发射比特时,从 LSB 向 MSB 传输: 20 . . . 27、28 . . . 35 等等。13 GB/T ××××―××××在最后的数据字节中,将输出状态 38-36 表示为十六进制字节值 05,或二进制 。输出 38 是左侧第六个比特位置,输出 36 是这个字节的 LSB。用零填充五个剩余高位比特。 注:用零填充五个剩余比特(一直到高位端)。14 GB/T ××××―××××进入 MB 服务器接 收 mb_req_pduNO 支持的功能码 异常码=01 NO 0x0001≤输出数量≤0x07D0 异常码=03 NO YES 起始地址==OK 和 起始地址+输出数量==OK YES 请求处理 YES异常码=02NO 读取离散输出==OK 异常码=04 YES MB 服务器发送 mb_rspMB 服务器发送 mb_exception_rsp图 10:读取线圈状态图 6.2 02 (0x02)读离散量输入退出在一个远程设备中,使用该功能码读取离散量输入的 1 至 2000 连续状态。请求 PDU 详细说明 了起始地址,即指定的第一个输入地址和输入编号。 从零开始寻址输入。 因此寻址输入 1-16 为 0-15。 根据数据域的每个比特将响应报文中的离散量输入分成为一个输入。指示状态为 1= ON 和 0= OFF。 第一个数据字节的 LSB(最低有效位)包括在询问中寻址的输入。 其它输入依次类推,一直到 这个字节的高位端为止,并在后续字节中从低位到高位的顺序。 如果返回的输入数量不是八的倍数,将用零填充最后数据字节中的剩余比特(一直到字节的高 位端)。字节数量域说明了数据的完整字节数。15 GB/T ××××―××××请求 PDU功能码 起始地址 输入数量 1 个字节 2 个字节 2 个字节 0x02 0x0000 至 0xFFFF 1 至 D0)响应 PDU功能码 字节数 输入状态 1 个字节 1 个字节 N*×1 个字节 0x82 N**N=输出数量/8,如果余数不等于 0,那么?N = N+1 错误差错码 异常码 1 字节 1 字节 0x82 01 或 02 或 03 或 04这是一个请求读取离散量输入 197-218 的实例:请求 域名 功能 起始地址 Hi 起始地址 Lo 输出数量 Hi 输出数量 Lo (十六进制) 02 00 C4 00 16 响应 域名 功能 字节数 输入状态 204-197 输入状态 212-205 输入状态 218-213 (十六进制) 02 03 AC DB 35将离散量输入状态 204-197 表示为十六进制字节值 AC,或二进制 。 输入 204 是这个字 节的 MSB,输入 197 是这个字节的 LSB。 将离散量输入状态 218-213 表示为十六进制字节值 35,或二进制 。输入 218 位于左侧 第 3 比特,输入 213 是 LSB。 注:用零填充 2 个剩余比特(一直到高位端)。16 GB/T ××××―××××进入 MB 服务器接 收 mb_req_pduNO 支持的功能码 异常码=01 NO 0x0001≤输入数量≤0x07D0 异常码=03 NO YES 起始地址==OK 和 起始地址+输入数量==OK YES 请求处理 YES异常码=02NO 读取离散输入==OK 异常码=04 YES MB 服务器发送 mb_rspMB 服务器发送 mb_exception_rsp退出图 11:读离散量输入的状态图6.303 (0x03)读保持寄存器在一个远程设备中,使用该功能码读取保持寄存器连续块的内容。 请求 PDU 说明了起始寄存器 地址和寄存器数量。从零开始寻址寄存器。因此,寻址寄存器 1-16 为 0-15。 将响应报文中的寄存器数据分成每个寄存器有两字节,在每个字节中直接地调整二进制内容。 对于每个寄存器,第一个字节包括高位比特,并且第二个字节包括低位比特。 请求功能码 起始地址 寄存器数量 1 个字节 2 个字节 2 个字节 0x03 0x0000 至 0xFFFF 1 至 125(0x7D)响应17 GB/T ××××―×××× 功能码 字节数 寄存器值 1 个字节 1 个字节 N*×2 个字节 0x03 2×N**N=寄存器的数量 错误差错码 异常码 1 个字节 1 个字节 0x83 01 或 02 或 03 或 04这是一个请求读寄存器 108-110 的实例:请求 域名 功能 高起始地址 低起始地址 高寄存器编号 低寄存器编号 (十六进制) 03 00 6B 00 03 响应 域名 功能 字节数 寄存器值 Hi(108) 寄存器值 Lo(108) 寄存器值 Hi(109) 寄存器值 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。18 GB/T ××××―××××进入 MB 服务器接 收 mb_req_pduNO 支持的功能码 异常码=01 NO 0x0001≤寄存器数量≤0x007D 异常码=03 NO YES 起始地址==OK 和 起始地址+寄存器数量==OK YES 请求处理 YES异常码=02NO 读多个寄存器==OK 异常码=04 YES MB 服务器发送 mb_rspMB 服务器发送 mb_exception_rsp退出图 12:读保持寄存器的状态图 6.4 04(0x04)读输入寄存器在一个远程设备中,使用该功能码读取 1 至大约 125 的连续输入寄存器。请求 PDU 说明了起始 地址和寄存器数量。从零开始寻址寄存器。因此,寻址输入寄存器 1-16 为 0-15。 将响应报文中的寄存器数据分成每个寄存器为两字节,在每个字节中直接地调整二进制内容。 对于每个寄存器,第一个字节包括高位比特,并且第二个字节包括低位比特。 请求功能码 起始地址 输入寄存器数量 1 个字节 2 个字节 2 个字节 0x04 0x0000 至 0xFFFF 0x0001 至 0x007D响应19 GB/T ××××―×××× 功能码 字节数 输入寄存器 1 个字节 1 个字节 N*×2 个字节 0x04 2×N**N=输入寄存器的数量 错误差错码 异常码 1 个字节 1 个字节 0x84 01 或 02 或 03 或 04这是一个请求读输入寄存器 9 的实例:请求 域名 功能 起始地址 Hi 起始地址 Lo 输入寄存器数量 Hi 输入寄存器数量 Lo (十六进制) 04 00 08 00 01 响应 域名 功能 字节数 输入寄存器 9 Hi 输入寄存器 9 Lo (十六进制) 04 02 00 0A将输入寄存器 9 的内容表示为两个十六进制字节值 00 0A,或十进制 10。20 GB/T ××××―××××进入 MB 服务器接 收 mb_req_pduNO 支持的功能码 异常码=01 NO 0x0001≤寄存器的数量≤0x007D 异常码=03 NO YES 起始地址==OK 和 起始地址+寄存器数量==OK 异常码=02 YES 请求处理 YESNO 读输入寄存器==OK 异常码=04 YES MB 服务器发送 mb_rspMB 服务器发送 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 。其它所有值均为非法的,并且对线圈不起作用。 正常响应是请求的应答,在写入线圈状态之后返回这个正常响应。21 GB/T ××××―××××请求功能码 输出地址 输出值 1 个字节 2 个字节 2 个字节 0x05 0x0000 至 0xFFFF 0x0000 至 0x00响应功能码 输出地址 输出值 1 个字节 2 个字节 2 个字节 0x05 0x0000 至 0xFFFF 0x0000 至 0xFF00错误差错码 异常码 1 个字节 1 个字节 0x85 01 或 02 或 03 或 04这是一个请求写线圈 173 为 ON 的实例:请求 域名 功能 输出地址 Hi 输出地址 Lo 输出值 Hi 输出值 Lo (十六进制) 05 00 AC FF 00 响应 域名 功能 输出地址 Hi 输出地址 Lo 输出值 Hi 输出值 Lo (十六进制) 05 00 AC FF 0022 GB/T ××××―××××进入 MB 服务器接 收 mb_req_pduNO 支持的功能码 异常码=01 NO 输出值=0x0000 或 0xFF00 异常码=03 NO 输出地址==OK 异常码=02 YES YESYES 请求处理NO 写单个输出==OK 异常码=04 YES MB 服务器发送 mb_rspMB 服务器发送 mb_exception_rsp退出图 14:写单个输出状态图 6.6 06 (0x06)写单个寄存器 在一个远程设备中,使用该功能码写单个保持寄存器。 请求 PDU 说明了被写入寄存器的地址。从零开始寻址寄存器。因此,寻址寄存器 1 为 0。 正常响应是请求的应答,在写入寄存器内容之后返回这个正常响应。 请求功能码 寄存器地址 寄存器值 1 个字节 2 个字节 2 个字节 0x06 0x0000 至 0xFFFF 0x0000 至 0xFFFF响应23 GB/T ××××―×××× 功能码 寄存器地址 寄存器值 1 个字节 2 个字节 2 个字节 0x06 0x0000 至 0xFFFF 0x0000 至 0xFFFF错误差错码 异常码 1 个字节 1 个字节 0x86 01 或 02 或 03 或 04这是一个请求将十六进制 00 03 写入寄存器 2 的实例:请求 域名 功能 寄存器地址 Hi 寄存器地址 Lo 寄存器值 Hi 寄存器值 Lo (十六进制) 06 00 01 00 03 响应 域名 功能 输出地址 Hi 输出地址 Lo 输出值 Hi 输出值 Lo (十六进制) 06 00 01 00 0324 GB/T ××××―××××进入 MB 服务器接 收 mb_req_pduNO 支持的功能码 异常码=01 NO 0x0000≤寄存器值≤0xFFFF 异常码=03 NO 寄存器地址==OK 异常码=02 YES 请求处理 YES YESNO 写单个寄存器==OK 异常码=04 YES MB 服务器发送 mb_rspMB 服务器发送 mb_exception_rsp退出图 15:写单个寄存器状态图 6.7 15 (0x0F) 写多个线圈在一个远程设备中,使用该功能码强制线圈序列中的每个线圈为 ON 或 OFF。请求 PDU 说明了 强制的线圈参考。从零开始寻址线圈。因此,寻址线圈 1 为 0。 请求数据域的内容说明了被请求的 ON/OFF 状态。 域比特位置中的逻辑“1”请求相应输出为 ON 。域比特位置中的逻辑“0”请求相应输出为 OFF。 正常响应返回功能码、起始地址和强制的线圈数量。25 GB/T ××××―××××请求 PDU功能码 起始地址 输出数量 字节数 输出值 1 个字节 2 个字节 2 个字节 1 个字节 N*×1 个字节 0x0F 0x0000 至 0xFFFF 0x0001 至 0x07B0 N**N=输出数量/8,如果余数不等于 0,那么?N = N+1 响应 PDU功能码 起始地址 输出数量 1 个字节 2 个字节 2 个字节 0x0F 0x0000 至 0xFFFF 0x0001 至 0x07B0错误差错码 异常码 1 个字节 1 个字节 0x8F 01 或 02 或 03 或 04这是一个请求从线圈 20 开始写入 10 个线圈的实例: 请求的数据内容为两个字节:十六进制 CD 01 (二进制 00 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 C C C C C C 29 28 传输的第一字节(十六进制 CD)寻址为输出 27-20,在这种设置中,最低有效比特寻址为最低输 出(20)。 传输的下一字节(十六进制 01)寻址为输出 29-28,在这种设置中,最低有效比特寻址为最低输 出(28)。 应该用零填充最后数据字节中的未使用比特。请求 域名 功能 起始地址 Hi 起始地址 Lo 输出数量 Hi 输出数量 Lo 字节数 输出值 Hi 输出值 Lo (十六进制) 0F 00 13 00 0A 02 CD 01 响应 域名 功能 起始地址 Hi 起始地址 Lo 输出数量 Hi 输出数量 Lo (十六进制) 0F 00 13 00 0A26 GB/T ××××―××××进入 MB 服务器接 收 mb_req_pdu *N=输出数量/8, 如果余数 0 N=N+1 不等于 ,那么NO 支持的功能码 异常码=01 NO 异常码=03 NO YES0x0001≤输出数量≤0x07B0 和 字节数=N* YES 起始地址==OK 和 起始地址+输出数量=OK YES 请求处理 NO 写多个输出==OK 异常码=04 YES MB 服务器发送 mb_rsp异常码=02MB 服务器发送 mb_exception_rsp退出图 16:写多个输出的状态图6.816 (0x10) 写多个寄存器 在一个远程设备中,使用该功能码写连续寄存器块(1 至约 120 个寄存器)。 在请求数据域中说明了请求写入的值。每个寄存器将数据分成两字节。 正常响应返回功能码、起始地址和被写入寄存器的数量。27 GB/T ××××―××××请求 PDU功能码 起始地址 寄存器数量 字节数 寄存器值 1 个字节 2 个字节 2 个字节 1 个字节 N*×2 个字节 0x10 0x0000 至 0xFFFF 0x0001 至 0x0078 2×N* 值*N=寄存器数量 响应 PDU功能码 起始地址 寄存器数量 1 个字节 2 个字节 2 个字节 0x10 0x0000 至 0xFFFF 1 至 123(0x7B)错误差错码 异常码 1 个字节 1 个字节 0x90 01 或 02 或 03 或 04这是一个请求将十六进制 00 0A 和 01 02 写入以 2 开始的两个寄存器的实例:请求 域名 功能 起始地址 Hi 起始地址 Lo 寄存器数量 Hi 寄存器数量 Lo 字节数 寄存器值 Hi 寄存器值 Lo 寄存器值 Hi 寄存器值 Lo (十六进制) 10 00 01 00 02 04 00 0A 01 02 响应 域名 功能 起始地址 Hi 起始地址 Lo 寄存器数量 Hi 寄存器数量 Lo (十六进制) 10 00 01 00 0228 GB/T ××××―××××进入 MB 服务器接 收 mb_req_pduNO 支持的功能码 异常码=01 NO 异常码=03 NO YES 0x0001≤寄存器数量≤0x007B 和 字节数=寄存器数 x2 YES 初始地址==OK 和 初始地址+寄存器数量=OK 异常码=02 YES 请求处理 NO 写多个寄存器==OK 异常码=04 YES MB 服务器发送 mb_rspMB 服务器发送 mb_exception_rsp退出图 17:写多个寄存器状态图6.920 (0x14) 读文件记录使用该功能码进行文件记录读取。根据字节数量提供所有请求数据长度,并且根据寄存器提供 所有记录长度。 文件是记录的结构。每个文件包括 10000 个记录,寻址这些记录为十进制 0000 至 9999 或十六 进制 0X0000 至 0X270F,例如寻址记录 12 为 12。 该功能可以读取多个参考组。 这些组可以是分散的(不连续的),但每组中的参考必须是连续的。 用含有 7 个字节的独立“子请求”域定义每个组: 参考类型:1 个字节(必须规定为 6) 文件号:2 个字节29 GB/T ××××―××××文件中的起始记录号:2 个字节 被读出的记录长度:2 个字节 被读取的寄存器数量不能超过 MODBUS 报文允许的长度: 256 个字节,这个寄存器数量与预 期响应中的所有其它域组合。 正常响应是一系列“子响应”,与“子请求”一一对应。字节数域是所有“子响应”中的全部 组合字节数。另外,每个“子响应”都包括一个表示自身字节数的域。 请求 PDU功能码 字节数 子请求 x,参考类型 子请求 x,文件号 子请求 x,记录号 子请求 x,记录长度 子请求 x+1,… 1 个字节 1 个字节 1 个字节 2 个字节 2 个字节 2 个字节 0x14 0x07 至 0xF5 字节 06 0x0000 至 0xFFFF 0x0000 至 0x270F N响应 PDU功能码 响应数据长度 子请求 x,文件响应长度 子请求 x,参考类型 子请求 x,记录数据 子请求 x+1,… 1 个字节 1 个字节 1 个字节 1 个字节 N×2 个字节 0x14 0x07 至 0xF5 0x07 至 0xF5 6错误差错码 异常码 1 个字节 1 个字节 0x94 01 或 02 或 03 或 04 或 08这是一个请求从远程设备读取两个参考组的实例: 组 1 包括文件 4 中的 2 个寄存器,以寄存器 1 开始(地址 0001)。 组 2 包括文件 3 中的 2 个寄存器,以寄存器 9 开始(地址 0009)。请求 域名 功能 字节数 子请求 1,参考类型 子请求 1,文件号 Hi 子请求 1,文件号 Lo 子请求 1,记录号 Hi 子请求 1,纪录号 Lo 子请求 1,记录长度 Hi 子请求 1,纪录长度 Lo 子请求 2,参考类型 子请求 2,文件号 Hi 子请求 2,文件号 Lo 子请求 2,记录号 Hi 子请求 2,纪录号 Lo 子请求 2,记录长度 Hi 30 (十六进制) 14 0C 06 00 04 00 01 00 02 06 00 03 00 09 00 响应 域名 功能 响应数据长度 子请求 1,文件响应长度 子请求 1,参考类型 子请求 1,纪录数据 Hi 子请求 1,纪录数据 Lo 子请求 1,纪录数据 Hi 子请求 1,纪录数据 Lo 子请求 2,文件响应长度 子请求 2,参考类型 子请求 2,纪录数据 Hi 子请求 2,纪录数据 Lo 子请求 2,纪录数据 Hi 子请求 2,纪录数据 Lo (十六进制) 14 0E 05 06 0D FE 00 20 05 06 33 CD 00 40 GB/T ××××―×××× 子请求 2,纪录长度 Lo 02进入 MB 服务器接 收 mb_req_pduNO 支持的功能码 异常码=01 NO YES 0x07≤字节数≤0xF5 YES NO 参考类型==OK 和 文件号=OK 和 起始地址=OK 和 + 起始地址 寄存器数=OK 对每个子请求异常码=03异常码=02YES 请求处理 NO 读通用参考==OK 异常码=04 YES MB 服务器发送 mb_rspMB 服务器发送 mb_exception_rsp退出图 18:读文件记录状态图 6.9.1 21 (0x15) 写文件记录使用该功能码进行文件记录写入。 根据字节数量提供所有请求数据长度,并且根据 16 比特字的 数量提供所有记录长度。 文件是记录的结构。每个文件包括 10000 个记录,寻址这些记录为十进制 0000 至 9999 或十六 进制 0X0000 至 0X270F,例如寻址记录 12 为 12。 该功能可以写多个参考组。 这些组可以是分散的,即不连续的,但每组内的参考必须是连续的。 用含有 7 个字节和数据的独立“子请求”域定义每个组:31 GB/T ××××―××××参考类型:1 个字节(必须规定为 6) 文件号:2 个字节 文件中的起始记录号:2 个字节 被写入的记录长度:2 个字节 被写入的数据:每个寄存器为 2 字节。 被写入的寄存器数量不能超过 MODBUS 报文允许的长度: 256 个字节,这个寄存器数量与询 问中的所有其它域组合。 正常响应是请求的应答。 请求 PDU功能码 请求数据长度 子请求 x,参考类型 子请求 x,文件号 子请求 x,记录号 子请求 x,记录长度 子请求 x,记录数据 子请求 x+1,… 1 个字节 1 个字节 1 个字节 2 个字节 2 个字节 2 字节 N×2 个字节 0x14 0x07 至 0xF5 06 0x0000 至 0xFFFF 0x0000 至 0x270F N响应 PDU功能码 响应数据长度 子请求 x,参考类型 子请求 x,文件号 子请求 x,记录号 子请求 x,记录长度 子请求 x,记录数据 子请求 x+1,… 1 个字节 1 个字节 1 个字节 2 个字节 2 个字节 2 个字节 N×2 个字节 0x15 06 0x0000 至 0xFFFF 0x0000 至 0xFFFF 0x0000 至 0xFFFF N错误差错码 异常码 1 个字节 1 个字节 0x95 01 或 02 或 03 或 04 或 08这是一个请求将一个参考组写入远程设备的实例:组包括文件 4 中的 3 个寄存器,以寄存器 7 开始(地址 0007)。请求 域名 功能 请求数据长度 子请求 1,参考类型 子请求 1,文件号 Hi 子请求 1,文件号 Lo 32 (十六进制) 15 0D 06 00 04 响应 域名 功能 请求数据长度 子请求 1,参考类型 子请求 1,文件号 Hi 子请求 1,文件号 Lo (十六进制) 15 0D 06 00 04 GB/T ××××―×××× 子请求 1,记录号 Hi 子请求 1,纪录号 Lo 子请求 1,记录长度 Hi 子请求 1,纪录长度 Lo 子请求 1,记录数据 Hi 子请求 1,记录数据 Lo 子请求 1,记录数据 Hi 子请求 1,记录数据 Lo 子请求 1,记录数据 Hi 子请求 1,寄存器数据 Lo 00 07 00 03 06 AF 04 BE 10 0D 子请求 1,记录号 Hi 子请求 1,纪录号 Lo 子请求 1,记录长度 Hi 子请求 1,纪录长度 Lo 子请求 1,记录数据 Hi 子请求 1,记录数据 Lo 子请求 1,记录数据 Hi 子请求 1,记录数据 Lo 子请求 1,记录数据 Hi 子请求 1,寄存器数据 Lo 00 07 00 03 06 AF 04 BE 10 0D进入 MB 服务器 得到 mb_req_pduNO 支持的功能码 异常码=01 NO YES 0x07≤字节数≤0xF5 YES 异常码=03 NO 参考类型==OK 和 文件号=OK 和 起始地址=OK 和 起始地址+寄存器数=OK 对每个子请求异常码=02YES 请求处理 NO 写入通用参考==OK 异常码=04 YES MB 服务器发送 mb_rspMB 服务器发送 mb_exception_rsp退出图 19:写文件记录状态图33 GB/T ××××―××××6.1022 (0x16) 屏蔽写寄存器该功能码用于通过利用 AND 屏蔽、OR 屏蔽以及寄存器内容的组合来修改特定保持寄存器的内 容。使用这个功能设置或清除寄存器中的单个比特。 请求说明了被写入的保持寄存器、AND 屏蔽使用的数据以及 OR 屏蔽使用的数据。 从 0 开始寻址寄存器。因此,寻址寄存器 1-16 为 0-15。 功能的算法为: 结果= (当前内容 AND And_Mask) OR (Or_Mask AND And_Mask) 例如: 当前内容 = And_Mask = Or_Mask = And_Mask = 结果=注: 如果 Or_Mask 值为零,那么结果是当前内容和 And_Mask 的简单逻辑 AND(与)。如果 And_Mask 值为 零,结果等于 Or_Mask 值。 可以使用读保持寄存器功能(功能码 03)读出寄存器的内容。于是,当控制器扫描它的用户逻辑程序时 , 随后可以改变寄存器的内容。十六进制 12 F2 25 0D 17二进制 11 01 01 0111正常的响应是请求的应答。在已经写入寄存器之后,返回响应。 请求 PDU功能码 参考地址 And_Mask Or_Mask 1 个字节 2 个字节 2 个字节 2 个字节 0x16 0x0000 至 0xFFFF 0x0000 至 0xFFFF 0x0000 至 0xFFFF响应 PDU功能码 参考地址 And_Mask Or_Mask 1 个字节 2 个字节 2 个字节 2 个字节 0x16 0x0000 至 0xFFFF 0x0000 至 0xFFFF 0x0000 至 0xFFFF错误差错码 异常码 1 个字节 1 个字节 0x96 01 或 02 或 03 或 04这是一个利用上述屏蔽值在远程设备中对寄存器 5 的屏蔽写入实例。请求 域名 功能 (十六进制) 16 响应 域名 功能 (十六进制) 1634 GB/T ××××―×××× 参考地址 Hi 参考地址 Lo And_Mask Hi And_Mask Or_Mask Hi Or_Mask 00 04 00 F2 00 25 参考地址 Hi 参考地址 And_Mask Hi And_Mask Or_Mask Hi Or_Mask 00 04 00 F2 00 25进入 MB 服务器 得到 mb_req_pduNO 支持的功能码 异常码=01 NO 参考地址==OK 异常码=03 NO YES YESAnd_Mask==OK和 异常码=02Or_Mask=OKYES 请求处理 NO 屏蔽写寄存器==OK异常码=04YES MB 服务器发送 mb_rspMB 服务器发送 mb_exception_rsp退出图 20:屏蔽写保持寄存器状态图 6.11 23 (0x17) 读/写多个寄存器在一个单独 MODBUS 事务中,这个功能码实现了一个读操作和一个写操作的组合。 从零开始寻址保持寄存器。因此,寻址保持寄存器 1-16 为 0-15。35 GB/T ××××―××××请求说明了起始地址、 被读取的保持寄存器号和起始地址、 保持寄存器号以及被写入的数据。 在 写数据域中,字节数说明随后的字节号。 正常响应包括被读出的寄存器组的数据。在读数据域中,字节数域说明随后的字节数量。 请求 PDU功能码 读起始地址 读的数量 写起始地址 写的数量 写字节数 写寄存器值 1 个字节 2 个字节 2 个字节 2 个字节 2 个字节 1 个字节 N*×2 个字节 0x17 0x0000 至 0xFFFF 0x0001 至近似 0x0 至 0xFFFF 0x0001 至近似 0x0076 2×N**N=写的数量 响应 PDU功能码 字节数 读寄存器值 1 个字节 1 个字节 N*×2 个字节 0x17 2×N**N=读的数量 错误差错码 异常码 1 个字节 1 个字节 0x97 01 或 02 或 03 或 04这是一个请求从寄存器 4 开始读六个寄存器并且从寄存器 15 开始读三个寄存器的实例:请求 域名 功能 读起始地址 Hi 读起始地址 Lo 读的数量 Hi 读的数量 Lo 写起始地址 Hi 写起始地址 Lo 写的数量 Hi 写的数量 Lo 写字节数 写寄存器值 Hi 写寄存器值 Lo 写寄存器值 Hi 写寄存器值 Lo 写寄存器值 Hi 写寄存器值 Lo (十六进制) 17 00 03 00 06 00 0E 00 03 06 00 FF 00 FF 00 FF 响应 域名 功能 字节数 读寄存器值 Hi 读寄存器值 Lo 读寄存器值 Hi 读寄存器值 Lo 读寄存器值 Hi 读寄存器值 Lo 读寄存器值 Hi 读寄存器值 Lo 读寄存器值 Hi 读寄存器值 Lo 读寄存器值 Hi 读寄存器值 Lo (十六进制) 17 0C 00 FE 0A CD 00 01 00 03 00 0D 00 FF36 GB/T ××××―××××进入 MB 服务器接 收 mb_req_pduNO 支持的功能码 异常码=01 YESNO0x0001≤读的数量≤0x007D 和 0x0001≤写的数量≤0x0079 和 字节数=写的数量 x2异常码=03YES 读起始地址==OK 和 读起始地址+读的数量==OK 和 写起始地址==OK 和 写起始地址+写的数量==OK YES 请求处理 NO 读/写多个寄存器==OK 异常码=04 YES MB 服务器发送 mb_rspNO异常码=02MB 服务器发送 mb_exception_rsp退出图 21:读/写多个寄存器状态图37 GB/T ××××―××××6.1243 (0x2B)读设备识别码这个功能码允许读取与远程设备的物理描述和功能描述相关的识别码和附加报文。 将读设备识别码接口模拟为一个地址空间,这个地址空间由一组可寻址数据元素组成。数据元 素是被叫对象,并且对象 Id 确定这个数据元素。 接口由 3 种对象组成: ? 基本设备识别码。所有此种对象都是必备的:厂商名称、产品代码和修订本号。 ? 正常设备识别码。除基本数据对象以外,设备提供了附加的和可选择的识别码以及数据对 象描述。按标准定义所有种类的对象,但是这种对象的执行是可选的。 ? 扩展设备识别码。除正常数据对象以外,设备提供了附加的和可选的识别码以及专用数据 描述。所有这些数据都是与设备有关的。对象 Id 0x00 0x01 0x02 0x03 0x04 0x05 0x06 0x07 … 0x7F 0x80 … 0xFF 可选择地定义专用对象 范围[0x80―0xFF]与产品有关 相关设备 可选的 扩展 对象名称/描述 厂商名称 产品代码 主要修订本 VendorUrl 产品名称 模式名称 用户应用名称 保留 类型 ASCII 字符串 ASCII 字符串 ASCII 字符串 ASCII 字符串 ASCII 字符串 ASCII 字符串 ASCII 字符串 M/O 强制的 强制的 强制的 可选的 可选的 可选的 可选的 可选的 种类 基本规则请求 PDU功能码 MEI 类型 1 个字节 1 个字节 1 个字节 1 个字节 0x2B 0x0E 01/02/03/04 0x00 至 0xFFReadDevId 码对象 id响应 PDU功能码 MEI 类型 1 个字节 1 个字节 1 个字节 1 个字节 1 个字节 1 个字节 1 个字节 1 个字节 1 个字节 1 个字节 0x2B 0x0E 01/02/03/04 00/FF 对象 ID 号ReadDevId 代码一致性等级 随后更多 下一个对象 Id 对象号 对象 ID 的列表 对象长度 对象值错误功能码 MEI 类型 38 1 字节 1 字节 0xAB: Fc 0x2B+0x80 14 GB/T ××××―×××× 异常码 1 字节 01、02、03、04请求参数描述: 指配号为 14 的 MODBUS 封装接口识别读识别码请求。定义四种访问类型: 01:请求获得基本设备识别码(流访问) 02:请求获得正常设备识别码(流访问) 03:请求获得扩展设备识别码(流访问) 04:请求获得特定识别码对象(专用访问) 在识别码数据不适合单独响应的情况下,可以需要几个请求/响应事务处理。 对象 id 字节给出了 获得的第一个对象识别码。对于第一个事物处理来说,客户机必须设置对象 id 为 0,以便获得设备 识别码数据的开始。对于下列事务来说,客户机必须设置对象 id 为前面响应中服务器的返回值。 如果对象 id 不符合任何已知对象,那么服务器象指向对象 0 那样响应(从头开始)。 在单个访问的情况下:ReadDevId 代码 04,请求中的对象 id 给出了获得的对象识别码。 如果对象 id 不符合任何已知对象,那么服务器返回一个异常码=02(非法数据地址)的异常响 应。 响应参数描述: 功能码: MEI 类型: ReadDevId 码: 一致性等级:功能码 43(十进制)0x2B (十六进制) 为设备识别码接口指配号的 14 (0x0E) MEI 类型 与请求 ReadDevId 码相同:01、02、03 或 04 设备的识别码一致性等级和支持访问的类型 01:基本识别码(仅流访问) 02:正常识别码(仅流访问) 03:扩展识别码(仅流访问) 81:基本识别码(流访问和单个访问) 82:正常识别码(流访问和单个访问) 83:扩展识别码(流访问和单个访问) 在 ReadDevId 码 01、02 或 03 (流访问)的情况下, 如果识别码数据不符合单个响应,那么需要几个请求/响应事务处理。 00:对象不再是可利用的 FF:其它识别码对象是可利用的,并且需要更多 MODBUS 事务处理 在 ReadDevId 码 04(单个访问)的情况下, 必须设置这个域为 00。 如果“随后更多=FF”,那么请求下一个对象的识别码 如果“随后更多=00”,那么必须设置为 00 (无用的)随后更多:下一个对象 Id:对象号在响应中返回的对象识别码号 (对于单个访问,对象号码= 1) 对象 0.id PDU 中返回的第一个对象识别码(流访问)或请求对象的识别码(单个访问) Object0.长度 第一个对象的字节长度 Object0.值 第一个对象的值(对象 0.长度字节) … ObjectN.id ObjectN.长度 ObjectN.值 最后对象的识别码(在响应中) 最后对象的字节长度 最后对象的值(对象 N.长度字节)39 GB/T ××××―×××ד基本设备识别码”的读设备识别码请求的实例:在这个实例中,一个响应 PDU 中发送所有 的报文。请求 域名 功能 MEI 类型 值 2B 0E 01 00 响应 域名 功能 MEI 类型 值 2B 0E 01 01 00 00 03 00 16 “公司识别码” 01 0A “产品代码” 02 05 “V2.11”ReadDevId 码对象 idReadDevId 码一致性等级 更多继续 下一个对象 id 对象号 对象 id 对象长度 对象值 对象 id 对象长度 对象值 对象 id 对象长度 对象值如果一个设备需要几个事务处理发送响应,那么启动下列事务处理。 第一个事务处理:请求 域名 功能 MEI 类型 值 2B 0E 01 00 响应 域名 功能 MEI 类型 值 2B 0E 01 01 FF 02 03 00 16 “公司识别码” 01 1A “产品代码” XXXXXXXXXX”ReadDevId 码对象 idReadDevId 码一致性等级 更多继续 下一个对象 id 对象号 对象 id 对象长度 对象值 对象 id 对象长度 对象值第二个事务处理:请求 域名 功能 MEI 类型 40 值 2B 0E 响应 域名 功能 MEI 类型 值 2B 0E GB/T ××××―××××ReadDevId 码对象 id01 02ReadDevId 码一致性等级 更多继续 下一个对象 id 对象号 对象 id 对象长度 对象值01 01 00 00 03 02 05 “V2.11”进入 MB 服务器接 收 mb_req_pduNO 支持的功能码 异常码=01 NO 对象 Id==OK 异常码=02 YES 请求处理 YES要求分段NO随后更多=FF 下一个对象 ID=XX随后更多=00 下一个对象 ID=00MB 服务器发送 mb_rsp MB 服务器发送 mb_exception_rsp退出图 22:读设备识别码状态图41 GB/T ××××―××××7 MODBUS 异常响应 当客户机设备向服务器设备发送请求时,客户机希望一个正常响应。从主站询问中出现下列四 种可能事件之一: ? 如果服务器设备接收到无通信错误的请求,并且可以正常地处理询问,那么服务器设备将 返回一个正常响应。 ? 如果由于通信错误,服务器没有接收到请求,那么不能返回响应。客户机程序将最终处理 请求的超时状态。 ? 如果服务器接收到请求,但是检测到一个通信错误(奇偶校验、LRC、CRC、...),那么不 能返回响应。客户机程序将最终处理请求的超时状态。 ? 如果服务器接收到无通信错误的请求,但不能处理这个请求(例如,如果请求读一个不存 在的输出或寄存器),服务器将返回一个异常响应,通知用户错误的本质特性。 异常响应报文有两个与正常响应不同的域: 功能码域:在正常响应中,服务器利用响应功能码域来应答最初请求的功能码。所有功能码的 最高有效位(MSB)都为 0(它们的值都低于十六进制 80)。在异常响应中,服务器设置功能码的 MSB 为 1。这使得异常响应中的功能码值比正常响应中的功能码值高十六进制 80。 通过设置功能码的 MSB,客户机的应用程序能够识别异常响应,并且能够检测异常码的数据 域。 数据域:在正常响应中,服务器可以返回数据域中数据或统计表(请求中要求的任何报文)。 在异常响应中,服务器返回数据域中的异常码。这就定义了产生异常的服务器状态。 客户机请求和服务器异常响应的实例:请求 域名 功能 起始地址 Hi 起始地址 Lo 输出数量 Hi 输出数量 Lo (十六进制) 01 04 A1 00 01 响应 域名 功能 异常码 (十六进制) 81 02在这个实例中,客户机对服务器设备寻址请求。 功能码(01)用于读输出状态操作。 它将请求地址 1245(十六进制 04A1)的输出状态。值得注意的是,象输出域 (0001)号码说明的那样,只读出一个输 出。 如果在服务器设备中不存在输出地址,那么服务器将返回异常码(02)的异常响应。 这就说明从站 的非法数据地址。 从下页开始异常码的列表。42 GB/T ××××―×××× MODBUS 异常码 代码 01 名称 非法功能 含义 对于服务器(或从站)来说,询问中接收到的功能码是不可允许的操作。这也许 是因为功能码仅仅适用于新设备而在被选单元中是不可实现的。 同时,还指出 服务器(或从站)在错误状态中处理这种请求,例如:因为它是未配置的,并且 要求返回寄存器值。 对于服务器(或从站)来说,询问中接收到的数据地址是不可允许的地址。特别 是,参考号和传输长度的组合是无效的。对于带有 100 个寄存器的控制器来说, 带有偏移量 96 和长度 4 的请求会成功,带有偏移量 96 和长度 5 的请求将产生 异常码 02。 对于服务器(或从站)来说,询问中包括的值是不可允许的值。这个值指示了组 合请求剩余结构中的故障,例如:隐含长度是不正确的。并不意味着,因为 MODBUS 协议不知道任何特殊寄存器的任何特殊值的重要意义,寄存器中被 提交存储的数据项有一个应用程序期望之外的值。 当服务器(或从站)正在设法执行请求的操作时,产生不可重新获得的差错。 与编程命令一起使用。服务器(或从站)已经接受请求,并切正在处理这个请求, 但是需要长的持续时间进行这些操作。返回这个响应防止在客户机 (或主站)中 发生超时错误。客户机(或主站)可以继续发送轮询程序完成报文来确定是否完 成处理。 与编程命令一起使用。 服务器(或从站)正在处理长持续时间的程序命令。 张服务 器(或从站)空闲时,用户(或主站)应该稍后重新传输报文。 与功能码 20 和 21 以及参考类型 6 一起使用,指示扩展文件区不能通过一致性 校验。 服务器(或从站)设法读取记录文件,但是在存储器中发现一个奇偶校验错误。 客户机(或主方)可以重新发送请求,但可以在服务器(或从站)设备上要求服务。 0A 0B 不可用网关路径 网关目标设备 响 应 失 败 与网关一起使用,指示网关不能为处理请求分配输入端口至输出端口的内部 通信路径。通常意味着网关是错误配置的或过载的。 与网关一起使用,指示没有从目标设备中获得响应。 通常意味着设备未在网络 中。02非法数据地址03非法数据值04 05从站设备故障 确认06 08从属设备忙 存储奇偶性差错43 GB/T ××××―××××第二部分:Modbus 协议在串行链路上 的实现指南44 GB/T ××××―××××1 引言 1.1 范围Modbus 标准定义了 OSI 模型第 7 层上的应用层报文传输协议,它在连接至不同类型总线或网 络的设备之间提供客户机/服务器通信。它还将串行链路上的协议标准化,以便在一个主站和一个或 多个从站之间交换 Modbus 请求。 本文件的目的是表述串行链路上的 Modbus 协议。使用对 象 为在 他 们 的 产品 实现串行链路 Modbus 协议的系统设计者。 本文件将增进使用 Modbus 协议的设备之间的互通性。 本文件还是对“Modbus 协议规范”的补充。 第 5 章定义了“Modbus 串行链路”的实现等级。级别的规范是对一个设备能够属于某个级别而 必须遵守的要求的总和。Modbus 协议( OSI 第 7 层 )Modbus 协议 规范本文件Modbus 在串行链路上 的实现指南 图 1:Modbus 文件概要串行链路规范 (OSI 第 1 和 2 层 )1.2协议概述Modbus 串行链路协议是一个主/从协议。 本文件描述 Modbus 串行链路协议。 该协议位于 OSI 模 型的第二层。 一个主从类型的系统有一个向某个“子”节点发出显式命令并处理响应的节点(主节点)。 典型的 子节点在没有收到主节点的请求时并不主动发送数据,也不与其它子节点通信。 在物理层, Modbus 串行链路系统可以使用不同的物理接口 (RS485 、 RS232) 。 最常 用的是 TIA/EIA-485 (RS485) 两线制接口。作为附加的选项,也可以实现 RS485 四线制接口。当只需要短距 离的点到点通信时,TIA/EIA-232-E (RS232) 串行接口也可以使用。(参见有关“物理层”的章节) 下图给出了 Modbus 串行通信栈对应于 7 层 OSI 模型的一般关系。45 GB/T ××××―××××Modbus 协议 客户机/服务器Modbus 主站/从站 EIA/TIA-485(或 EIA/TIA-232)层 7 6 5 4 3 2 1ISO/OSI 模型 应用层 表示层 会话层 传输层 网络层 数据链路层 物理层 Modbus 协议 空 空 空 空 Modbus 串行链路协议 EIA/TIA-485 (或 EIA/TIA-232)图 1 Modbus 协议和 ISO/OSI 模型 OSI 7 Modbus 位于 模型第 层的 应用层报文传输协议, 提供了连接于总线或网络的设备之间 / Modbus 的客户机 服务器通信。 在 串行链路上客户机的功能由主节点提供而服务器功能由子节点实 现。 1.3 约定 在本文件中, 下列词汇用于定义每一种要求的重要程度。 ? &必须& / &要求的& 含有词语 &必须& 的要求是强制的。词语必须,或形容词&要求的&,表示该项为实现的绝对要求。这些词语带有下划线。 ? &应该& / &建议的& 所有包含 &应该&,或形容词 “建议的” 建议,为期望的功能。这些建议应该作为选择不同的 实现选项时的指南。在有合理的理由的特定条件下,可以忽略这些项。 但是,对其全部含义应该理 解并且基于情况做出选择时应仔细斟酌。 这些词语带有下划线。 ? &可以& / &可选的&词语 “可以”,或形容词 &可选的&,表示该项为真正意义的可选的。 某个设计者可以选择包含 该项(基于特定的市场需求或产品功能增强);而另一个可以选择忽略该项。46 GB/T ××××―××××1.4一致性如果某个实现不满足实现级别中一个或多个必须的要求,则是不符合的。 如果某个实现满足实现级别中所有的必须要求和所有的应该的建议,则称为&无条件符合的&。 如果某个实现满足实现级别中所有的必须要求和不是所有的应该的建议,则称为&有条件符合的&。1.5缩略语 定义本文件中用到的特定词汇、符号和缩略语。2W 4W 2W+2W在 “电气接口” 一章中定义的两线制配置,或其中的一个接口。 在 “电气接口” 一章中定义的四线制配置,或其中的一个接口。 在两线制系统中使用四线制接口的特殊配置。 ( 需要时可参见 Schneider Electric Momentum 文件 870 USE 101 10 )。AUI 公共端连接单元接口 (Attachment Unit Interface) EIA/TIA 标准中的信号公共端 (Common)。 在两线制或四线制 RS485 Modbus 网络中, 信号和可选的电源的公共端。 Power Supply 公共端DCE一个 Modbus 设备。 例如, 实现了 RS232 数据电路设备 (Data-Circuit Equipment) 的可 编程序控制器适配器。也称作数据通信设备(Data Communication Equipment)。设备 驱动器 DTE或 “Modbus 设备” : 参见其定义。 发生器,或发送器 一个 Modbus 设备。 例如, 实现了 RS232 数据终端设备 (Data Terminal Equipment) 编 程终端或 PCITr IDv LT Modbus 设备 RS232 RS485 RS485 Modbus干缆侧的物理总线接口 (Interface on Trunk Side)。 设备侧的物理总线接口 (Interface on Derivation Side)。 线路终端(Line Termination)。 实现了 Modbus 串行链路并遵循技术规范的设备。 EIA/ TIA -232 标准。 EIA/ TIA -485 标准。 与该技术标准一致的两线制或四线制网络收发器 (Transceiver) 发送器和接收器。(a Transmitter and a Receiver 或驱动器和接收器)。47 GB/T ××××―××××2 Modbus 数据链路层 2.1 Modbus 主站/从站协议原理Modbus 串行链路协议是一个主 -从协议。 在同一时刻,只有一个主节点连接于总线,一个或多个 子节点 (最大编号为 247 ) 连接于同一个串行总线。Modbus 通信总是由主节点发起。子节点在没有 收到来自主节点的请求时,从不会发送数据。 子节点之间从不会互相通信。 主节点在同一时刻只会发 起一个 Modbus 事务处理。 主节点以两种模式对子节点发出 Modbus 请求: ? 在单播模式,主节点以特定地址访问某个子节点,子节点接到并处理完请求后,子节点向主 节点返回一个报文(一个 '应答')。 在这种模式, 一个 Modbus 事务处理包含 2 个报文: 一个来自主节点的请求, 一个来自子节点 的应答。 每个子节点必须有唯一的地址 (1 到 247),这样才能区别于其它节点被独立的寻址。 ? 在广播模式,主节点向所有的子节点发送请求。 对于主节点广播的请求没有应答返回。 广播请求一般用于写命令。所有设备必须接受广播模式的写 功能。地址 0 是专门用于表示广播数据的。 单播和广播模式的区别在一个多点的结构下(如 RS485)更加易于理解。主节点请求应答从节 点从 节点从节点图 2:单播模式主节点请求从节 点从 节点从节点图 3:48广播模式 GB/T ××××―××××2.2 Modbus 地址规则 Modbus 寻址空间有 256 个不同地址。0 广播地址 1 ~ 47 子节点单独地址 248 ~ 55 保留地址 0 保留为广播地址。所有的子节点必须识别广播地址。Modbus 主节点没有地址, 只有子节点必须有一个地址。 该地址必须在 Modbus 串行总线上唯一。2.3 Modbus 帧描述 Modbus 应用协议 [1] 定义了简单的独立于其下面通信层的协议数据单元 (PDU - Protocol Data Unit):功能码 MODBUS PDU数据图 5:Modbus 协议数据单元 在不同总线或网络的 Modbus 协议映射在协议数据单元之外引入了一些附加的域。发起 Modbus 事 务处理的客户端构造 Modbus PDU,然后添加附加的域以构造适当的通信 PDU。Modbus 串行链路 PDU 地址域 功能码 MODBUS PDU图 6:串行链路上的 Modbus 帧 ? 在 Modbus 串行链路,地址域只含有子节点地址。 如前文所述,合法的子节点地址为十进制 0 C 247。 每个子设备被赋予 1 C 247 范围中的地址。 主节点通过将子节点的地址放到报文的地址域对子节点寻址。 当子节点返回应答时, 它将自己的地 址放到应答报文的地址域以让主节点知道哪个子节点在回答。 ? ? 功能码指明服务器要执行的动作。功能码后面可跟有表示含有请求和响应参数的数据域。 错误检验域是对报文内容执行 &冗余校验& 的计算结果。 根据不同的传输模式 (RTU or ASCII) 使 (参见 2.5 节, &两种串行传输模式&) 用两种不同的计算方法。数据CRC (或 LRC)49 GB/T ××××―××××2.4主站/从站状态图Modbus 由两个不同的子层组成 : ? 主/ 从协议 ? 传输模式 ( RTU 和 ASCII 模式) 下面的章节描述了主节点和子节点与传输模式无关的状态图。 RTU 和 ASCII 传输模式在下一章用两个状态图具体说明。描述了一个帧的接收和发送。状态图词法 : 下面的状态图使用与 UML 标准标记法绘制。标记法要点如下:触发 [ 临界条件 ] / 动作状态_A状态_B当一个系统处于 &状态_A& 时发生&触发&事件,只有当 &临界条件& 为真时系统会转换到 &状态_B&,然 后,一个&动作&被执行。2.4.1主站状态图下图描述了主节点的状态特征 :广播模式发送 请求 / 启动转换延迟 等待转换延 迟 转换延迟时间到空闲出错处理结束 应答处理结束请求发送到子 处理应答 节点 /启动响应超时 接收响应 [期望的子节点] 定时 / 停止响应超时定时 等待应答 应答超时帧错 出错处理接收响应 [非期望的子节点]图 4:主节点状态图对上面的状态图的一些解释 : ? 状态 &空闲& = 无等待的请求。 这是电源上电后的初始状态。 只有在&空闲&状态请求才能被发 送。发送一个请求后,主节点离开&空闲&状态, 而且不能同时发送第二个请求。 ? 当单播请求发送到一个子节点,主节点将进入&等待应答& 状态, 同时一个临界超时定时启动。 这个超时称为 &响应超时&。 它避免主节点永远处于&等待应答& 状态。 响应超时的时间依赖于 具体应用。 ? 当收到一个应答时,主节点在处理数据之前检验应答。 在某些情况下,检验的结果可能为错误。 如收到来自非期望的子节点的应答,或接收的的帧错误。在收到来自非期望子节点的应答时,50 GB/T ××××―××××? ???响应超时继续计时;当检测到帧错时,可以执行一个重试。 响应超时但没有收到应答时,则产生一个错误。那么主节点进入”空闲” 状态, 并发出一个 重试请求。重试的最大次数取决于主节点 的设置。 当广播请求发送到串行总线上,没有响应从子节点返回。然而主节点需要进行延迟以便使子节 点在发送新的请求处理完当前请求。 该延迟被称作 &转换延迟&。 因此,主节点会在返回能够发送 另一个请求的“空闲”状态之前,到& 等待转换延迟&状态。 在单播方式,响应超时必须设置到足够的长度以使任何子节点都能处理完请求并返回响应。而 广播转换延迟必须有足够的长度以使任何子节点都能只处理完请求而可以接收新的请求。 因此, 转换延迟应该比响应超时要短。典型的响应超时在 9600 bps 时从 1 秒到几秒,而转换延迟从 100 ms 到 200ms。 帧错误包括 : 1) 对每个字符的奇偶校验; 2) 对整个帧的冗余校验。 详细解释参见 §2.6 &差错检验 方法& 。状态图以简洁的方式绘出。 它没有包含对线路的访问、 报文帧及传输错误重试等等。 有关帧传输的细 2.5 & & 节,请参见 中的图, 两种串行式 。 2.4.2 从站状态图下图描述了子节点的状态特征:空闲正常应答发送错误应答发送格式化正常 应答结束处理 [广播模式](从主节点) 接收一个请求 检查请求 检查 OK结束处理 [单播模式] 处理请求的 动作处理时出错 格式化 错误应答 帧检查错, 或 帧不是发往 此子节点请求数据中有错图 5:子节点状态图对上面的状态图的一些解释 : ? 状态 “空闲” = 没有等待的请求。 这是电源上电后的初始状态。 ? 当收到一个请求时,子节点在处理请求中要求的动作前检验报文包。 不同的错误可以发生于: 请 求的格式错,非法动作,…… 当检测到错误时,必须向主节点发送应答。 ? 当要求的动作完成后,单播报文要求必须格式化一个应答并发往主节点。 ? 如果子节点在接收到的帧中检测到错误, 则没有响应返回到主节点。 ? 任何子节点均应该定义并管理 Modbus 诊断计数器以提供诊断信息。通过使用 Modbus 诊断功能 码,可以得到这些计数值。( 参见 附录 A, 和 Modbus 应用协议规范 [1])。51 GB/T ××××―××××2.4.3主站/从站通信时序图下面的图显示了主/从通信的 3 种典型情况。应答分析并准备 后续的通讯数据 交换广播转换延迟 等待 请求 到子站 N 错误响应超时 等待等待主节点请求 到子站 1子节点 1请求处理应答错误检查子节点 N各个子节点同时执行命令无应答物理线路时间 数据交换 i-1 数据交换 i 数据交换 i+1图 6:各种情形的主/从通信时序图注 : ? 请求, 应答, 广播阶段的持续时间依赖于通信特征 (帧长度和吞吐量)。 ? 等待和处理阶段的持续时间取决于子节点应用的请求处理时间。52 GB/T ××××―××××2.5两种串行传输模式有两种串行传输模式被定义: RTU 模式 和 ASCII 模式。 它定义了报文域的位内容在线路上串行的传送。它确定了信息如何打包为报文和解码。 Modbus 串行链路上所有设备的传输模式 (和串行口参数) 必须相同。 尽管在特定的领域 ASCII 模式是要求的,但达到 Modbus 设备之间的互操作性只有每个设备都有 相同的模式: 所有设备必须必须实现 RTU 模式。 ASCII 传输模式是选项。 设备应该由用户设成期望的模式, RTU 或 ASCII。 默认设置必须为 RTU 模式。 2.5.1 RTU 传输模式 当设备使用 RTU (Remote Terminal Unit) 模式在 Modbus 串行链路通信, 报文中每个 8 位字节含有 两个 4 位十六进制字符。这种模式的主要优点是较高的数据密度,在相同的波特率下比 ASCII 模式 有更高的吞吐率。每个报文必须以连续的字符流传送。 RTU 模式每个字节 ( 11 位 ) 的格式为 : 8C位二进制 编码系统: 报文中每个 8 位字节含有两个 4 位十六进制字符(0C9, ACF) Bits per Byte: 1 起始位 8 数据位, 首先发送最低有效位 1 位作为奇偶校验 1 停止位 偶校验是要求的, 其它模式 ( 奇校验, 无校验 ) 也可以使用。 为了保证与其它产品的最大兼容 性,同时支持无校验模式是建议的。默认校验模式模式 必须为偶校验。 注 : 使用无校验要求 2 个停止位。 字符是如何串行传送的: 每个字符或字节均由此顺序发送(从左到右): 最低有效位 (LSB) . . . 最高有效位 (MSB)有奇偶校验 起始 1 2 3 4 5 6 7 8 校验 停止图 7:RTU 模式位序列设备配置为奇校验、 偶校验或无校验都可以接受。 如果无奇偶校验,将传送一个附加的停止位以填充 字符帧:53 GB/T ××××―××××无奇偶校验 起始 1 2 3 4 5 6 7 8 停止 停止图 8: 帧检验域:RTU 模式位序列 (无校验的特殊情况)循环冗余校验 (CRC)帧描述 :子节点 地址 1 字节 功能 代码 1 字节 数据 0 到 252 字节 CRC 2 字节CRC 低 CRC 高图 9: ? Modbus RTU 帧最大为 256 字节。RTU 报文帧2.5.1.1 Modbus 报文 RTU 帧 由发送设备将 Modbus 报文构造为带有已知起始和结束标记的帧。这使设备可以在报文的开始接收 新帧,并且知道何时报文结束。不完整的报文必须能够被检测到而错误标志必须作为结果被设置。 在 RTU 模式,报文帧由时长至少为 3.5 个字符时间的空闲间隔区分。 在后续的部分,这个时间区间 被称作 t3.5。 帧1 帧2 帧3t03.5 个字符 至少 3.5 个字符 至少 3.5 个字符 4.5 个字符MODBUS 报文起始 ≥ 3.5 字符地址 8位功能代码 8位数据 Nx 8位CRC 校验 16 位结束 ≥ 3.5 字符图 10:RTU 报文帧整个报文帧必须以连续的字符流发送。 如果两个字符之间的空闲间隔大于 1.5 个字符时间,则报文帧被认为不完整应该被接收节点丢弃。54 GB/T ××××―××××帧 1 正常 t0帧 2 非正常≤ 1.5 字符& 1.5 字符注 : RTU 接收驱动程序的实现,由于 t1.5 和 t3.5 的定时,隐含着大量的对中断的管理。 在高通信速率下, 这导致 CPU 负担加重。因此,在通信速率等于或低于 19200 Bps 时,这两个定时必须严格遵守; 对于 波 特 率 大 于 19200 Bps 的情 形 ,应该使用 2 个定 时 的 固 定 值 :建议的 字符 间 超时时 间 (t1.5) 为 750?s,帧间的超时时间 (t1.5) 为 1.750ms。 下图表示了对 RTU 传输模式状态图的描述。 &主节点& 和 &子节点& 的不同角度均在相同的图中表示:接收到字符 / 标志 = 帧不正常 /开始 t3.5 注释 帧正常 ? 处理帧 帧不正常 ? 删除整个帧 注释 帧控制 (CRC, 校验, 子地址) ? 标志 = 帧正常或不正常初始态接收到字符 /初始化,启动 t3.5 t3.5 超时控制和等待t3.5 超时 t1.5 超时(准备好接收或发送)空闲接收到第一个字符 /初始化,启动 t1.5, t3.5接收接收到字符 /初始化,启动 t1.5, t3.5请求发送t3.5 超时 图例 t1.5, t3.5 : 定时器 t3.5 : 3.5 字符时间 t1.5 : 1.5 字符时间发送发送字符 [如果为最后一个字符] / 初始化并启动 t3.5图 11:RTU 传输模式状态图上面状态图的一些解释: ? 从 &初始& 态到 “空闲” 态转换需要 t3.5 定时超时: 这保证帧间延迟 ? “空闲” 态是没有发送和接收报文要处理的正常状态。 ? 在 RTU 模式, 当没有活动的传输的时间间隔达 3.5 个字符长时,通信链路被认为在 “空闲” 态。 ? 当链路空闲时, 在链路上检测到的任何传输的字符被识别为帧起始。 链路变为 &活动& 状态。 然后, 当链路上没有字符传输的时间间个达到 t3.5 后,被识别为帧结束。 ? 检测到帧结束后,完成 CRC 计算和检验。然后,分析地址域以确定帧是否发往此设备,如果不 是,则丢弃此帧。 为了减少接收处理时间,地址域可以在一接到就分析,而不需要等到整个帧 结束。这样,CRC 计算只需要在帧寻址到该节点 (包括广播帧) 时进行。 2.5.1.2 CRC 校验 在 RTU 模式包含一个对全部报文内容执行的,基于循环冗余校验 (CRC - Cyclical Redundancy55 GB/T ××××―××××Checking) 算法的错误检验域。 CRC 域检验整个报文的内容。 不管报文有无奇偶校验,均执行此检验。 CRC 包含由两个 8 位字节组成的一个 16 位值。 CRC 域作为报文的最后的域附加在报文之后。计算后,首先附加低字节,然后是高字节。CRC 高字节为报文发送的最后一个子节。 附加在报文后面的 CRC 的值由发送设备计算。接收设备在接收报文时重新计算 CRC 的值,并 将计算结果于实际接收到的 CRC 值相比较。如果两个值不相等,则为错误。 CRC 的计算, 开始对一个 16 位寄存器预装全 1。 然后将报文中的连续的 8 位子节对其进行后续 的计算。只有字符中的 8 个数据位参与生成 CRC 的运算,起始位,停止位和校验位不参与 CRC 计 算。 CRC 的生成过程中, 每个 8C位字符与寄存器中的值异或。然后结果向最低有效位 (LSB)方向 移动(Shift) 1 位,而最高有效位(MSB)位置充零。然后提取并检查 LSB:如果 LSB 为 1, 则寄存器 中的值与一个固定的预置值异或;如果 LSB 为 0, 则不进行异或操作。 这个过程将重复直到执行完 8 次移位。完成最后一次(第 8 次)移位及相关操作后,下一个 8 位字节与寄存器的当前值异或,然后又同上面描述过的一样重复 8 次。当所有报文中子节都运算之 后得到的寄存器忠的最终值,就是 CRC。 当 CRC 附加在报文之后时,首先附加低字节,然后是高字节。在附录 B 含有 CRC 生成的详细 示例。56 GB/T ××××―××××2.5.2 ASCII 传输模式 当 Modbus 串 行 链 路 的 设 备 被 配 置 为 使 用 ASCII (American Standard Code for Information Interchange) 模式通信时, 报文中的每个 8 位子节以两个 ASCII 字符发送。 当通信链路或者设备无 法符合 RTU 模式的定时管理时使用该模式。注 : 由于一个子节需要两个字符,此模式比 RTU 效率低。 ? 例 : 子节 0X5B 会被编码为两个字符 : 0x35 和 0x42 ( ASCII 编码 0x35 =&5&, 0x42 =&B& )。ASCII 模式每个字节 ( 10 位 ) 的格式为 : 编码系统: 十六进制,ASCII 字符 0-9, A-F。 报文中每个 ASCII 字符含有 1 个十六进制字符 Bits per Byte: 1 起始位 7 数据位, 首先发送最低有效位 1 位作为奇偶校验 1 停止位 偶校验是要求的, 其它模式 ( 奇校验, 无校验 ) 也可以使用。 为了保证与其它产品的最大兼容 性,同时支持无校验模式是建议的。默认校验模式模式 必须为偶校验。 注 : 使用无校验要求 2 个停止位。 字符是如何串行传送的: 每个字符或字节均由此顺序发送(从左到右): 最低有效位 (LSB) . . . 最高有效位 (MSB)有奇偶校验 起始 1 2 3 4 5 6 7 校验 停止图 12:ASCII 模式位序列设备配置为奇校验、 偶校验或无校验都可以接受。 如果无奇偶校验,将传送一个附加的停止位以填充 : 字符帧无奇偶校验 起始 1 2 3 4 5 6 7 停止 停止图 13: ASCII 模式模式位序列(无校验的特殊情况) 帧检验域:纵向冗余校验 (LRC - Longitudinal Redundancy Checking)57 GB/T ××××―××××2.5.2.1 Modbus ASCII 报文帧 由发送设备将 Modbus 报文构造为带有已知起始和结束标记的帧。这使设备可以在报文的开始 接收新帧,并且知道何时报文结束。不完整的报文 必须能够被检测到而错误标志 必须作为结果被设 置。 报文帧的地址域含有两个字符。 在 ASCII 模式, 报文用特殊的字符区分帧起始和帧结束。一个报文 必须以一个‘冒号’ ( : ) (ASCII 十六进制 3A )起始,以 ‘回车-换行’ (CR LF) 对 (ASCII 十六进制 0D 和 0A) 结束。注 : LF 字符可以通过特定的 Modbus 应用命令 (参见 Modbus 应用协议规范) 改变。对于所有的域,允许传送的字符为十六进制 0C9, ACF (ASCII 编码)。 设备连续的监视总线上 的 ‘冒号’ 字符。 当收到这个字符后,每个设备解码后续的字符一直到帧结束。 报文中字符间的时间间隔可以达一秒。如果有更大的间隔,则接受设备认为发生了错误。 下图显示了一个典型的报文帧。起始 1 字符 : 地址 2 字符 功能 2 字符 数据 0 到 to 2x252 字符 LRC 2 字符 结束 2 字符 CR,LF图 14:ASCII 报文帧注:每个字符子节需要用两个字符编码。 因此,为了确保 ASCII 模式 和 RTU 模式在 Modbus 应用级兼容,ASCII 数 据域最大数据长度为 (2x252) 是 RTU 数据域 (252) 的两倍。必然的, Modbus ASCII 帧的最大尺寸为 513 个字符。 ASCII 报文帧的要求在下面的状态图中综合。 &主节点& 和 &子节点& 的不同角度均在相同的图 中表示:接收 &:& 字符 / 清空接收缓冲区空闲发送 “LF” 请求发送 发送 发送或接收就绪接收 &:& 字符接收接收字符 / 将接收的字符 数绪放入 接收缓冲区接收 &LF& 字符 / 帧控制 (LRC, 校验, 子地址.)接收 &CR& 字符 接收 &:& 字符 / 清空接收缓冲区开始发送“:” 注释 帧正常 ?帧处理 帧不正常 ? 删除整个帧 发送 所有字符等待 “帧结束&发送发送 “CR”发送结束图 15:ASCII 传输模式状态图58 GB/T ××××―××××上面状态图的一些解释: ? “空闲” 态是没有发送和接收报文要处理的正常状态。 ? 每次接收到 &:& 字符表示新的报文的开始。 如果在一个报文的接收过程中收到该字符,则当前地 报文被认为不完整并被丢弃。而一个新的接收缓冲区被重新分配。 ? 检测到帧结束后,完成 LRC 计算和检验。然后,分析地址域以确定帧是否发往此设备,如果不 是,则丢弃此帧。 为了减少接收处理时间,地址域可以在一接到就分析,而不需要等到整个帧 结束。 2.5.2.2 LRC 校验 在 ASCII 模 式 ,包 含 一个对 全 部报文内 容 执行的,基于 纵 向 冗 余 校验 (LRC - Longitudinal Redundancy Checking) 算法的错误检验域。LRC 域检验不包括起始“冒号”和结尾 CRLF 对的整个 报文的内容。不管报文有无奇偶校验,均执行此检验。 LRC 域为一个子节,包含一个 8 位二进制值。LRC 值由发送设备计算,然后将 LRC 附在报文 后面。 接收设备在接收报文时重新计算 LRC 的值,并将计算结果于实际接收到的 LRC 值相比较。 如 果两个值不相等,则为错误。 LRC 的计算, 对报文中的所有的连续 8 位字节相加,忽略任何进位,然后求出其二进制补码。 执 行检验针对不包括起始“冒号”和结尾 CRLF 对的整个 ASCII 报文域的内容。在 ASCII 模式, LRC 的结果被 ASCII 编码为两个字节并放置于 ASCII 模式报文帧的结尾, CRLF 之前。 附录 B 含有 LRC 生成的详细示例。59 GB/T ××××―××××2.6差错检验方法标准 Modbus 串行链路的可靠性基于两种错误检验: ? 奇偶校验 (偶或奇) 应该被每个字符采用。 ? 帧检验 (LRC or CRC) 必须运用于整个报文。 由设备 (主节点或子节点 ) 生成的字符检验和帧检验发送前附加于报文体。设备 (子节点或主节点 ) 在接收时检验每个字符和整个报文。 主节点被用户配置为在放弃事务处理前等待一个预定的超时间隔 (响应超时)。这个间隔被设置成任 何子节点有足够的时间正常响应 (单播请求)。 如果子节点检测到错误,则报文不起作用。 子节点将不 会构造对主节点的响应。 因此,将达到超时时间能使主节点的程序处理错误。 注意,当寻址到不存在 的子设备的报文也会导致超时错误。 2.6.1 奇偶检验用户可以配置设备使用偶 (要求的) 或奇校验,或无校验 (建议的)。 这将确定每个字符的奇偶位 如何设置。 无 论 指定了 偶还 是 奇 校验, 则 数据部分的为 1 的 位 的总数 被计 数 (ASCII 模 式 7 数据 位 , RTU 8 数据位)。 而奇偶位会被设置为 0 或 1 以使为 1 的位的总数为偶数或奇数。 例如, RTU 字符帧的数据为:
为 1 的位的总数为 4。如果使用偶校验,帧的奇偶位为 0,使为 1 的位的总数仍然为偶数(4);如果使 用奇校验,帧的奇偶位为 1,使为 1 的位的总数为奇数(5)。 当报文发送时,奇偶位被计算并作用于每个字符帧。接收的设备计算为 1 的位的总数,如果与设备 配置不附,则设置错误标记。(Modbus 串行链路的所有设备必须被配置成使用相同的奇偶检验方法)。 注意,奇偶检验只能检测到一个字符帧在传输过程中奇数个的增加或丢失的位。例如,假如使用奇 校验,字符帧中含有的 3 个为 1 的位丢失了两个,而为 1 的位的计数的结果仍然为奇数。 如果没有指定奇偶检验,奇偶位不会被传送,也不可以进行奇偶检验:一个附加的位被传送以填充 字符帧。 2.6.2 ? 帧检验?依赖于传输模式,两种检验方法被使用: RTU 或 ASCII。 在 RTU 模 式 , 包 含 一 个 对 全 部 报 文 内 容 执 行 的 , 基 于 循 环 冗 余 校 验 (CRC - Cyclical Redundancy Checking) 算法的错误检验域。 CRC 域检验整个报文的内容。 不管报文有无奇偶校验, 均执行此检验。 在 ASCII 模 式 ,包 含 一个对 全 部报文内 容 执行的,基于 纵 向 冗 余 校验 (LRC - Longitudinal Redundancy Checking) 算法的错误检验域。 LRC 域检验不包括起始“冒号”和结尾 CRLF 对的整个报文的内容。不管报文有无奇偶校验,均执行此检验。 有关差错检验方法的详细内容,参见前面的章节。60 GB/T ××××―××××3 物理层 3.1 引言新的串行链路上的 MODBUS 解决方案应该按照 EIA/TIA-485(即已知的 RS485 标准)实现电气接 口。 该标准允许“两线结构”的点对点和多点系统。 此外,某些设备可能能实现“四线”RS485 接口。 设备也可能能实现 RS232 接口。 在这种 MODBUS 系统中,一个主站和一个或几个从站在一个无源串行链路路上通信。 在标准的 MODBUS 系统中,所有设备(并行)连结在一条由 3 条导线组成的干线电缆上。其中两 条导线(“两线”结构)形成一对平衡双绞线,双向数据在其上传送,典型比特率为每秒 9600 比特。 每台设备可能连结(见图 19): 或是双向连到主干电缆上,形成菊花链, 或是经分支电缆连到一个无源接头上, 或是经特种电缆连到一个有源接头上。 在设备上可用螺钉端子,RJ45,或 9 芯 D-型连接器与电缆相接(见“机械接口”章节)。3.2数据信号发送速率要求 9600bps 波特率。 推荐 19200bps 波特率。 该值(19200)必须被作为约定值来实现。 其它波特率可选择来实现:, 4800, … 38400bps, 56Kbps, 115Kbps,… 每种波特率,对发送方,要求其精度必须高于 1%,而对接收方,必须允许 2%误差。61 GB/T ××××―××××3.3 3.3.1电气接口 多点串行总线结构图 19 展现的是 MODBUS 多点串行链路系统中串行总线结构的总貌。图 19: 串行总线基本结构一个 MODBUS 多点串行链路系统是由主电缆(主干),和一些可能的分支电缆组成。 在主干电缆的两端需要有线路终端以使阻抗匹配 (祥见§“2 线-MODBUS 定义” 和“可选 4 MODBUS 线定义” )。 如图 19 所示,不同的设备可以在同一个 MODBUS 串行链路系统中运行: ? 集成有通信收发器的设备通过无源接头和分支电缆连接到主干上(例如从站 1 和主站); ? 没有集成通信收发器的设备通过有源接头和分支电缆连接到主干上 (有源接头集成有收发器 ) (例如从站 2); ? 设备以菊花链形式直接连接到主干电缆上(例如从站 n) 我们采用下列规定: ? 主干间的接口称为 ITr(主干接口) ? 设备和无源接头间的接口称为 IDv (分支接口) ? 设备和有源接头间的接口称为 AUI (附加单元接口) 注: 1. 某些情况下,接头可能直接连接到设备的 IDv-插槽或 AUI-插槽上,而不使用分支电缆。 2.一个接头可能有几个 IDv 插槽以连接几台设备。当它是无源接头时,称为分配器。 3.当使用有源接头时,可以通过接头的 AUI 或 ITr 接口向其提供电源。62 GB/T ××××―××××在接 下来 的 章 节 中 , 我 们 将 介绍 ITr 和 IDv 接口 ( 见 §“2 线 -MODBUS 定 义” 和 “ 4 线 MODBUS 定义”) 3.3.2 2 线-MODBUS 定义 串行链路上的 MODBUS 解决方案应当依照 EIA/TIA-485 标准实现“2-线”电气接口。 在这个 2 线-总线上,在任何时候只有一个驱动器有权发送信号。 实际上,还有第三条导线把总线上所有设备相互连接:公共地。主设备5VD R上拉电阻D1LT平衡对 D0 公共地下拉电阻LTR D DR从设备 1从设备 2图 20: 2-线制的一般拓扑结构 2 线-MODBUS 电路定义 设备 设备需求 EIA/TIA-485 的命名 I/O I/O -X X X B/B’ A/A’ C/C’所需电路 在 ITr 上 在 IDv 上 D1 D1 D0 公共地 注: ? ? ? D0 公共地说明收发器端子 1,V1 电压 (V1 & V0 表示二进制 1[OFF]状态) 收发器端子 0,V0 电压 ( V0 & V1 表示二进制 0[ON]状态) 信号和可选的电源公共地对于线路终端(TL),即上拉和下拉电阻,请参考“多点系统要求”部分。 在与设备和接头有关的文件(用户指南,连线指南,…)中,必须使用 D0,D1 和公共地的电路 名字,以提高互操作能力。 可以增加可选的电气接口,例如: ? 电源: 5E24 V 直流电。? 端口模式控制: PMC 电路(TTL 兼容)。当需要的时候,可由这个外电路和/或另一种方式(如该 设备上的一个开关 ) 来控制端口模 式 。在第一种情况下, 尽 管 一个开路 PMC 将要求 2- 线63 GB/T ××××―××××MODBUS 模式,但实际上,在 PMC 上的低电平将把端口置 于 4-线 MODBUS 模式或 RS232MODBUS 模式。 3.3.3 可选的 4 线-MODBUS 定义 这种 MODBUS 设备同样允许实现 2 对总线(4 线)单向数据传输。在主对总线(RXD1-RXD2)上的数据 只能由从站接收,而在从对总线(TXD0-TXD1)上的数据只能由主站接收。 实际上,公共地作为第五条导线必须把 4-线总线上的所有设备相互连接。 和 2 线-MODBUS 一样,在任何时刻只有一个驱动器有权力发送数据。 这种设备必须依照 EIA/TIA-485 对每一对平衡线实现一个驱动器和一个收发器。 (有时候这种方式 被称为“RS422”,这是错误的:RS422 标准不支持几台设备在一对平衡线上。)主设备D R5 V上拉TXD1LT从对 TXD0下拉 上拉 5 VLTRXD1LT主对 RXD0下拉LT公共地R D DR从设备 1从设备 n图 21: 4--线制的一般拓扑结构64 GB/T ××××―××××所需电路 在 Itr 上 TXD1 在 IDv 上 TXD1可选 4 线-MODBUS 电路定义 设备 设备需求 EIA/TIA-485 的命名 Out X B对 IDv 的说明发生器端子 1,Vb 电压 (Vb&Va 表示二进制 1[OFF]状态)TXD0TXD0OutXA发生器端子 0,Va 电压 ( Va & Vb 表示二进制 0[ON]状态)RXD1RXD1In(1)B’接收器端子 1,Vb’电压 ( Vb’ & Va’表示二进制 1[OFF]状态 )RXD0RXD0In(1)A’接收器端子 0,,Va’电压 ( Va’ & Vb’表示二进制 0[ON]状态 )公共地 注: ? ? ? ?公共地--XC/C’信号和可选的电源公共地对于线路终端(LT),即上拉和下拉电阻,请参考“多点系统要求”部分。 仅当选择实现 4 线-MODBUS 时,才需表中(1)所示那些电路。 在与设备和接头有关的文件(用户指南,连线指南,…)中,必须使用这 5 类所需电路的名字,以提 高互操作能力。 可以增加可选的电气接口,例如: ? 电源: 5E24V 直流电。 见前述(2 线-MODBUS 电路定义)中关于该可选电路的注。? PMC 电路:3.3.3.1 4 线-电缆系统中的重点在这种 4 线-MODBUS 中,}

我要回帖

更多关于 can协议报文解析实例 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信