MODBUS规约报文解析
报文格式,报文全部为16进制,遥信状态需要转换为二进制:
主站发送报文 |
地址 |
功能码 |
寄存器起始地址 |
读取数据长度 |
CRC校验码 | |||
01 |
03 |
01 |
00 |
00 |
02 |
C5 |
F7 | |
说明 |
设备地址 |
设备的规约或点表查看 |
从设备的:0x0100H 寄存器读取遥信状态,可以在规约或寄存器点表中查看。 |
读取:0x0100H、0x0101H 两个寄存器数据,一共读取32个遥信位置。 |
可通过串口软件自动计算出 |
主站接受报文 |
地址 |
功能码 |
数据长度 |
寄存器1状态0100H |
寄存器2状态0101H |
CRC校验码 | |||
01 |
03 |
04 |
03 |
43 |
00 |
00 |
0B |
A3 | |
说明 |
设备地址 |
设备的规约或点表查看 |
表示收到4个数据 |
高位状态 |
低位状态 |
高位 |
低位 |
设备自动计算出 |
MODBUS-RTU报文模型
设备地址 |
功能代码 |
数据格式 |
CRC校验L |
CRC校验H |
8bit |
8bit |
N*8bit |
8bit |
8bit |
一个报文就是一帧数据,一个数据帧就一个报文: 指的是一串完整的指令数据,就像上面的一串数据。
主机对从机读数据操作
0x01 |
03 |
00 01 |
00 01 |
D5 CA |
从机地址 |
功能号 |
数据地址 |
读取数据个数 |
CRC校验 |
从机对主机返回内容
0x01 |
03 |
02 |
00 17 |
F8 4A |
从机地址 |
功能号 |
数据字节个数 |
两个字节数据 |
CRC校验 |
这样MODBUS主机就完成了一次对从机数据的读操作,实现了通讯。
MODBUS-RTU常用功能码
数据类型 |
读功能码 |
写功能码 |
对象类型 |
离散量输入 |
02 |
|
单个位 |
线圈状态 |
01 |
05,15 |
单个位 |
输入寄存器 |
04 |
|
16位字 |
保持寄存器 |
03 |
06,16 |
16位字 |
寄存器起始地址(起始数据地址)
数据类型 |
参数地址,寄存器编号 |
离散量输入 |
00001~0FFFF |
线圈状态 |
10001~1FFFF |
输入寄存器 |
30001~3FFFF |
保持寄存器 |
40001~4FFFF |
报文实例
遥控点号:开关操作=0300H 合操作
TX: 01 06 03 0000 02 08 4F //06表示遥控功能码,02表示分操作;
RX: 01 06 03 0000 02 08 4F //06表示遥控功能码,02表示分操作;
遥控点号:开关操作=0300H 分操作
TX: 01 06 03 0000 01 48 4E //06表示遥控功能码,01表示分操作;
RX: 01 06 03 0000 01 48 4E //06表示遥控功能码,01表示分操作;
遥测报文:每个遥测值占用2个字节,即1个寄存器,最大值为:0x0000H~0xFFFFH,即:0~65535。
发送数据:01 03 02 00 00 0D 85 B7 //16时27分02秒
接收数据:01 03 1A 00 00 00 00 00 00 1E AE 00 00 1EAD 1E AD 00 00 00 00 00 00 00 00 00 00 6A 96 77 67总召换的电度
共有4个电度:
正向有功积分电度=0301H 10000.000(0x00989680),
正向无功积分电度=0302H 0.000 (0x0),
反向有功积分电度=0303H 0.000(0x0),
反向无功积分电度=0304H 0.000(0x0)。
TX:01 03 81 02 00 08 CD F0 //8102为总召唤,00 08 为数据长度
RX: 01 03 10 0098 96 80 00 00 00 00 00 00 00 00 00 00 00 00 15 64 //10为报文数据长度。
电度:( 03命令码) |
寄存器号 |
遥测报文值 |
转换 10进制值 |
正向有功积分电度 |
0301H |
00 98 96 80 |
10000000 |
正向无功积分电度 |
0302H |
00 00 00 00 |
0 |
反向有功积分电度 |
0303H |
00 00 00 00 |
0 |
反向无功积分电度 |
0304H |
00 00 00 00 |
0 |