写数据主要用于遥控,遥调和对时等操作,本质是通过写寄存器的方式来实现的。
写数据分成两种,一种是写单个寄存器,功能码一般用5和6
格式如下:
请求报文格式:
MBAP报文头报文中的长度:设备地址长度+功能码长度+寄存器地址长度+需要写的值的长度 = 6
回复报文格式:
MBAP报文头报文中的长度:设备地址长度+功能码长度+寄存器地址长度+需要写的值的长度 = 6
黄色表示MODBUS_TCP报文包含的部分,蓝色表示MODBUS_RTU表示报文包含的部分。
差别就是MODBUS_TCP多一个MBAP报文头,少一个校验码
MODBUS_RTU是少一个MBAP报文头,多一个校验码
我们看到收发报文的格式基本一致,长度也一样。
因此这个开发是比较好做的。
有个约定,就是遥控00FF表示遥控合,0000表示分。
报文例子:
00 00 00 00 00 06 --> 传输标志2字节:0,协议标识2字节:0,报文长度2字节:6
01 --> 从机地址:1(温湿度)
05 --> 功能码:5,强置单线圈
00 7B --> 写寄存器起始地址:123
00 00 --> 控制值:0(无符号)0(有符号)(遥控分0000,遥调值为0)
2024/11/15 08:49:40.147 <<-- 00 00 00 00 00 06 01 05 00 7B 00 00
00 00 00 00 00 06 --> 传输标志2字节:0,协议标识2字节:0,报文长度2字节:6
01 --> 从机地址:1(温湿度)
05 --> 功能码:5,强置单线圈
00 7B --> 写寄存器起始地址:123
00 00 --> 控制值:0(无符号)0(有符号)(遥控分0000,遥调值为0)
2024/11/15 08:49:42.228 -->> 00 00 00 00 00 06 01 05 01 C8 FF 00
00 00 00 00 00 06 --> 传输标志2字节:0,协议标识2字节:0,报文长度2字节:6
01 --> 从机地址:1(温湿度)
05 --> 功能码:5,强置单线圈
01 C8 --> 写寄存器起始地址:456
FF 00 --> 控制值:65280(无符号)-256(有符号)(遥控合FF00)
2024/11/15 08:49:42.261 <<-- 00 00 00 00 00 06 01 05 01 C8 FF 00
00 00 00 00 00 06 --> 传输标志2字节:0,协议标识2字节:0,报文长度2字节:6
01 --> 从机地址:1(温湿度)
05 --> 功能码:5,强置单线圈
01 C8 --> 写寄存器起始地址:456
FF 00 --> 控制值:65280(无符号)-256(有符号)(遥控合FF00)
00 00 00 00 00 06 --> 传输标志2字节:0,协议标识2字节:0,报文长度2字节:6
01 --> 从机地址:1(温湿度)
06 --> 功能码:6,预置单寄存器
03 15 --> 写寄存器起始地址:789
04 57 --> 控制值:1111(无符号)1111(有符号)(遥调值)
2024/11/15 08:51:50.972 <<-- 00 00 00 00 00 06 01 06 03 15 04 57
00 00 00 00 00 06 --> 传输标志2字节:0,协议标识2字节:0,报文长度2字节:6
01 --> 从机地址:1(温湿度)
06 --> 功能码:6,预置单寄存器
03 15 --> 写寄存器起始地址:789
04 57 --> 控制值:1111(无符号)1111(有符号)(遥调值)
标签:00,字节,--,报文,遥调,MODBUS,地址,-----,寄存器
From: https://blog.csdn.net/XZHOUMIN/article/details/143785269