物联网-ModBus-RTU
■ 优秀博主链接
■ ModBus-RTU介绍
发送:从机的地址+我要干嘛的功能码+我要查的寄存器的地址+我要查的寄存器地址的个数+校验码
回复:从机的地址+主机发我的功能码+要发送给主机数据的字节数+数据+校验码
■(1)帧结构
一个字节 | 一个字节 | N个字节 | 两个字节 |
---|---|---|---|
地址 ---------------- |
功能码 ------------------------ |
数据 ------------------------------------------------------------------ |
校验 -------------- |
01 读取线圈状态 取得一组逻辑线圈的当前状态(ON/OFF) |
|||
02 读取输入状态 取得一组开关输入的当前状态(ON/OFF) |
|||
03 读取保持寄存器 在一个或多个保持寄存器中取得当前的二进制值 |
|||
04 读取输入寄存器 在一个或多个输入寄存器中取得当前的二进制值 |
|||
05 强置单线圈 强置一个逻辑线圈的通断状态 |
|||
06 预置单寄存器 放置一个特定的二进制值到一个单寄存器中 |
|||
07 读取异常状态 取得8个内部线圈的通断状态 |
|||
15 强置多线圈 强置一串连续逻辑线圈的通断 |
|||
16 预置多寄存器 放置一系列特定的二进制值到一系列多寄存器中 |
|||
17 报告从机标识 可使主机判断编址从机的类型及该从机运行指示灯的状态 |
■(2)查询功能码 0x03
一个寄存器两个字节
主机发送: 01 03 00 00 00 01 84 0A
从机回复: 01 03 02 19 98 B2 7E
一个字节 | 一个字节 | N个字节 | 两个字节 |
---|---|---|---|
地址 | 功能码 | 数据 | 校验 |
发送 | |||
01 传感器的地址 |
03 查询功能码 |
00 00 起始寄存器地址 00 01 代码查询寄存器个数 |
84 0A 循环冗余校验 |
回复 | |||
01 传感器的地址 |
03 查询功能码 |
02 后面2个数据 19 98 寄存器的值 |
B2 7E 循环冗余校验 |
例如:
发送长度为 00 04 个寄存器个数,返回 08
■(3)修改单个寄存器功能码 0x06
06代表修改单个寄存器功能,一个寄存器为两个字节。
主机发送: 01 06 00 00 00 01 48 0A
从机回复: 01 06 00 00 00 01 48 0A
一个字节 | 一个字节 | N个字节 | 两个字节 |
---|---|---|---|
发送 | |||
01 | 06 | 00 00 00 01 |
48 0A |
从机地址 | 功能码 | 00 00 要修改寄存器地址 00 01 要修改的值 |
循环冗余校验 |
回复 | |||
01 | 06 | 00 00 00 01 |
48 0A |
从机返回给主机自己的地址 | 修改单个寄存器功能 | 00 00代表修改的起始寄存器地址 00 01代表修改的值 |
循环冗余校验 |
■(4)Modbus RTU 串口收发数据分析
主发和接收数据分析
==========poll 读取的第0个数据为20
Tx:01 03 00 00 00 0A C5 CD
Rx:01 03 14 00 14 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 96 94
01 地址
03 功能码 03:读取保持寄存器
00 00 查的寄存器的地址
00 0A 查的寄存器地址的个数 10个 10*2 = 20字节
C5 CD 校验码
01 地址
03 功能码 03:读取保持寄存器
14 长度 0x14 == 20个字节
00 14 00 00 00 00 00 00 00 00 查的寄存器地址的个数 14 == 0x14 == 20
00 00 00 00 00 00 00 00 00 00 查的寄存器地址的个数
96 94 校验码
==========poll 读取的第0个数据为10
Tx:01 03 00 00 00 0A C5 CD
Rx:01 03 14 00 0A 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 38 BE
Tx: --------------
01 地址
03 功能码 03:读取保持寄存器
00 00 查的寄存器的地址
00 0A 查的寄存器地址的个数 10个 10*2 = 20字节
C5 CD 校验码
Rx: --------------
01 地址
03 功能码 03:读取保持寄存器
14 长度 0x14 == 20个字节
00 0A 00 00 00 00 00 00 00 00 查的寄存器地址的个数 0A == 0x0A == 10
00 00 00 00 00 00 00 00 00 00 查的寄存器地址的个数
38 BE 校验码