概述

  1. Modbus 协议是应用层报文传输协议,包括ASCIIRTUTCP三种报文类型.
  2. Modbus 协议采用 master/slave 方式(主从方式)通信.
  3. Modbus 采用大端字节顺序传输报文. 例如: 一个 16 位数据 0x55AA, 先传输高字节 0x55, 再传输低字节 0xAA.

寄存器

线圈寄存器

  1. 一个寄存器占据一个 bit 的空间, 每个 bit 表示一个开关量.线圈寄存器支持读也支持写, 写在功能码里面又分为写单个线圈寄存器和写多个线圈寄存器.
  2. 线圈概念取自继电器,继电器线圈得电吸合(布尔量为 1 ), 失电松开(布尔量为 0).

+ 读线圈寄存器
  1. 功能码: 0x01.
+ 写单个线圈寄存器
  1. 功能码: 0x05.
+ 写多个线圈寄存器
  1. 功能码: 0x0f.

离散输入寄存器

  1. 一个寄存器占据一个 bit 的空间, 每个 bit 表示一个开关量,其开关量只能读取输入的开关信号,是不能够写的.例如读取外部按键的按下还是松开.
+ 读离散输入寄存器
  1. 功能码: 0x02.
发送
从站地址 功能码 起始地址高位 起始地址低位寄存器数量高位 寄存器数量低位 CRC高位 CRC低位
0x01 0x02 0x00 0xC4 0x00 0x16 0xB8 0x39
  1. 从机地址为 01H,读取的离散输入寄存器的起始地址为 00C4H, 读取 0x16H = 22 个寄存器.
响应
从站地址 功能码 字节数 数据1 数据2 数据3 CRC高位 CRC低位
0x01 0x02 0x03 0xAC 0xDB 0x35 0x22 0x88
  1. 0xACH = 10101100(1 代表开关量 ON, 0 代表开关量 OFF). 由低位到高位对应 00C4H ~ 00CBH.
  2. 0xDBH = 11011011(1 代表开关量 ON, 0 代表开关量 OFF). 由低位到高位对应 00CCH ~ 00D3H.
  3. 0x35H = 00110101(1 代表开关量 ON, 0 代表开关量 OFF). 由低位到高位对应 00D4H ~ 00D9H,高位两位用 0 填充.

保持寄存器

  1. 一个寄存器占据两个byte(16个bit)的空间, 即可以存放具体的数据量,并且是可读写的.写也分为单个写和多个写.一般对应参数设置, 例如设置时间年月日, 不但可以写也可以读出来现在的时间.
+ 读保持寄存器
  1. 功能码: 0x03.
发送
从站地址 功能码 起始地址高位 起始地址低位寄存器数量高位 寄存器数量低位 CRC高位 CRC低位
0x01 0x03 0x00 0x6B 0x00 0x03 0x74 0x17
  1. 从机地址为 01H,读取的保持寄存器的起始地址为 006BH,读取 0x03H = 3 个寄存器.
响应
从站地址 功能码 字节数 寄存器1高位 寄存器1低位寄存器2高位 寄存器2低位 寄存器3高位 寄存器3低位 CRC高位 CRC低位
0x01 0x03 0x06 0x00 0x6B 0x00 0x13 0x00 0x00 0xF5 0x79
  1. 006BH 寄存器的数据: 0x006B.
  2. 006CH 寄存器的数据: 0x0013.
  3. 006DH 寄存器的数据: 0x0000.
+ 写单个保持寄存器
  1. 功能码: 0x06.
+ 写多个保持寄存器
  1. 功能码: 0x10.

输入寄存器

  1. 一个寄存器占据两个 byte 的空间. 但是只支持读而不能写,一般是读取各种实时数据.例如过读取输入寄存器获取现在的 AD 采集值.
+ 读输入寄存器
  1. 功能码: 0x04.

参考链接

  1. 开关量
  2. AI,DI,AO,DO
  3. Modbus功能码
  4. 图文详解Modbus-RTU协议
  5. Modbus-RTU协议
  6. Modbus协议详解与案例演示
  7. Modbus协议理解
  8. Modbus TCP 示例报文
  9. ModbusTCP协议报文详细分析
  10. modbus通讯时数据发送顺序
  11. modbus