线圈寄存器 |
开关量 |
位操作 |
可读可写 |
0x01 0x05 0x0f |
离散输入寄存器 |
开关量 |
位操作 |
只读 |
0x02 |
保持寄存器 |
具体值 |
字操作 |
可读可写 |
0x03 0x06 0x10 |
输入寄存器 |
具体值 |
字操作 |
只读 |
0x04 |
读操作
命令 |
从机地址 |
功能码 |
寄存器起始地址 |
寄存器数量 |
CRC |
字节数 |
1 |
1 |
2 |
2 |
2 |
响应 |
从机地址 |
功能码 |
数据字节长度 |
数据字节 |
CRC |
字节数 |
1 |
1 |
1 |
分为读字和读位两种情况 |
2 |
读位:
命令:02 01 00 00 00 03 7C 38
告诉从机02,要读取从0开始的连续三个位寄存器,校验码是7C 38
响应:02 01 01 05 91 CF
02为从机地址,01为功能码,第二个01表示接下来的数据有1个字节(8个位)。05是十六进制表示,转换为二进制0000 0101,即所读的寄存器1是0,寄存器2是0,寄存器3是1.
写操作
写单个寄存器
命令 |
从机地址 |
功能码 |
寄存器起始地址 |
写入值 |
CRC |
字节数 |
1 |
1 |
2 |
2 |
2 |
响应 |
原帧发送给主机 |
|
|
|
|
|
|
|
|
|
|
写多个寄存器
命令 |
从机地址 |
功能码 |
寄存器起始地址 |
寄存器数量 |
写入数据字节长度 |
数据 |
CRC |
字节数 |
1 |
1 |
2 |
2 |
1 |
分写字/写位两种情况 |
2 |
响应 |
从机地址 |
功能码 |
寄存器起始地址 |
寄存器数量 |
CRC |
|
|
字节数 |
1 |
1 |
2 |
2 |
2 |
|
|
注意;
1. Modbus传输的最小单位是字节,数据部分报文是16进制表示,一个数表示4位。
2.低地址的寄存器数据先进入发送报文。
3.报文中的起始地址、寄存器数量都是高字节在前。
4.读字时,1字=2字节,数据字节长度=所读寄存器数量×2;读位时,需要具体讨论。
5.主机是主动发起请求的,从机是只会响应的。
注:本人刚学习modbus,文章仅供参考,如有错误请谅解