文章目录
一、总体描述
1. 协议描述
协议组成
MODBUS协议建立了客户机启动的请求格式格式
1.1 地址域
1.2 功能码域
用一个字节编码MODBUS数据单元。有效的码字范围是十进制1-255(128-255为异常响应保留)
向一些功能码加入子功能码来定义多项操作
1.3 数据域
数据域包括附加信息,使用这个信息执行功能码定义的操作。这个域还包括离散项目和寄存器地址、处理的项目数量以及域中的实际数据字节数
如果在一个正确接收的MODBUS ADU中,不出现与请求MODBUS功能有关的差错,那么服务器至客户机的响应数据域包括请求数据。如果出现与请求MODBUS功能有关的差错,那么域包括一个异常码,服务器应用能够使用这个域确定下一个执行的操作
- 对于正常响应,服务器仅对原始功能码响应
- 对于异常响应,服务器返回一个与原始功能码等同的码,设置该原始功能码的最高有效位为逻辑1
1.4 差错校验
2. PDU(功能码+数据域)
串行链路上第一个 MODBUS 执行的长度约束限制了 MODBUS PDU 大小(最大 RS485 ADU=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
2.1 MODBUS 请求 PDU
定义 mb_req_pdu 为:
mb_req_pdu = { function_code, request_data},其中
function_code - [1 个字节] MODBUS 功能码
request_data - [n 个字节],这个域与功能码有关,并且通常包括诸如可变参考、变量、数据偏移量、子功能码等信息。
2.2 MODBUS 响应 PDU
定义 mb_rsp_pdu 为:
mb_rsp_pdu = { function_code, response_ data},其中
function_code - [1 个字节] MODBUS 功能码
response_data - [n 个字节],这个域与功能码有关,并且通常包括诸如可变参考、变量、数据偏移量、子功能码等信息。
2.3 MODBUS 异常响应 PDU
定义 mb_excep_rsp_pdu 为:
mb_excep_rsp_pdu = { function_code, request_data},其中
function_code - [1 个字节] MODBUS 功能码 + 0x80
exception_code - [1 个字节],在下表中定义了 MODBUS 异常码。
3. 数据编码
大端对齐
4. MODBUS数据模型
基本表格 | 对象类型 | 访问类型 | 内容 |
---|---|---|---|
离散量输入 | 单个比特 | 只读 | I/O系统提供这种数据类型 |
线圈 | 单个比特 | 读写 | 通过应用程序改变这种类型数据 |
输入寄存器 | 16-比特字 | 只读 | I/O系统提供这种数据类型 |
保持寄存器 | 16-比特字 | 读写 | 通过应用程序改变这种类型数据 |
MODBUS 功能码中使用的 MODBUS 逻辑参考数字是以 0 开始的无符号整数索引
5. 事务处理的定义
下列状态图描述了在服务器侧 MODBUS 事务处理的一般处理过程
二、功能码分类
三类功能码
1. 公共功能码
1.1 特点
- 是较好地被定义的功能码
- 保证是唯一的
- MODBUS 组织可改变的
- 公开证明的
- 具有可用的一致性测试
- MB IETF RFC 中证明的
- 包含已被定义的公共指配功能码和未来使用的未指配保留供功能码
1.2 定义
类别 | 描述 | 功能码 | 功能子码 | 索引 |
---|---|---|---|---|
物理离散量输入 | 读输入离散量 | 02 | ||
内部比特或物理线圈 | 读线圈 | 01 | ||
写单个线圈 | 05 | |||
写多个线圈 | 15 | |||
输入存储器 | 读输入寄存器 | 04 | ||
内部存储器或物理输出存储器 | 读多个寄存器 | 03 | ||
写单个寄存器 | 06 | |||
写多个寄存器 | 16 | |||
读/写多个寄存器 | 23 | |||
屏蔽写寄存器 | 22 | |||
文件记录访问 | 读文件记录 | 20 | 6 | |
写文件记录 | 21 | 6 | ||
封装接口 | 读设备识别码 | 43 | 14 |
2. 用户定义功能码
2.1 特点
- 有两个用户定义功能码的定义范围,即 65 至 72 和十进制 100 至 110
- 用户没有 MODBUS 组织的任何批准就可以选择和实现一个功能码
- 不能保证被选功能码的使用是唯一的
- 如果用户要重新设置功能作为一个公共功能码,那么用户必须启动 RFC,以便将改变引入公共分类中,并且指配一个新的公共功能码
3. 保留功能码
三、功能码描述
1. 读保持寄存器(0x03)
在一个远程设备中,使用该功能码读取保持寄存器连续块的内容。请求 PDU 说明了起始寄存器地址和寄存器数量。
将响应报文中的寄存器数据分成每个寄存器有两字节,在每个字节中直接地调整二进制内容。
对于每个寄存器,大端对齐。
请求PDU | 功能码 | 起始地址 | 线圈数量 |
---|---|---|---|
字节数 | 1个字节 | 2个字节 | 2个字节 |
描述 | 0x03 | 0x0000至0xFFFF | 1至125(0x7D) |
响应PDU | 功能码 | 字节数 | 输入状态 |
---|---|---|---|
字节数 | 1个字节 | 2个字节 | N*×2 |
描述 | 0x03 | 2×N* |
N = 寄存器数量
错误 | 功能码 | 异常码 |
---|---|---|
字节数 | 1个字节 | 1个字节 |
描述 | 功能码 + 0x83 | 01或02或03或04 |
2. 读输入寄存器(0x04)
3. 写单个寄存器(0x06)
请求PDU | 功能码 | 寄存器地址 | 寄存器值 |
---|---|---|---|
字节数 | 1个字节 | 2个字节 | 2个字节 |
描述 | 0x06 | 0x0000至0xFFFF | 0x0000至0xFFFF |
响应PDU | 功能码 | 字节数 | 输入状态 |
---|---|---|---|
字节数 | 1个字节 | 2个字节 | 2个字节 |
描述 | 0x06 | 0x0000至0xFFFF | 0x0000至0xFFFF |
N = 寄存器数量
错误 | 功能码 | 异常码 |
---|---|---|
字节数 | 1个字节 | 1个字节 |
描述 | 功能码 + 0x86 | 01或02或03或04 |
4. 写多个寄存器(0x10)
请求PDU | 功能码 | 起始地址 | 寄存器数量 | 字节数 | 寄存器值 |
---|---|---|---|---|---|
字节数 | 1个字节 | 2个字节 | 2个字节 | 1个字节 | N×2个字节 |
描述 | 0x10 | 0x0000至0xFFFF | 0x0001至0x007B | 2×N | 值 |
响应PDU | 功能码 | 字节数 | 输入状态 |
---|---|---|---|
字节数 | 1个字节 | 2个字节 | 2个字节 |
描述 | 0x06 | 0x0000至0xFFFF | 0x0001至0x007B |
N = 寄存器数量
错误 | 功能码 | 异常码 |
---|---|---|
字节数 | 1个字节 | 1个字节 |
描述 | 功能码 + 0x86 | 01或02或03或04 |
四、MODBUS异常响应
异常响应报文有两个与正常响应不同的域:
功能码域:在正常响应中,服务器利用响应功能码域来应答最初请求的功能码。所有功能码的最高有效位(MSB)都为 0(它们的值都低于十六进制 80)。在异常响应中,服务器设置功能码的 MSB 为 1。这使得异常响应中的功能码值比正常响应中的功能码值高十六进制 80。
通过设置功能码的 MSB,客户机的应用程序能够识别异常响应,并且能够检测异常码的数据域。
数据域:在正常响应中,服务器可以返回数据域中数据或统计表(请求中要求的任何报文)。在异常响应中,服务器返回数据域中的异常码。这就定义了产生异常的服务器状态。
代码 | 名称 | 含义 |
---|---|---|
01 | 非法功能 | 对于服务器(或从站)来说,询问中接收到的功能码是不可允许的操作。这也许 是因为功能码仅仅适用于新设备而在被选单元中是不可实现的。同时,还指出 服务器(或从站)在错误状态中处理这种请求,例如:因为它是未配置的,并且 要求返回寄存器值。 |
02 | 非法数据地址 | 对于服务器(或从站)来说,询问中接收到的数据地址是不可允许的地址。特别 是,参考号和传输长度的组合是无效的。对于带有 100 个寄存器的控制器来说, 带有偏移量 96 和长度 4 的请求会成功,带有偏移量 96 和长度 5 的请求将产生 异常码 02。 GB/T ××××—×××× 42 |
03 | 非法数据值 | 对于服务器(或从站)来说,询问中包括的值是不可允许的值。这个值指示了组 合请求剩余结构中的故障,例如:隐含长度是不正确的。并不意味着,因为 MODBUS 协议不知道任何特殊寄存器的任何特殊值的重要意义,寄存器中被 提交存储的数据项有一个应用程序期望之外的值。 |
04 | 从站设备故障 | 当服务器(或从站)正在设法执行请求的操作时,产生不可重新获得的差错。 |
05 | 确认 | 与编程命令一起使用。服务器(或从站)已经接受请求,并切正在处理这个请求, 但是需要长的持续时间进行这些操作。返回这个响应防止在客户机(或主站)中 发生超时错误。客户机(或主站)可以继续发送轮询程序完成报文来确定是否完 成处理。 |
06 | 从属设备忙 | 与编程命令一起使用。服务器(或从站)正在处理长持续时间的程序命令。张服 务器(或从站)空闲时,用户(或主站)应该稍后重新传输报文。 |
08 | 存储奇偶性差错 | 与功能码 20 和 21 以及参考类型 6 一起使用,指示扩展文件区不能通过一致性 校验。 服务器(或从站)设法读取记录文件,但是在存储器中发现一个奇偶校验错误。 客户机(或主方)可以重新发送请求,但可以在服务器(或从站)设备上要求服务。 |
0A | 不可用网关路径 | 与网关一起使用,指示网关不能为处理请求分配输入端口至输出端口的内部通 信路径。通常意味着网关是错误配置的或过载的。 |
0B | 网关目标设备响应失败 | 与网关一起使用,指示没有从目标设备中获得响应。通常意味着设备未在网络 中 |