Modbus通信协议基础知识总结及应用

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个字节,取值范围为1-255(通常0为广播地址,但根据需求可能被禁用)。

  2. 功能码

    • 作用:定义设备执行的操作类型(如读取或写入数据)。

    • 格式:占用1个字节,支持8种基本功能码(如01读取线圈、03读取保持寄存器等)。

  3. 数据部分

    • 作用:配合功能码提供操作所需参数,内容因功能而异。

    • 格式

      • 读取操作:包含起始地址(2字节)和读取长度(2字节),共4字节。

      • 写入操作:包含目标地址(2字节)及写入数据(N字节),长度可变。

  4. 校验部分

    • 作用:通过CRC-16校验算法验证报文完整性,防止传输错误。

    • 格式:占用2个字节,附加在报文末尾。

7.2  功能码01读取输出线圈

1.发送报文(主机请求)

格式:
从站地址(1字节) + 功能码01(1字节) + 起始地址(2字节) + 线圈数量(2字节) + CRC校验(2字节)

作用:请求读取从站设备的输出线圈状态。
案例解析(读取1号从站,地址0开始的10个线圈):

  • Tx01 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字节)

作用:返回请求的线圈状态,数据按二进制位压缩为字节。
案例解析(响应数据):

  • Rx01 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个输入线圈):

  • Tx02 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字节)

作用:返回输入线圈的二进制状态,数据按字节压缩,每比特对应一个线圈。
案例解析(响应数据):

  • Rx02 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.关键说明

  1. 功能码02与01的区别

    • 功能码01:读取输出线圈(可读写,如继电器控制)。

    • 功能码02:读取输入线圈(只读,如传感器输入状态)。

  2. 数据对齐规则

    • 线圈状态按比特打包为字节,每字节包含8个线圈,高位对应较低地址(如字节15的比特7对应起始地址10)。

    • 若请求的线圈数量不足8的倍数,高位补零(例如16个线圈占用2字节,共16比特)。

  3. 地址范围限制

    • 起始地址和线圈数量为16位无符号整数(0-65535),但需确保不超过设备支持的最大地址范围。

  4. 异常处理

    • 若请求非法地址或超限数量,从站返回功能码高位+1(如82表示异常),并附加错误码(如01表示非法功能)。


4.总结

  • 功能码02专用于读取输入线圈的实时状态,适用于监测传感器、开关输入等只读场景。

  • 报文结构与功能码01类似,但操作对象不同,需注意线圈类型(输入/输出)的区分。

  • 案例中通过15 00的二进制解析,直观展示了输入线圈的状态分布,验证了Modbus数据压缩的高效性。

7.4功能码03读取保持型寄存器

1.发送报文(主机请求)

格式
从站地址(1字节) + 功能码03(1字节) + 起始地址(2字节) + 寄存器数量(2字节) + CRC16校验(2字节)

作用:请求读取从站设备的保持型寄存器数据(可读写的16位数据,如配置参数、传感器数值等)。
案例解析(读取3号从站,地址5开始的2个寄存器):

  • Tx03 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位数据值,按大端格式(高位在前)排列。
案例解析(响应数据):

  • Rx03 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.关键说明

  1. 寄存器数据格式

    • 每个寄存器为16位无符号整数(0-65535),按大端格式传输(高位字节在前)。

    • 若需读取浮点数或长整型数据,需将多个寄存器组合解析(如4字节浮点数占用2个连续寄存器)。

  2. 地址范围限制

    • 起始地址和寄存器数量为16位无符号整数(0-65535),但需确保不超过设备支持的地址范围。

  3. 异常处理

    • 若请求非法地址或超限数量,从站返回功能码83(0x83),并附加错误码(如02表示非法地址)。

  4. 功能码区分

    • 功能码03:读取保持寄存器(可读写)。

    • 功能码04:读取输入寄存器(只读,如模拟量输入)。


4.总结

  • 功能码03专用于读取保持型寄存器的数值,适用于获取或修改设备的配置参数、运行数据等。

  • 报文结构清晰,数据以大端格式直接传输,便于解析为整数或进一步转换为其他数据类型。

  • 案例中读取地址5和6的寄存器,返回值00 6400 C8直观展示了十进制100和200的存储形式,体现Modbus数据通信的标准化与高效性。

验证: 

 

7.5 功能码04读取输入寄存器

1.发送报文(主机请求)

格式
从站地址(1字节) + 功能码04(1字节) + 起始地址(2字节) + 寄存器数量(2字节) + CRC16校验(2字节)

