1. 数据类型与存储区分类
Modbus协议将数据分为四类存储区,通过存储区代号区分:
-
输出线圈(0x):可读写,对应二进制开关量(如继电器状态),地址范围
000001-065536
(绝对地址)。 -
输入线圈(1x):只读,用于读取外部设备状态(如传感器开关),地址范围
100001-165536
。 -
输入寄存器(3x):只读,存储16位数据(如温度值),地址范围
300001-365536
。 -
输出寄存器(4x):可读写,用于控制设备参数(如设定频率),地址范围
400001-465536
。
每个存储区最多支持65536个元素(线圈或寄存器),通过偏移量定位具体地址。
2. 地址模型
Modbus有两种地址表示方式:
-
PLC地址模型:直接使用存储区代号+偏移量,如
D100
表示D区第100个字,M10
表示M区第10个位。 -
Modbus地址模型:采用六位绝对地址,由存储区代号+(偏移量+1)组成。
-
例如:
-
4区第1个寄存器 →
400001
(绝对地址),对应偏移量0。 -
4区第100个寄存器 →
400100
(绝对地址),对应偏移量99。
-
为何协议报文中使用相对地址?
协议报文中仅包含偏移量(从0开始),结合功能码即可确定存储区。若用绝对地址(如400001),可能因功能码冲突导致歧义。
3. 长地址 vs 短地址模型
-
长地址模型:六位数地址,覆盖全范围(如
400001-465536
),适用于PLC等复杂系统。 -
短地址模型:五位数地址,范围缩小(如输出线圈
00001-09999
),常见于仪表、变频器等简单设备,便于配置。
示例转换:
PLC的D100
对应Modbus长地址400100
(4区偏移量99),而短地址可能直接表示为40099
。
4. 协议分类
Modbus协议根据传输方式和介质分为多种类型:
-
串口通信(RS232/485/422):
-
Modbus RTU:二进制编码,高效,使用CRC校验。
-
Modbus ASCII:文本编码,可读性强,效率较低,使用LRC校验。
-
-
以太网通信:
-
Modbus TCP:基于TCP/IP,无校验,适用于工业以太网。
-
Modbus RTU/ASCII Over TCP/UDP:将串口协议封装在TCP/UDP包中,兼容旧设备。
-
5. 功能码说明
功能码是操作指令的代号,定义了对存储区的读写行为:
-
读取操作:
-
01
:读取输出线圈(如继电器状态)。 -
02
:读取输入线圈(如传感器开关)。 -
03
:读取输出寄存器(如读取PLC参数)。 -
04
:读取输入寄存器(如采集温度值)。
-
-
写入操作:
-
05
:写入单个线圈(如控制继电器通断)。 -
0F
:写入多个线圈。 -
06
:写入单个寄存器(如修改频率设定)。 -
10
:写入多个寄存器
-
6. 关键总结
-
存储区与地址:通过功能码+偏移量定位数据,长地址兼容全范围,短地址简化配置。
-
协议选择:RTU适合高效串口通信,TCP用于以太网,ASCII便于调试。
-
功能码核心作用:明确操作类型(读/写)和目标存储区,是协议交互的核心指令。
示例应用:
若要读取变频器的运行频率(存储在输出寄存器4x,地址400010),使用功能码03
,发送偏移量9(因绝对地址400010对应偏移量9)。设备返回该寄存器的16位数据值。
7.ModbusRTU通信报文分析
7.1 ModbusRTU通信格式说明
-
从站地址
-
作用:标识数据发送或接收的目标设备,确保信息准确传递。
-
格式:占用1个字节,取值范围为1-255(通常0为广播地址,但根据需求可能被禁用)。
-
-
功能码
-
作用:定义设备执行的操作类型(如读取或写入数据)。
-
格式:占用1个字节,支持8种基本功能码(如01读取线圈、03读取保持寄存器等)。
-
-
数据部分
-
作用:配合功能码提供操作所需参数,内容因功能而异。
-
格式:
-
读取操作:包含起始地址(2字节)和读取长度(2字节),共4字节。
-
写入操作:包含目标地址(2字节)及写入数据(N字节),长度可变。
-
-
-
校验部分
-
作用:通过CRC-16校验算法验证报文完整性,防止传输错误。
-
格式:占用2个字节,附加在报文末尾。
-
7.2 功能码01读取输出线圈
1.发送报文(主机请求)
格式:
从站地址(1字节) + 功能码01(1字节) + 起始地址(2字节) + 线圈数量(2字节) + CRC校验(2字节)
作用:请求读取从站设备的输出线圈状态。
案例解析(读取1号从站,地址0开始的10个线圈):
-
Tx:
01 01 00 00 00 0A BC 0D
-
01
:从站地址(设备1)。 -
01
:功能码(读取输出线圈)。 -
00 00
:起始线圈地址(大端格式,地址0)。 -
00 0A
:读取线圈数量(十进制10)。 -
BC 0D
:CRC校验值。
-
2.接收报文(从站响应)
格式:
从站地址(1字节) + 功能码01(1字节) + 字节计数(1字节) + 数据(N字节) + CRC校验(2字节)
作用:返回请求的线圈状态,数据按二进制位压缩为字节。
案例解析(响应数据):
-
Rx:
01 01 02 55 01 47 6C
-
01
:从站地址(设备1)。 -
01
:功能码(成功响应)。 -
02
:字节计数(后续数据占2字节)。 -
55 01
:线圈状态(十六进制转二进制):-
55
→0101 0101
(线圈0-7状态:1、0、1、0、1、0、1、0)。 -
01
→0000 0001
(线圈8-15状态:仅线圈8=1,后续补零)。 -
实际有效数据:线圈0-9(共10位)为
1,0,1,0,1,0,1,0,1,0
。
-
-
47 6C
:CRC校验值。
-
3.关键说明
-
数据对齐规则:
-
线圈状态按位打包为字节,高位在前(如
55
对应二进制01010101
)。 -
若请求的线圈数量不足8的倍数,高位补零(例如10个线圈占用2字节,实际有效位为前10位)。
-
-
异常处理:
-
若请求失败,功能码高位置1(如
81
表示异常),并返回错误码(如非法地址或数量)。
-
-
地址范围:
-
起始地址和线圈数量均为16位无符号整数(0-65535),但需符合设备实际地址范围。
-
总结:
-
功能码01专用于读取输出线圈的开关状态,报文结构简洁高效。
-
发送端指定目标地址和读取范围,接收端返回压缩的二进制数据,需按位解析。
-
案例中通过
55 01
的二进制转换,清晰展示了线圈的实际状态分布。
7.3 功能码02读取输入线圈
1.发送报文(主机请求)
格式:从站地址(1字节) + 功能码02(1字节) + 起始地址(2字节) + 线圈数量(2字节) + CRC16校验(2字节)
作用:请求读取从站设备的输入线圈状态(输入线圈为只读类型,区别于功能码01的输出线圈)。
案例解析(读取2号从站,地址10开始的16个输入线圈):
-
Tx:
02 02 00 0A 00 10 59 F7
-
02
:从站地址(设备2)。 -
02
:功能码(读取输入线圈)。 -
00 0A
:起始地址(十六进制0x000A,十进制10)。 -
00 10
:读取数量(十六进制0x0010,十进制16)。 -
59 F7
:CRC16校验值。
-
2.接收报文(从站响应)
格式:
从站地址(1字节) + 功能码02(1字节) + 字节计数(1字节) + 数据(N字节) + CRC16校验(2字节)
作用:返回输入线圈的二进制状态,数据按字节压缩,每比特对应一个线圈。
案例解析(响应数据):
-
Rx:
02 02 02 15 00 F3 28
-
02
:从站地址(设备2)。 -
02
:功能码(成功响应)。 -
02
:字节计数(后续数据占2字节)。 -
15 00
:线圈状态(十六进制转二进制):-
15
→0001 0101
(地址10-17状态):-
地址10(比特7):0
-
地址11(比特6):0
-
地址12(比特5):0
-
地址13(比特4):1
-
地址14(比特3):0
-
地址15(比特2):1
-
地址16(比特1):0
-
地址17(比特0):1
-
-
00
→0000 0000
(地址18-25状态,均为0)。 -
实际有效数据:共16个线圈(地址10-25),状态为
0,0,0,1,0,1,0,1, 0,0,0,0,0,0,0,0
。
-
-
F3 28
:CRC16校验值。
-
3.关键说明
-
功能码02与01的区别:
-
功能码01:读取输出线圈(可读写,如继电器控制)。
-
功能码02:读取输入线圈(只读,如传感器输入状态)。
-
-
数据对齐规则:
-
线圈状态按比特打包为字节,每字节包含8个线圈,高位对应较低地址(如字节
15
的比特7对应起始地址10)。 -
若请求的线圈数量不足8的倍数,高位补零(例如16个线圈占用2字节,共16比特)。
-
-
地址范围限制:
-
起始地址和线圈数量为16位无符号整数(0-65535),但需确保不超过设备支持的最大地址范围。
-
-
异常处理:
-
若请求非法地址或超限数量,从站返回功能码高位+1(如
82
表示异常),并附加错误码(如01
表示非法功能)。
-
4.总结:
-
功能码02专用于读取输入线圈的实时状态,适用于监测传感器、开关输入等只读场景。
-
报文结构与功能码01类似,但操作对象不同,需注意线圈类型(输入/输出)的区分。
-
案例中通过
15 00
的二进制解析,直观展示了输入线圈的状态分布,验证了Modbus数据压缩的高效性。 -
7.4功能码03读取保持型寄存器
1.发送报文(主机请求)
格式:
从站地址(1字节) + 功能码03(1字节) + 起始地址(2字节) + 寄存器数量(2字节) + CRC16校验(2字节)
作用:请求读取从站设备的保持型寄存器数据(可读写的16位数据,如配置参数、传感器数值等)。
案例解析(读取3号从站,地址5开始的2个寄存器):
-
Tx:
03 03 00 05 00 02 D5 E8
-
03
:从站地址(设备3)。 -
03
:功能码(读取保持寄存器)。 -
00 05
:起始地址(十六进制0x0005,十进制5)。 -
00 02
:读取数量(2个寄存器)。 -
D5 E8
:CRC16校验值。
-
2.接收报文(从站响应)
格式:
从站地址(1字节) + 功能码03(1字节) + 字节计数(1字节) + 数据(N字节,每寄存器占2字节) + CRC16校验(2字节)
作用:返回寄存器的16位数据值,按大端格式(高位在前)排列。
案例解析(响应数据):
-
Rx:
03 03 04 00 64 00 C8 99 BA
-
03
:从站地址(设备3)。 -
03
:功能码(成功响应)。 -
04
:字节计数(后续数据占4字节,对应2个寄存器 × 2字节)。 -
00 64
:第一个寄存器值(十六进制0x0064,十进制100)。 -
00 C8
:第二个寄存器值(十六进制0x00C8,十进制200)。 -
99 BA
:CRC16校验值。
-
3.关键说明
-
寄存器数据格式:
-
每个寄存器为16位无符号整数(0-65535),按大端格式传输(高位字节在前)。
-
若需读取浮点数或长整型数据,需将多个寄存器组合解析(如4字节浮点数占用2个连续寄存器)。
-
-
地址范围限制:
-
起始地址和寄存器数量为16位无符号整数(0-65535),但需确保不超过设备支持的地址范围。
-
-
异常处理:
-
若请求非法地址或超限数量,从站返回功能码
83
(0x83),并附加错误码(如02
表示非法地址)。
-
-
功能码区分:
-
功能码03:读取保持寄存器(可读写)。
-
功能码04:读取输入寄存器(只读,如模拟量输入)。
-
4.总结:
-
功能码03专用于读取保持型寄存器的数值,适用于获取或修改设备的配置参数、运行数据等。
-
报文结构清晰,数据以大端格式直接传输,便于解析为整数或进一步转换为其他数据类型。
-
案例中读取地址5和6的寄存器,返回值
00 64
和00 C8
直观展示了十进制100和200的存储形式,体现Modbus数据通信的标准化与高效性。
验证:
7.5 功能码04读取输入寄存器
1.发送报文(主机请求)
格式:
从站地址(1字节) + 功能码04(1字节) + 起始地址(2字节) + 寄存器数量(2字节) + CRC16校验(2字节)
作用:请求读取从站设备的输入寄存器数据(输入寄存器为只读类型,如传感器模拟量输入值)。
案例解析(读取4号从站,地址10开始的5个输入寄存器):
-
Tx:
04 04 00 0A 00 05 10 5E
-
04
:从站地址(设备4)。 -
04
:功能码(读取输入寄存器)。 -
00 0A
:起始地址(十六进制0x000A,十进制10)。 -
00 05
:读取数量(5个寄存器)。 -
10 5E
:CRC16校验值。
-
2.接收报文(从站响应)
格式:
从站地址(1字节) + 功能码04(1字节) + 字节计数(1字节) + 数据(N字节,每寄存器占2字节) + CRC16校验(2字节)
作用:返回输入寄存器的16位数值,按大端格式(高位在前)排列。
案例解析(响应数据):
-
Rx:
04 04 0A 00 01 00 02 00 03 00 04 00 05 36 EA
-
04
:从站地址(设备4)。 -
04
:功能码(成功响应)。 -
0A
:字节计数(十进制10,对应5个寄存器 × 2字节)。 -
寄存器数据:
-
00 01
:地址10的寄存器值(十进制1)。 -
00 02
:地址11的寄存器值(十进制2)。 -
00 03
:地址12的寄存器值(十进制3)。 -
00 04
:地址13的寄存器值(十进制4)。 -
00 05
:地址14的寄存器值(十进制5)。
-
-
36 EA
:CRC16校验值。
-
3.关键说明
-
功能码04与03的区别:
-
功能码03:读取保持寄存器(可读写,如设备配置参数)。
-
功能码04:读取输入寄存器(只读,如传感器采集的模拟量值)。
-
-
数据格式:
-
每个寄存器为16位无符号整数(0-65535),按大端格式传输(高位字节在前)。
-
若需解析浮点数或多寄存器组合数据,需根据设备协议进一步转换。
-
-
地址范围限制:
-
起始地址和寄存器数量为16位无符号整数(0-65535),需确保在设备支持的地址范围内。
-
-
异常处理:
-
若请求非法地址或超限数量,从站返回功能码
84
(0x84),并附加错误码(如02
表示非法地址)。
-
4.总结:
-
功能码04专用于读取输入寄存器的实时数据,适用于获取传感器、仪表等设备的模拟量输入值。
-
报文结构与功能码03一致,但功能码和数据类型不同,需注意区分操作对象(输入/保持寄存器)。
-
案例中返回的寄存器值
00 01
至00 05
直观展示了连续地址的数值递增,体现了Modbus数据解析的标准化特性。
在POLL软件上显示的也是一样的,串口助手偏底层,POLL偏应用层一点
7.6 功能码05写入单输出线圈
1.发送报文(主机请求)
格式:
从站地址(1字节) + 功能码05(1字节) + 线圈地址(2字节) + 写入值(2字节) + CRC16校验(2字节)
作用:控制从站设备的单个输出线圈状态(置位ON或复位OFF)。
写入值规则:
-
FF 00
:置位线圈(ON)。 -
00 00
:复位线圈(OFF)。 -
其他值无效,从站可能返回异常响应。
案例(写入1号从站,地址1的线圈置位):
-
Tx:
01 05 00 01 FF 00 DD FA
-
01
:从站地址(设备1)。 -
05
:功能码(写入单线圈)。 -
00 01
:目标线圈地址(十进制1)。 -
FF 00
:写入值(置位)。 -
DD FA
:CRC16校验值。
-
2.接收报文(从站响应)
格式:
从站地址(1字节) + 功能码05(1字节) + 线圈地址(2字节) + 写入值(2字节) + CRC16校验(2字节)
作用:从站原样返回写入的地址和值,确认操作成功。
正确案例(成功响应):
-
Rx:
01 05 00 01 FF 00 DD FA
-
报文内容与发送端完全一致,表示线圈已成功置位。
-
用户案例问题修正
-
原案例错误:
-
发送报文末尾多出
00 00
,导致长度异常(应为8字节,实际为10字节)。 -
修正后:
01 05 00 01 FF 00 DD FA
(长度8字节,符合规范)。
-
3.关键说明
-
功能码05与06的区别:
-
功能码05:操作单线圈(开关量输出),写入值仅支持
FF 00
(ON)或00 00
(OFF)。 -
功能码06:操作单寄存器(16位数值),写入值为任意合法整数。
-
-
地址对齐:
-
线圈地址为16位无符号整数(0-65535),需与设备定义的线圈地址范围一致。
-
-
异常处理:
-
若地址非法或写入值错误,从站返回功能码
85
(0x85),并附加错误码(如02
表示非法地址)。
-
4.总结:
-
功能码05专用于控制输出线圈的开关状态,报文需严格遵循
FF 00
或00 00
的写入值格式。 -
发送与接收报文内容完全一致,确保操作可靠性。
-
案例中通过
FF 00
实现线圈置位,CRC校验值DD FA
验证了报文的完整性。
7.7 功能码06写入单寄存器
1.发送报文(主机请求)
格式:
从站地址(1字节) + 功能码06(1字节) + 寄存器地址(2字节) + 写入值(2字节) + CRC16校验(2字节)
作用:向从站设备的单个保持寄存器写入16位数据(如配置参数、控制值等)。
案例解析(写入3号从站,地址5的寄存器值为200):
-
Tx:
03 06 00 05 00 C8 99 BF
-
03
:从站地址(设备3)。 -
06
:功能码(写入单寄存器)。 -
00 05
:目标寄存器地址(十进制5)。 -
00 C8
:写入值(十六进制0x00C8,十进制200)。 -
99 BF
:CRC16校验值。
-
2.接收报文(从站响应)
格式:
从站地址(1字节) + 功能码06(1字节) + 寄存器地址(2字节) + 写入值(2字节) + CRC16校验(2字节)
作用:从站原样返回写入的地址和值,确认操作成功。
案例解析(成功响应):
-
Rx:
03 06 00 05 00 C8 99 BF
-
报文内容与发送端完全一致,表示寄存器值已成功修改为200。
-
3.关键说明
-
数据格式:
-
写入值为16位无符号整数(0-65535),按大端格式传输(高位字节在前)。
-
若需写入浮点数或长整型数据,需将数值拆分到多个寄存器(如4字节浮点数占用2个连续寄存器)。
-
-
功能码区分:
-
功能码06:写入单寄存器(保持型寄存器,可读写)。
-
功能码10:写入多个寄存器(批量操作)。
-
-
地址范围限制:
-
寄存器地址为16位无符号整数(0-65535),需确保在设备支持的地址范围内。
-
-
异常处理:
-
若地址非法或数据无效,从站返回功能码
86
(0x86),并附加错误码(如03
表示非法数据值)。
-
4.总结:
-
功能码06专用于修改单个保持寄存器的数值,适用于设备参数配置或实时控制场景。
-
发送与接收报文完全一致,确保操作可靠性,CRC校验保障数据传输完整性。
-
案例中通过
00 C8
写入十进制200,直观体现了Modbus数据通信的标准化与高效性。
7.8 功能码0F写入多输出线圈
1.发送报文(主机请求)
格式:
从站地址(1字节) + 功能码0F(1字节) + 起始地址(2字节) + 线圈数量(2字节) + 字节计数(1字节) + 数据(N字节) + CRC16校验(2字节)
作用:批量设置多个输出线圈的开关状态(1=置位,0=复位),数据按二进制位压缩传输。
案例解析(写入1号从站,地址0开始的8个线圈全部置位):
-
Tx:
01 0F 00 00 00 08 01 FF BE D5
-
解析:
-
01
:从站地址(设备1)。 -
0F
:功能码(写入多线圈)。 -
00 00
:起始地址(十进制0)。 -
00 08
:写入线圈数量(8个)。 -
01
:字节计数(8个线圈需1字节)。 -
FF
:数据(二进制11111111
,8个线圈全置位)。 -
BE D5
:CRC16校验值。
-
-
2.接收报文(从站响应)
格式:
从站地址(1字节) + 功能码0F(1字节) + 起始地址(2字节) + 线圈数量(2字节) + CRC16校验(2字节)
作用:返回写入的起始地址和线圈数量,确认操作成功。
案例解析(成功响应):
-
Rx:
01 0F 00 00 00 08 54 0D
-
解析:
-
01
:从站地址(设备1)。 -
0F
:功能码(成功响应)。 -
00 00
:起始地址(与发送一致)。 -
00 08
:写入的线圈数量(8个)。 -
54 0D
:CRC16校验值。
-
-
3.关键说明
-
数据对齐规则:
-
线圈数量不足8的倍数时,数据字节的高位补零(如写入9个线圈需2字节,第2字节高位7位补零)。
-
案例中8个线圈对应1字节数据
FF
(二进制全1),表示全部置位。
-
-
功能码区分:
-
功能码0F:批量写入输出线圈(开关量,可读写)。
-
功能码10:批量写入保持寄存器(数值型数据)。
-
-
异常处理:
-
若地址非法或数据长度不符,从站返回功能码
8F
(0x8F),并附加错误码(如03
表示非法数据值)。
-
-
用户描述修正:
-
发送报文结构:用户描述中“起始线圈地址+字节计数+具体写入”顺序有误,正确顺序应为 起始地址 + 线圈数量 + 字节计数 + 数据。
-
4.总结:
-
功能码0F专用于批量控制输出线圈状态,适用于同时操作多个继电器的场景。
-
发送报文需明确线圈数量、字节计数及压缩的二进制数据,接收报文仅返回地址和数量以确认操作成功。
-
案例中通过
FF
实现8个线圈全置位,CRC校验(BE D5
和54 0D
)确保报文完整性,体现了Modbus RTU的高效性与可靠性。
7.9 功能码10写入多个寄存器
1.发送报文(主机请求)
格式:
从站地址(1字节) + 功能码10(1字节) + 起始地址(2字节) + 寄存器数量(2字节) + 字节计数(1字节) + 数据(N字节) + CRC16校验(2字节)
作用:批量修改从站设备的多个保持寄存器数值(如批量配置参数或控制值)。
案例解析(写入3号从站,地址0开始的3个寄存器,值均为100):
-
Tx:
03 10 00 00 00 03 06 00 64 00 64 00 64 D0 3E
-
解析:
-
03
:从站地址(设备3)。 -
10
:功能码(写入多寄存器)。 -
00 00
:起始地址(十进制0)。 -
00 03
:写入寄存器数量(3个)。 -
06
:字节计数(3寄存器 × 2字节 = 6字节)。 -
00 64
:第一个寄存器值(十六进制0x0064,十进制100)。 -
00 64
:第二个寄存器值(十进制100)。 -
00 64
:第三个寄存器值(十进制100)。 -
D0 3E
:CRC16校验值。
-
-
2.接收报文(从站响应)
格式:
从站地址(1字节) + 功能码10(1字节) + 起始地址(2字节) + 寄存器数量(2字节) + CRC16校验(2字节)
作用:返回写入的起始地址和寄存器数量,确认操作成功。
案例解析(成功响应):
-
Rx:
03 10 00 00 00 03 81 EA
-
解析:
-
03
:从站地址(设备3)。 -
10
:功能码(成功响应)。 -
00 00
:起始地址(与发送一致)。 -
00 03
:写入的寄存器数量(3个)。 -
81 EA
:CRC16校验值。
-
-
3.关键说明
-
数据格式:
-
每个寄存器值为16位无符号整数(0-65535),按大端格式传输(高位在前)。
-
若写入浮点数或长整数,需将数据拆分到多个连续寄存器(如4字节浮点数占用2个寄存器)。
-
-
功能码区分:
-
功能码10:批量写入保持寄存器(可读写,适用于数值参数)。
-
功能码06:写入单寄存器,功能码0F:批量写入线圈(开关量)。
-
-
异常处理:
-
若地址非法或数据长度不符,从站返回功能码
90
(0x90),并附加错误码(如03
表示非法数据值)。
-
-
应用场景:
-
批量配置设备参数(如设置温度阈值、速度值等),提升通信效率。
-
4.用户案例验证
-
发送报文正确性:
-
数据部分
00 64
重复3次,表示3个寄存器均写入100,字节计数06
(3×2字节)与数据长度一致。 -
CRC值
D0 3E
通过校验,报文结构完整。
-
-
接收报文验证:
-
返回的起始地址和寄存器数量与发送一致,CRC值
81 EA
验证通过,确认操作成功。
-
总结:
-
功能码10通过单次通信批量修改多个保持寄存器,显著减少交互次数,适用于高效参数配置场景。
-
发送报文需明确寄存器数量、字节计数及连续数据值,接收报文仅返回关键参数以简化响应。
-
案例中通过重复
00 64
实现3个寄存器统一赋值,体现了Modbus RTU协议的标准化与灵活性。
8.Modbus一次性最多写入多少个寄存器
1. 协议规定的理论上限
-
最大寄存器数量:123个
-
计算依据:
-
Modbus RTU模式下的报文最大长度为256字节。
-
发送报文中,数据部分占用的字节数为
寄存器数量 × 2
(每个寄存器2字节)。 -
其他字段固定占用9字节(从站地址1 + 功能码1 + 起始地址2 + 寄存器数量2 + 字节计数1 + CRC2)。
-
因此,最大寄存器数量满足:
9+2𝑁≤256⇒𝑁≤123.5(取整为123个)9+2N≤256⇒N≤123.5(取整为123个)
-
-
2. 实际设备限制
-
设备厂商限制:
部分设备可能出于性能或兼容性考虑,设置更低的上限(如120个寄存器)。
例如:某些PLC或传感器仅支持单次写入最多60个寄存器。 -
应用场景限制:
高频率写入或大数据量操作时,建议分批次写入以保障通信稳定性。
关键注意事项
-
数据对齐规则:
-
每个寄存器值为16位(2字节),按大端格式传输(高位在前)。
-
若写入浮点数(32位)或长整型(32位),需占用2个连续寄存器。
-
-
错误处理:
-
若超出设备支持的寄存器数量,从站返回异常码
0x90
(功能码+0x80),并附带错误码(如0x03
表示非法数据值)。
-
-
功能码区分:
-
功能码06:仅支持写入单个寄存器。
-
功能码10:专用于批量写入保持寄存器,需严格遵循报文格式。
-
总结
-
理论最大值:123个寄存器(基于Modbus RTU的256字节长度限制)。
-
实际值:以设备手册为准(通常≤120个)。
-
推荐实践:
-
批量写入前,查阅设备文档确认支持的最大数量。
-
数据量较大时,分批次写入以提高通信可靠性。
-
-
9.Modbus一次性最多读取多少个寄存器
1. 协议规定的理论上限
-
最大寄存器数量:125个
-
计算依据:
-
Modbus RTU模式下报文最大长度为256字节。
-
响应报文格式:
从站地址(1字节) + 功能码(1字节) + 字节计数(1字节) + 数据(N×2字节) + CRC16(2字节)
。 -
数据部分占用字节数为
寄存器数量 × 2
(每个寄存器2字节)。 -
其他固定字段占用5字节(1+1+1+2)。
-
因此,最大寄存器数量满足:
5+2𝑁≤256⇒𝑁≤125.5(取整为125个)5+2N≤256⇒N≤125.5(取整为125个)
-
-
2. 实际设备限制
-
设备厂商限制:
大多数设备出于性能或兼容性考虑,设置更低的上限(如120个寄存器)。
例如:某些PLC或仪表仅支持单次读取最多60个寄存器。 -
应用场景限制:
高频率读取或大数据量操作时,建议分批次读取以提高通信稳定性。
关键说明
-
功能码区分:
-
功能码03:读取保持寄存器(可读写,如设备参数)。
-
功能码04:读取输入寄存器(只读,如传感器数值)。
-
两者的读取数量限制一致,均为125个(理论值)。
-
-
错误处理:
-
若请求的寄存器数量超过设备支持范围,从站返回异常码(如
0x83
或0x84
),并附带错误码0x03
(非法数据值)。
-
-
数据对齐规则:
-
每个寄存器值为16位无符号整数(0-65535),按大端格式传输(高位在前)。
-
若读取浮点数或长整型数据,需将多个连续寄存器组合解析(如4字节浮点数占用2个寄存器)。
-
总结
-
理论最大值:125个寄存器(基于Modbus RTU的256字节长度限制)。
-
实际值:以设备手册为准(通常≤120个)。
-
推荐实践:
-
批量读取前,查阅设备文档确认支持的最大数量。
-
数据量较大时,分批次读取以提高通信可靠性。
-