第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 总结
编写通信相关的程序,其实协议和开发语言并不重要,重要的是对通信双方的通信设备的特点,性能要有充分了解,这样才能开发出可靠,高效的通信程序。