MODBUS报文

MUDBUS RTU

MODBUS-RTU报文模型

设备地址功能代码数据格式 CRC校验LCRC校验H
8bit8bitN*8bit8bit8bit

一个报文就是一帧数据,一个数据帧就一个报文: 指的是一串完整的指令数据,就像上面的一串数据。

主机写操作

如果从机接收到一个报文那么就对报文进行解析执行相应的处理

0x010600 01 00 17 98 04
从机地址功能号数据地址数据CRC校验

主机读操作

0x010300 01 00 01 D5 CA
从机地址功能号数据地址读取数据个数CRC校验

从机接收到这串数据根据数据计算CRC校验判断数据是否正确,如果判断数据无误,则结果是:返回信息给主机

从机响应

0x010302 00 17 F8 4A
从机地址功能号数据字节个数 两个字节数据CRC校验

这样MODBUS主机就完成了一次对从机数据的读操作,实现了通讯。

部分功能码

功能码异常功能码(+ 0×80)中文名称位操作/字操作操作数量
0×010×81读线圈状态位操作单个或多个
0×020×82读离散输入状态位操作单个或多个
0×030×83读保持寄存器字操作单个或多个
0×040×84读输入寄存器字操作单个或多个
0×050×85写单个线圈位操作单个
0×060×86写单个保持寄存器字操作单个
0×0F0×8F写多个线圈位操作多个
0×100×90写多个保持寄存器字操作多个

异常码

代码名称含义
01非法功能对于服务器(或从站)来说,询问中接收到的功能码是不可允许的操作。这也许是因为功能码仅仅适用于新设备而在被选单元中是不可实现的。同时,还指出服务器(或从站)在错误状态中处理这种请求,例如:因为它是未配置的,并且要求返回寄存器值。
02非法数据地址对于服务器(或从站)来说,询问中接收到的数据地址是不可允许的地址。特别是,参考号和传输长度的组合是无效的。对于带有 100 个寄存器的控制器来说,带有偏移量 96 和长度 4 的请求会成功,带有偏移量 96 和长度 5 的请求将产生异常码 02。
03非法数据值对于服务器(或从站)来说,询问中包括的值是不可允许的值。这个值指示了组合请求剩余结构中的故障,例如:隐含长度是不正确的。并不意味着,因为MODBUS 协议不知道任何特殊寄存器的任何特殊值的重要意义,寄存器中被提交存储的数据项有一个应用程序期望之外的值。
04从站设备故障当服务器(或从站)正在设法执行请求的操作时,产生不可重新获得的差错。
05确认与编程命令一起使用。服务器(或从站)已经接受请求,并且正在处理这个请求,但是需要长的持续时间进行这些操作。返回这个响应防止在客户机(或主站)中发生超时错误。客户机(或主站)可以继续发送轮询程序完成报文来确定是否完成处理。
06从属设备忙与编程命令一起使用。服务器(或从站)正在处理长持续时间的程序命令。当服务器(或从站)空闲时,用户(或主站)应该稍后重新传输报文。
0A不可用网关路径与网关一起使用,指示网关不能为处理请求分配输入端口至输出端口的内部通信路径。通常意味着网关是错误配置的或过载的。
0B网关目标设备响应失败与网关一起使用,指示没有从目标设备中获得响应。通常意味着设备未在网络中。
  1. 用来为客户机提供处理过程中与被发现的差错相关的信息
  2. 功能码域:响应功能码 = 请求功能码 + 0x80
  3. 数据域:提供一个异常码来指示差错原因
  4. 校验码:响应帧自身计算
从站地址功能码数据校验码(低位)校验码(高位)
从站自身地址请求功能码 + 0x80异常码XXXX

数据帧格式

  • 请求帧(0x01)
从站地址功能码起始地址(高位)起始地址(低位)数量(高位)数量(低位)校验码(低位)校验码(高位)
0x010x010x000x130x000x1BXXXX

含义:
目标所在从站:0x01
命令:0x01
目标起始索引地址:0x0013
读取线圈数量:0x1B(1B = 27个,即27bit数据)

  • 响应帧(0x01)
从站地址功能码字节计数字节一字节二字节三字节四校验码(低位)校验码(高位)
0x010x010x040xCD0x6B0xB20x05XXXX

含义: 返回从站读取的共4个字节的数据,数据为:0xCD、0x6B、0xB2、0x05,校验码为XXXX。
补充: 由于读取的是线圈(bit),若读取的个数不为8的倍数,比如这次读27bit,则取整数字节4字节32bit返回,剩余5bit用0补全。

  • 请求帧(0x03)
