ModBus协议报文格式解析说明

什么是Modbus?

       Modbus协议是一个master/slave架构的协议。有一个节点是master节点,其他使用Modbus协议参与通信的节点是slave节点。每一个slave设备都有一个唯一的地址。在串行和MB+网络中,只有被指定为主节点的节点可以启动一个命令(在以太网上,任何一个设备都能发送一个Modbus命令,但是通常也只有一个主节点设备启动指令)。

       一个ModBus命令包含了打算执行的设备的Modbus地址。所有设备都会收到命令,但只有指定位置的设备会执行及回应指令(地址0例外,指定地址0的指令是广播指令,所有收到指令的设备都会运行,不过不回应指令)。所有的Modbus命令包含了检查码,以确定到达的命令没有被破坏。基本的ModBus命令能指令一个RTU改变它的寄存器的某个值,控制或者读取一个I/O端口,以及指挥设备回送一个或者多个其寄存器中的数据。

      以上都是参考百度百科的解释说明,还是没有看明白的同学可以先不用管,至少现在我们需要有一个概念,modbus通信中会有两个设备,一个是主机poll端和从机salve端,接下来看下面的进一步说明。

Modbus TCP/IP协议格式

  • 主机poll端发送读写报文样例如下,该报文对应的功能码选择的04。

07 9B 00 00 00 06 01 04 00 00 00 0A

数据

含义

07 9B

主机发出的检验信息,从机slave将这个两个字节放在响应报文中

00 00

表示协议标识符,00 00为modbus的TCP/IP协议

00 06

数据长度

### Modbus 协议报文格式解析 #### Modbus RTU 报文结构 Modbus RTU 的通用报文格式定义了一个严格的公式规范,所有通信报文必须遵循这一规范[^1]。具体来说: - **设备地址 (Address)**:1 字节,表示目标设备的地址。 - **功能码 (Function Code)**:1 字节,指示要执行的操作类型。 - **数据区 (Data Area)**:可变长度的数据字段,具体内容取决于所选的功能码。 - **错误检测域 (Error Check)**:2 字节 CRC 校验码。 对于异常情况下的响应,其格式略有不同: - 设备地址保持不变; - 功能码变为原请求功能码加上 `0x80`; - 后跟一个字节的异常码; - 结束于 2 字节的 CRC 校验码[^4]。 ```python def modbus_rtu_crc(data): crc = 0xFFFF for pos in data: crc ^= pos for _ in range(8): if (crc & 1) != 0: crc >>= 1 crc ^= 0xA001 else: crc >>= 1 return [(crc >> 8) & 0xFF, crc & 0xFF] # 示例:构建一条读取寄存器值的命令帧 address = b'\x01' # 假设目标设备地址为1 function_code = b'\x03' # 使用功能码03来读取多个保持寄存器 start_address = b'\x00\x0A'# 起始寄存器地址为10 quantity = b'\x00\x05' # 请求读取5个寄存器 data_to_send = address + function_code + start_address + quantity crc_bytes = bytes(modbus_rtu_crc(data_to_send)) complete_frame = data_to_send + crc_bytes print(complete_frame.hex()) ``` #### Modbus TCP/IP 报文结构 在基于以太网传输层上的实现中,除了上述基本组成部分外,还增加了额外的信息头用于网络层面的支持[^3]: - **事务标识符 (Transaction Identifier)**:2 字节,唯一识别一次完整的会话过程。 - **协议标识符 (Protocol Identifier)**:固定为 `00 00`,表明采用的是标准 Modbus TCP 方式。 - **长度 (Length)**:2 字节,指明后续有效载荷部分的实际大小。 - **单元标识符 (Unit ID)**:通常设置成与物理连接中的站号相同,默认情况下为 `FF FF` 或者省略不填。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值