作用:请求读取从站设备的输入寄存器数据(输入寄存器为只读类型,如传感器模拟量输入值)。
案例解析(读取4号从站,地址10开始的5个输入寄存器):

  • Tx04 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位数值,按大端格式(高位在前)排列。
案例解析(响应数据):

  • Rx04 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.关键说明

  1. 功能码04与03的区别

    • 功能码03:读取保持寄存器(可读写,如设备配置参数)。

    • 功能码04:读取输入寄存器(只读,如传感器采集的模拟量值)。

  2. 数据格式

    • 每个寄存器为16位无符号整数(0-65535),按大端格式传输(高位字节在前)。

    • 若需解析浮点数或多寄存器组合数据,需根据设备协议进一步转换。

  3. 地址范围限制

    • 起始地址和寄存器数量为16位无符号整数(0-65535),需确保在设备支持的地址范围内。

  4. 异常处理

    • 若请求非法地址或超限数量,从站返回功能码84(0x84),并附加错误码(如02表示非法地址)。


4.总结

  • 功能码04专用于读取输入寄存器的实时数据,适用于获取传感器、仪表等设备的模拟量输入值。

  • 报文结构与功能码03一致,但功能码和数据类型不同,需注意区分操作对象(输入/保持寄存器)。

  • 案例中返回的寄存器值00 0100 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的线圈置位):

  • Tx01 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字节)
作用:从站原样返回写入的地址和值,确认操作成功。

正确案例(成功响应):

  • Rx01 05 00 01 FF 00 DD FA

    • 报文内容与发送端完全一致,表示线圈已成功置位。


用户案例问题修正

  • 原案例错误

    • 发送报文末尾多出00 00,导致长度异常(应为8字节,实际为10字节)。

    • 修正后01 05 00 01 FF 00 DD FA(长度8字节,符合规范)。


3.关键说明

  1. 功能码05与06的区别

    • 功能码05:操作单线圈(开关量输出),写入值仅支持FF 00(ON)或00 00(OFF)。

    • 功能码06:操作单寄存器(16位数值),写入值为任意合法整数。

  2. 地址对齐

    • 线圈地址为16位无符号整数(0-65535),需与设备定义的线圈地址范围一致。

  3. 异常处理

    • 若地址非法或写入值错误,从站返回功能码85(0x85),并附加错误码(如02表示非法地址)。


4.总结

  • 功能码05专用于控制输出线圈的开关状态,报文需严格遵循FF 0000 00的写入值格式。

  • 发送与接收报文内容完全一致,确保操作可靠性。

  • 案例中通过FF 00实现线圈置位,CRC校验值DD FA验证了报文的完整性。

7.7 功能码06写入单寄存器

1.发送报文(主机请求)

格式
从站地址(1字节) + 功能码06(1字节) + 寄存器地址(2字节) + 写入值(2字节) + CRC16校验(2字节)
作用:向从站设备的单个保持寄存器写入16位数据(如配置参数、控制值等)。
案例解析(写入3号从站,地址5的寄存器值为200):

  • Tx03 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字节)
作用:从站原样返回写入的地址和值,确认操作成功。

案例解析(成功响应):

  • Rx03 06 00 05 00 C8 99 BF

    • 报文内容与发送端完全一致,表示寄存器值已成功修改为200。


3.关键说明

  1. 数据格式

    • 写入值为16位无符号整数(0-65535),按大端格式传输(高位字节在前)。

    • 若需写入浮点数或长整型数据,需将数值拆分到多个寄存器(如4字节浮点数占用2个连续寄存器)。

  2. 功能码区分

    • 功能码06:写入单寄存器(保持型寄存器,可读写)。

    • 功能码10:写入多个寄存器(批量操作)。

  3. 地址范围限制

    • 寄存器地址为16位无符号整数(0-65535),需确保在设备支持的地址范围内。

  4. 异常处理

    • 若地址非法或数据无效,从站返回功能码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个线圈全部置位):

  • Tx01 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字节)
作用:返回写入的起始地址和线圈数量,确认操作成功。
案例解析(成功响应):

  • Rx01 0F 00 00 00 08 54 0D

    • 解析

      • 01:从站地址(设备1)。

      • 0F:功能码(成功响应)。

      • 00 00:起始地址(与发送一致)。

      • 00 08:写入的线圈数量(8个)。

      • 54 0D:CRC16校验值。