从站地址功能码起始地址(高位)起始地址(低位)数量(高位)数量(低位)校验码(低位)校验码(高位)
0x010x030x000x060x000x02XXXX

含义:
目标所在从站:0x01
命令:0x03(读保持寄存器)
目标起始索引地址:0x0006
读取寄存器数量:0x02(2个,即2×2byte = 4byte数据)

  • 响应帧(0x03)
从站地址功能码字节计数字节一(高位)字节一(低位)字节二(高位)字节二(低位)校验码(低位)校验码(高位)
0x010x030x020xA10x050x040xCDXXXX

含义:
返回从站读取的共2个寄存器的数据,数据为:0xA105、0x04CD,校验码为XXXX。

MODBUS TCP/IP

帧格式

其相比RTU在协议数据单元前增加了MBAP报文头,去除了检验码,其他数据格式相同。

事务元处理标识符(高位)事务元处理标识符(低位)协议标识符(高位)协议标识符(低位)长度(高位)长度(低位)单元标识符功能码起始地址(高位)起始地址(低位)寄存器数量(高位)寄存器数量(低位)
  1. 事务元处理标识符:用于事务处理配对。在响应中,MODBUS 服务器复制请求的事务处理标识符。
  2. 协议标识符:用于系统内的多路复用。通过值 0识别 MODBUS 协议。
  3. 长度:长度域是下一个域的字节数,包括单元标识符和数据域。
  4. 单元标识符:为了系统内路由,使用这个域。专门用于通过以太网 TCP-IP 网络和 MODBUS 串 行链路之间的网关对 MODBUS或MODBUS+串行链路从站的通信。MODBUS 客户机在请求中设置 这个域,在响应中服务器必须利用相同的值返回这个域。

原始文章

https://blog.youkuaiyun.com/qq_41965346/article/details/118760449

尽管提供的引用并未直接涉及 Modbus 协议的内容,但以下是关于 Modbus 协议报文结构及其常见问题排查的相关信息。 ### Modbus 报文结构 Modbus 是一种工业通信协议,广泛用于设备之间的数据交换。其报文结构可以分为两种主要模式:ASCII 和 RTU(Remote Terminal Unit)。这两种模式的主要区别在于帧的编码方式以及校验方法的不同。 #### ASCII 模式下的报文结构 在 ASCII 模式下,消息由字符组成,便于人类阅读和调试。每条消息都以冒号 `:` 开始,并以回车换行符 `<CR><LF>` 结束。具体字段如下: - **起始字符**: 冒号 (`:`)[^2] - **地址域**: 主机发送给从机的目标地址,范围为 0 到 255。 - **功能码**: 定义操作类型的功能代码,例如读线圈状态、写单个寄存器等。 - **数据区**: 实际传输的数据部分,长度取决于请求或响应的具体需求。 - **错误检测域**: 使用 LRC(纵向冗余校验)来验证数据完整性[^3] #### RTU 模式下的报文结构 RTU 模式的效率更高,因为它采用二进制表示而非文本形式。它不包含可见字符分隔符,而是依赖时间间隔区分不同帧。 - **地址字节**: 类似于 ASCII 的目标地址字段。 - **功能码字节**: 同样指示所需执行的操作。 - **数据段**: 可变大小的有效负载区域。 - **CRC 校验**: 循环冗余检验用来保障数据准确性[^4] ### 解决与 Modbus 报文相关的问题 当遇到 Modbus 数据交互中的异常情况时,可以从以下几个方面入手分析原因并解决问题: 1. **确认物理连接正常** - 确保 RS-485 或其他介质上的接线无误,终端电阻设置恰当。 2. **检查波特率配置一致** - 所有参与通讯节点需设定相同的串口参数,包括但不限于比特率、停止位数等。 3. **核对地址分配唯一性** - 防止多个从站共享同一 ID 导致冲突现象发生。 4. **验证 CRC/LRC 计算正确与否** - 如果接收端报告校验失败,则可能是由于线路干扰或者软件实现缺陷引起。 5. **利用工具辅助诊断过程** - 借助专门设计的监控程序捕获实际流量以便进一步研究潜在瓶颈所在位置。 ```python import minimalmodbus instrument = minimalmodbus.Instrument('/dev/ttyUSB0', slaveaddress=1) # 设置串口号及从站地址 instrument.serial.baudrate = 9600 # 波特率为9600bps value_read = instrument.read_register(registeraddress=4, functioncode=3) print(f"Register Value: {value_read}") ``` 上述 Python 脚本展示了如何通过 MinimalModbus 库轻松访问远程硬件资源的一个简单例子。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值