MUDBUS RTU
MODBUS-RTU报文模型
设备地址 | 功能代码 | 数据格式 | CRC校验L | CRC校验H |
---|
8bit | 8bit | N*8bit | 8bit | 8bit |
一个报文就是一帧数据,一个数据帧就一个报文: 指的是一串完整的指令数据,就像上面的一串数据。
主机写操作
如果从机接收到一个报文那么就对报文进行解析执行相应的处理
0x01 | 06 | 00 01 | 00 17 | 98 04 |
---|
从机地址 | 功能号 | 数据地址 | 数据 | CRC校验 |
主机读操作
0x01 | 03 | 00 01 | 00 01 | D5 CA |
---|
从机地址 | 功能号 | 数据地址 | 读取数据个数 | CRC校验 |
从机接收到这串数据根据数据计算CRC校验判断数据是否正确,如果判断数据无误,则结果是:返回信息给主机
从机响应
0x01 | 03 | 02 | 00 17 | F8 4A |
---|
从机地址 | 功能号 | 数据字节个数 | 两个字节数据 | CRC校验 |
这样MODBUS主机就完成了一次对从机数据的读操作,实现了通讯。
部分功能码
功能码 | 异常功能码(+ 0×80) | 中文名称 | 位操作/字操作 | 操作数量 |
---|
0×01 | 0×81 | 读线圈状态 | 位操作 | 单个或多个 |
0×02 | 0×82 | 读离散输入状态 | 位操作 | 单个或多个 |
0×03 | 0×83 | 读保持寄存器 | 字操作 | 单个或多个 |
0×04 | 0×84 | 读输入寄存器 | 字操作 | 单个或多个 |
0×05 | 0×85 | 写单个线圈 | 位操作 | 单个 |
0×06 | 0×86 | 写单个保持寄存器 | 字操作 | 单个 |
0×0F | 0×8F | 写多个线圈 | 位操作 | 多个 |
0×10 | 0×90 | 写多个保持寄存器 | 字操作 | 多个 |
异常码
代码 | 名称 | 含义 |
---|
01 | 非法功能 | 对于服务器(或从站)来说,询问中接收到的功能码是不可允许的操作。这也许是因为功能码仅仅适用于新设备而在被选单元中是不可实现的。同时,还指出服务器(或从站)在错误状态中处理这种请求,例如:因为它是未配置的,并且要求返回寄存器值。 |
02 | 非法数据地址 | 对于服务器(或从站)来说,询问中接收到的数据地址是不可允许的地址。特别是,参考号和传输长度的组合是无效的。对于带有 100 个寄存器的控制器来说,带有偏移量 96 和长度 4 的请求会成功,带有偏移量 96 和长度 5 的请求将产生异常码 02。 |
03 | 非法数据值 | 对于服务器(或从站)来说,询问中包括的值是不可允许的值。这个值指示了组合请求剩余结构中的故障,例如:隐含长度是不正确的。并不意味着,因为MODBUS 协议不知道任何特殊寄存器的任何特殊值的重要意义,寄存器中被提交存储的数据项有一个应用程序期望之外的值。 |
04 | 从站设备故障 | 当服务器(或从站)正在设法执行请求的操作时,产生不可重新获得的差错。 |
05 | 确认 | 与编程命令一起使用。服务器(或从站)已经接受请求,并且正在处理这个请求,但是需要长的持续时间进行这些操作。返回这个响应防止在客户机(或主站)中发生超时错误。客户机(或主站)可以继续发送轮询程序完成报文来确定是否完成处理。 |
06 | 从属设备忙 | 与编程命令一起使用。服务器(或从站)正在处理长持续时间的程序命令。当服务器(或从站)空闲时,用户(或主站)应该稍后重新传输报文。 |
0A | 不可用网关路径 | 与网关一起使用,指示网关不能为处理请求分配输入端口至输出端口的内部通信路径。通常意味着网关是错误配置的或过载的。 |
0B | 网关目标设备响应失败 | 与网关一起使用,指示没有从目标设备中获得响应。通常意味着设备未在网络中。 |
- 用来为客户机提供处理过程中与被发现的差错相关的信息
- 功能码域:响应功能码 = 请求功能码 + 0x80
- 数据域:提供一个异常码来指示差错原因
- 校验码:响应帧自身计算
从站地址 | 功能码 | 数据 | 校验码(低位) | 校验码(高位) |
---|
从站自身地址 | 请求功能码 + 0x80 | 异常码 | XX | XX |
数据帧格式
从站地址 | 功能码 | 起始地址(高位) | 起始地址(低位) | 数量(高位) | 数量(低位) | 校验码(低位) | 校验码(高位) |
---|
0x01 | 0x01 | 0x00 | 0x13 | 0x00 | 0x1B | XX | XX |
含义:
目标所在从站:0x01
命令:0x01
目标起始索引地址:0x0013
读取线圈数量:0x1B(1B = 27个,即27bit数据)
从站地址 | 功能码 | 字节计数 | 字节一 | 字节二 | 字节三 | 字节四 | 校验码(低位) | 校验码(高位) |
---|
0x01 | 0x01 | 0x04 | 0xCD | 0x6B | 0xB2 | 0x05 | XX | XX |
含义: 返回从站读取的共4个字节的数据,数据为:0xCD、0x6B、0xB2、0x05,校验码为XXXX。
补充: 由于读取的是线圈(bit),若读取的个数不为8的倍数,比如这次读27bit,则取整数字节4字节32bit返回,剩余5bit用0补全。
从站地址 | 功能码 | 起始地址(高位) | 起始地址(低位) | 数量(高位) | 数量(低位) | 校验码(低位) | 校验码(高位) |
---|
0x01 | 0x03 | 0x00 | 0x06 | 0x00 | 0x02 | XX | XX |
含义:
目标所在从站:0x01
命令:0x03(读保持寄存器)
目标起始索引地址:0x0006
读取寄存器数量:0x02(2个,即2×2byte = 4byte数据)
从站地址 | 功能码 | 字节计数 | 字节一(高位) | 字节一(低位) | 字节二(高位) | 字节二(低位) | 校验码(低位) | 校验码(高位) |
---|
0x01 | 0x03 | 0x02 | 0xA1 | 0x05 | 0x04 | 0xCD | XX | XX |
含义:
返回从站读取的共2个寄存器的数据,数据为:0xA105、0x04CD,校验码为XXXX。
MODBUS TCP/IP
帧格式
其相比RTU在协议数据单元前增加了MBAP报文头,去除了检验码,其他数据格式相同。
事务元处理标识符(高位) | 事务元处理标识符(低位) | 协议标识符(高位) | 协议标识符(低位) | 长度(高位) | 长度(低位) | 单元标识符 | 功能码 | 起始地址(高位) | 起始地址(低位) | 寄存器数量(高位) | 寄存器数量(低位) |
---|
- 事务元处理标识符:用于事务处理配对。在响应中,MODBUS 服务器复制请求的事务处理标识符。
- 协议标识符:用于系统内的多路复用。通过值 0识别 MODBUS 协议。
- 长度:长度域是下一个域的字节数,包括单元标识符和数据域。
- 单元标识符:为了系统内路由,使用这个域。专门用于通过以太网 TCP-IP 网络和 MODBUS 串 行链路之间的网关对 MODBUS或MODBUS+串行链路从站的通信。MODBUS 客户机在请求中设置 这个域,在响应中服务器必须利用相同的值返回这个域。
原始文章
https://blog.youkuaiyun.com/qq_41965346/article/details/118760449