3.关键说明

  1. 数据对齐规则

    • 线圈数量不足8的倍数时,数据字节的高位补零(如写入9个线圈需2字节,第2字节高位7位补零)。

    • 案例中8个线圈对应1字节数据FF(二进制全1),表示全部置位。

  2. 功能码区分

    • 功能码0F:批量写入输出线圈(开关量,可读写)。

    • 功能码10:批量写入保持寄存器(数值型数据)。

  3. 异常处理

    • 若地址非法或数据长度不符,从站返回功能码8F(0x8F),并附加错误码(如03表示非法数据值)。

  4. 用户描述修正

    • 发送报文结构:用户描述中“起始线圈地址+字节计数+具体写入”顺序有误,正确顺序应为 起始地址 + 线圈数量 + 字节计数 + 数据


4.总结

  • 功能码0F专用于批量控制输出线圈状态,适用于同时操作多个继电器的场景。

  • 发送报文需明确线圈数量、字节计数及压缩的二进制数据,接收报文仅返回地址和数量以确认操作成功。

  • 案例中通过FF实现8个线圈全置位,CRC校验(BE D554 0D)确保报文完整性,体现了Modbus RTU的高效性与可靠性。

7.9 功能码10写入多个寄存器

1.发送报文(主机请求)

格式
从站地址(1字节) + 功能码10(1字节) + 起始地址(2字节) + 寄存器数量(2字节) + 字节计数(1字节) + 数据(N字节) + CRC16校验(2字节)
作用:批量修改从站设备的多个保持寄存器数值(如批量配置参数或控制值)。
案例解析(写入3号从站,地址0开始的3个寄存器,值均为100):

  • Tx03 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字节)
作用:返回写入的起始地址和寄存器数量,确认操作成功。
案例解析(成功响应):

  • Rx03 10 00 00 00 03 81 EA

    • 解析

      • 03:从站地址(设备3)。

      • 10:功能码(成功响应)。

      • 00 00:起始地址(与发送一致)。

      • 00 03:写入的寄存器数量(3个)。

      • 81 EA:CRC16校验值。


3.关键说明

  1. 数据格式

    • 每个寄存器值为16位无符号整数(0-65535),按大端格式传输(高位在前)。

    • 若写入浮点数或长整数,需将数据拆分到多个连续寄存器(如4字节浮点数占用2个寄存器)。

  2. 功能码区分

    • 功能码10:批量写入保持寄存器(可读写,适用于数值参数)。

    • 功能码06:写入单寄存器,功能码0F:批量写入线圈(开关量)。

  3. 异常处理

    • 若地址非法或数据长度不符,从站返回功能码90(0x90),并附加错误码(如03表示非法数据值)。

  4. 应用场景

    • 批量配置设备参数(如设置温度阈值、速度值等),提升通信效率。


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个寄存器。

  • 应用场景限制
    高频率写入或大数据量操作时,建议分批次写入以保障通信稳定性。


关键注意事项

  1. 数据对齐规则

    • 每个寄存器值为16位(2字节),按大端格式传输(高位在前)。

    • 若写入浮点数(32位)或长整型(32位),需占用2个连续寄存器。

  2. 错误处理

    • 若超出设备支持的寄存器数量,从站返回异常码0x90(功能码+0x80),并附带错误码(如0x03表示非法数据值)。

  3. 功能码区分

    • 功能码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个寄存器。

  • 应用场景限制
    高频率读取或大数据量操作时,建议分批次读取以提高通信稳定性。


关键说明

  1. 功能码区分

    • 功能码03:读取保持寄存器(可读写,如设备参数)。

    • 功能码04:读取输入寄存器(只读,如传感器数值)。

    • 两者的读取数量限制一致,均为125个(理论值)。

  2. 错误处理

    • 若请求的寄存器数量超过设备支持范围,从站返回异常码(如0x830x84),并附带错误码0x03(非法数据值)。

  3. 数据对齐规则

    • 每个寄存器值为16位无符号整数(0-65535),按大端格式传输(高位在前)。

    • 若读取浮点数或长整型数据,需将多个连续寄存器组合解析(如4字节浮点数占用2个寄存器)。


总结

  • 理论最大值:125个寄存器(基于Modbus RTU的256字节长度限制)。

  • 实际值:以设备手册为准(通常≤120个)。

  • 推荐实践

    • 批量读取前,查阅设备文档确认支持的最大数量。

    • 数据量较大时,分批次读取以提高通信可靠性。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值