第1章 Modbus Rtu 通信协议
1.1 读取保持寄存器(单个和多个,以字为最小单位)
1.1.1 发送命令帧:
设备地址 | 功能码 | 地址H | 地址L | 数据量H | 数据量L | CRC H | CRC L |
Addr0 | 3 H | HoldStart | DataNum | CRC高位 | CRC低位 |
l 帧 长 度:8个字节
l 设备地址:1~247
l 功 能 码:3H
l 数据地址:0~65535 具体范围与相关设备有关
l 数 量:1~65535 具体范围与相关设备有关
l 校 验 码:CRC16校验
1.1.2 返回命令帧:
设备地址 | 功能码 | 数据量 | 数据1 | 数据N | CRC H | CRC L |
Addr1 | 3 H | 返回数据的字节数N | Data (1~N) | CRC高位 | CRC低位 |
l 帧 长 度:5+N 个字节
l 设备地址:1~247
l 功 能 码:3H
l 数 据 量:实际的读取数据数量
l 数 据:返回数据的意义
l a=HoldStart
l n= DataNum-1
VW a (VB a) | VWa(VB a+1) | … | VW a+n(VB a+n) | VWa+n(VB a+n+1) |
Data(1) | Data(2) | … | Data(N-1) | Data(N) |
l 校 验 码:CRC16校验
l
1.1.3 命令有误:
l 1) 没有任何返回
l 2) 返回异议帧
设备地址 | 功能码 | 错误信息 | CRC H | CRC L |
Addr1 | 83 H | 一个字节的错误信息 | CRC高位 | CRC低位 |
1.2 设置保持寄存器(多个,以字为最小单位)
1.2.1 发送命令帧:
设备地址 | 功能码 | 地址H | 地址L | 数据量H | 数据量L | 数据字节数 | 具体数据 | CRC H | CRC L |
Addr0 | 10 H | HoldStart | DataNum | bytN | 1~bytN | CRC高位 | CRC低位 |
l 帧 长 度:9+bytN 个字节
l 设备地址:1~247
l 功 能 码:10H
l 数据地址:0~65535 具体范围与相关设备有关
l 数 量:1~122 具体范围与相关设备有关
l 字 节 数:设置的字节个数 bytN= DataNum×2
l 数 据:具体的字节数据
l 校 验 码:CRC16校验
1.2.2 返回命令帧:
设备地址 | 功能码 | 地址H | 地址L | 数据量H | 数据量L | CRC H | CRC L |
Addr1 | 10 H | HoldStart | DataNum | CRC高位 | CRC低位 |
l 帧 长 度:8 个字节
l 设备地址:1~247
l 功 能 码:10H
l 数据地址:0~65535 具体范围与相关设备有关
l 数 量:1~122 具体范围与相关设备有关
l 校 验 码:CRC16校验
1.2.3 命令有误:
l 没有任何返回
l 返回异议帧
地址 | 功能码 | 错误信息 | CRC H | CRC L |
Addr1 | 90 H | 一个字节的错误信息 | CRC高位 | CRC低位 |
1.3 总结
编写通信相关的程序,其实协议和开发语言并不重要,重要的是对通信双方的通信设备的特点,性能要有充分了解,这样才能开发出可靠,高效的通信程序。