来源:JSY-KJ(健思研科技)
发布时间:2026-04-03
MODBUS 协议在一根通讯线上采用主从应答方式的通讯连接方式。首先,主计算机的信号 寻址到一台唯一地址的终端设备(从机),然后,终端设备发出的应答信号以相反的方向传输 给主机,即:在一根单独的通讯线上信号沿着相反的两个方向传输所有的通讯数据流(半双工的工作模式)
MODBUS报文格式
设备地址/从站地址: 1个字节 指定目标设备地址(从站地址)
功能码:1个字节 功能码在modbus协议用于表示信息帧的功能,例如读取线圈状态、读取寄存器等。
数据: N个字节 后面数据根据不同功能码不同。
CRC校验:循环冗余校验码,用于检测报文完整性和数据错误
MODBUS常用功能码

MODBUS读取数据
MODBUS校验

功能码03发送报文函数

功能码06写单个寄存器

功能码10写多个寄存器

功能码发送函数

功能码03解析函数

功能码06解析函数

功能码10解析函数

清空接受

中断接收数据组包

MODBUS解析
首先我们先通过手册去看电能数据的起始地址,在结合我们的功能码读取相应数据,并通过手册的解析公式转换后得到最后的电能。

功能码03读一个或多个寄存器解析
注意:以产品手册为例
请求:01 03 00 48 00 0A 45 DB(读0048开始的10个寄存器)
第1位01设备地址
第2位03功能码
第3,4位00 48起始地址
第5,6位00 0A查询寄存器长度,查询10个寄存器
第7,8位45 DB是CRC校验码
响应:01 03 14 5F C0 01 8F 03 D5 00 00 07 C0 03 E8 00 00 01 E6 6E 5E 13 86 F9 F1
前2位设备地址和功能码,同请求发送的报文
第3位14是后面数据位的长度,每一个寄存器长度为2个字节,所以总长20(0x14)
第4位开始,20位都是数据位
对照我们电能数据表红色数据
第4,5位5F C0对应 0048 寄存器,即为电压:0x5FC0=24512,根据公式除以 100 为 245.12V
第6,7位01 8F电流:0x018F:根据公式除以 100 为 3.99A
第8,9位03 D5有功功率:0x03D5:根据公式981W
第10,11, 12,13位00 00 07 C0电能:0x000007C0:根据公式除以 3200为 62KWh
第14,15位03 E8功率因素:0x018F:根据公式除以 1000 为1
第16,17,18,19位00 00 01 E6二氧化氮排放量:0x000001E6:根据公式除以 1000 为 486Kg
第17,18位6E 5E温度:0x018F:根据公式除以 1000 为 28.254度
第19,20位13 86频率:0x1386:根据公式除以 100 为 49.98Hz
如果我们要更改模块的ID和通信速率,就需要功能码06和10去更改。如果是想一次一次改就用功能码06分别去改ID和波特率,功能码10就可以一次性改。首先我们先根据手册去看模块默认的ID和波特率。如下图:

功能码06写单个寄存器解析
请求:01 06 00 04 00 37 89 DD
向地址为4的寄存器写入55。
第1位01设备地址
第2位06功能
第3,4位00 04写入的起始地址
第5,6位00 37写入寄存器的值
第7,8位89 DD位CRC校验码
响应:01 06 00 04 00 37 89 DD
写入成功,响应报文与写入报文一致
功能码10写多个寄存器解析
改ID和波特率
请求:02 10 00 04 00 01 02 01 06 32 B6
第1位02设备地址
第2位10功能码
第3,4位00 04写入的起始地址
第5,6位00 01寄存器数量
第7位02字节计数
第8位01表示改的ID
第9位06表示改的波特率
第10,11位32 B6表示校验码
响应:01 10 00 04 00 01 40 08
第1位01设备地址
第2位10功能码
第3,4位00 04写入的起始地址
第5,6位00 01寄存器数量
第7,8位位CRC校验码
结果如下图:
