modbus写多个保持寄存器具体组帧
时间: 2023-10-11 18:05:01 浏览: 100
通过stm32来实现modbus协议,作为主站实现的,实现对寄存器的单读单写多读多写
4星 · 用户满意度95%
在Modbus协议中,写多个保持寄存器的请求消息格式如下:
| 字节偏移 | 0 | 1 | 2 | 3 | 4 | 5至N |
| -------- | --------- | --------- | --------- | --------- | ---------- | --------- |
| 内容 | 事务标识 | 协议标识 | 数据长度 | 从站地址 | 功能码(16) | 数据内容 |
其中,数据内容包括以下字段:
| 字节偏移 | 0 | 1 | 2 | 3 | 4 | ... | N-3 | N-2 | N-1 | N |
| -------- | ---------- | ----------- | ---------- | --------- | --------- | --------- | ---------- | ---------- | ---------- | ---------- |
| 内容 | 起始地址高 | 起始地址低 | 寄存器数量高 | 寄存器数量低 | 字节数 | 寄存器值1 | 寄存器值2 | ... | 寄存器值n | CRC校验码 |
其中:
- 起始地址:表示要写入的起始保持寄存器地址,由两个字节组成,高字节在前。
- 寄存器数量:表示要写入的保持寄存器数量,由两个字节组成,高字节在前。
- 字节数:表示要写入的数据字节数,即寄存器数量乘以2。
- 寄存器值:表示要写入的保持寄存器的值,每个寄存器由两个字节组成,高字节在前。
- CRC校验码:表示整个消息的校验码,由两个字节组成,高字节在前,使用标准Modbus CRC算法计算。
举个例子,如果要将地址为0x0001、0x0002和0x0003的三个保持寄存器写入值为0x1234、0x5678和0x9abc,则可以发送如下的Modbus请求消息(假设从站地址为1):
| 字节偏移 | 0x00 | 0x01 | 0x02 | 0x03 | 0x04 | 0x05 | 0x06 | 0x07 | 0x08 | 0x09 | 0x0A | 0x0B |
| -------- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- |
| 内容 | 0x00 | 0x01 | 0x00 | 0x00 | 0x00 | 0x06 | 0x10 | 0x00 | 0x01 | 0x00 | 0x03 | 0x06 |
其中,0x00和0x01分别表示事务标识,0x00和0x00表示协议标识,0x00和0x06表示数据长度(不包括地址、功能码和CRC校验码),0x10表示功能码(16表示写多个保持寄存器),0x00和0x01表示起始地址,0x00和0x03表示寄存器数量,0x06表示数据字节数,0x1234、0x5678和0x9abc分别表示三个保持寄存器的值,0x9f和0x3b表示CRC校验码。
阅读全文