Modbus通信协议
概述
- Modbus 协议是应用层报文传输协议,包括ASCII、RTU、TCP三种报文类型.
- Modbus 协议采用 master/slave 方式(主从方式)通信.
- Modbus 采用大端字节顺序传输报文. 例如: 一个 16 位数据 0x55AA, 先传输高字节 0x55, 再传输低字节 0xAA.
寄存器
线圈寄存器
- 一个寄存器占据一个 bit 的空间, 每个 bit 表示一个开关量.线圈寄存器支持读也支持写, 写在功能码里面又分为写单个线圈寄存器和写多个线圈寄存器.
- 线圈概念取自继电器,继电器线圈得电吸合(布尔量为 1 ), 失电松开(布尔量为 0).
读线圈寄存器
- 功能码: 0x01.
写单个线圈寄存器
- 功能码: 0x05.
写多个线圈寄存器
- 功能码: 0x0f.
离散输入寄存器
- 一个寄存器占据一个 bit 的空间, 每个 bit 表示一个开关量,其开关量只能读取输入的开关信号,是不能够写的.例如读取外部按键的按下还是松开.
读离散输入寄存器
- 功能码: 0x02.
| 从站地址 | 功能码 | 起始地址高位 | 起始地址低位 | 、寄存器数量高位 | 寄存器数量低位 | CRC高位 | CRC低位 |
| 0x01 | 0x02 | 0x00 | 0xC4 | 0x00 | 0x16 | 0xB8 | 0x39 |
- 从机地址为 01H,读取的离散输入寄存器的起始地址为 00C4H, 读取 0x16H = 22 个寄存器.
| 从站地址 | 功能码 | 字节数 | 数据1 | 数据2 | 数据3 | CRC高位 | CRC低位 |
| 0x01 | 0x02 | 0x03 | 0xAC | 0xDB | 0x35 | 0x22 | 0x88 |
- 0xACH = 10101100(1 代表开关量 ON, 0 代表开关量 OFF). 由低位到高位对应 00C4H ~ 00CBH.
- 0xDBH = 11011011(1 代表开关量 ON, 0 代表开关量 OFF). 由低位到高位对应 00CCH ~ 00D3H.
- 0x35H = 00110101(1 代表开关量 ON, 0 代表开关量 OFF). 由低位到高位对应 00D4H ~ 00D9H,高位两位用 0 填充.
保持寄存器
- 一个寄存器占据两个byte(16个bit)的空间, 即可以存放具体的数据量,并且是可读写的.写也分为单个写和多个写.一般对应参数设置, 例如设置时间年月日, 不但可以写也可以读出来现在的时间.
读保持寄存器
- 功能码: 0x03.
| 从站地址 | 功能码 | 起始地址高位 | 起始地址低位 | 、寄存器数量高位 | 寄存器数量低位 | CRC高位 | CRC低位 |
| 0x01 | 0x03 | 0x00 | 0x6B | 0x00 | 0x03 | 0x74 | 0x17 |
- 从机地址为 01H,读取的保持寄存器的起始地址为 006BH,读取 0x03H = 3 个寄存器.
| 从站地址 | 功能码 | 字节数 | 寄存器1高位 | 寄存器1低位 | 、寄存器2高位 | 寄存器2低位 | 寄存器3高位 | 寄存器3低位 | CRC高位 | CRC低位 |
| 0x01 | 0x03 | 0x06 | 0x00 | 0x6B | 0x00 | 0x13 | 0x00 | 0x00 | 0xF5 | 0x79 |
- 006BH 寄存器的数据: 0x006B.
- 006CH 寄存器的数据: 0x0013.
- 006DH 寄存器的数据: 0x0000.
写单个保持寄存器
- 功能码: 0x06.
写多个保持寄存器
- 功能码: 0x10.
输入寄存器
- 一个寄存器占据两个 byte 的空间. 但是只支持读而不能写,一般是读取各种实时数据.例如过读取输入寄存器获取现在的 AD 采集值.
读输入寄存器
- 功能码: 0x04.