在 Modbus RTU 协议中,数据通常以二进制格式(16 位 / 32 位寄存器) 传输,读取后需根据数据类型(如 16 位整数、32 位浮点数、32 位整数)和字节序(大端 / 小端) 换算为十进制,核心是先解析二进制数据的存储规则,再通过其进行格式转换。以下分 “常见数据类型” 展开具体换算方法,附实例说明,确保可落地操作:
一、先明确 2 个核心前提:Modbus 数据传输的底层规则
二、分类型换算:从 Modbus 数据到十进制(附实例)
以下以 “读取到的 Modbus 原始字节数据” 为输入,按常见数据类型分步换算,假设默认大端序(若为小端序,需先交换字节顺序)。
1. 16 位无符号整数(UInt16):1 个寄存器,非负数值
换算逻辑:将 2 个字节按 “高位字节 ×256 + 低位字节” 计算,或直接转换为十六进制后转十进制。
步骤:
① 提取 Modbus 返回的 2 个字节(Byte0 = 高位,Byte1 = 低位);
② 计算十进制值:十进制 = Byte0 × 256 + Byte1
(或十六进制0xByte0Byte1
转十进制)。
实例:
若读取到的字节为0x05
(Byte0)、0xDC
(Byte1):
2. 16 位有符号整数(Int16):1 个寄存器,支持负数
换算逻辑:先按 UInt16 计算,再判断最高位(第 15 位)是否为 1(1 表示负数),若为负数则用 “补码” 换算为十进制负数。
步骤:
① 同 UInt16 计算出 “无符号十进制值”(记为U
);
② 若U ≥ 32768
(即十六进制0x8000
,最高位为 1),则十进制值 = U - 65536
(65536=2¹⁶);若U < 32768
,则十进制值 = U。
实例:
读取到字节0xF8
(Byte0)、0x30
(Byte1):
① 无符号值:0xF8×256 + 0x30 = 248×256 + 48 = 63488 + 48 = 63536
;
② 因63536 ≥ 32768
,十进制值 = 63536 - 65536 = -1999;
→ 最终十进制值:-1999(如温度 - 19.99℃,若需除以 100,见 “数据缩放” 补充)。
3. 32 位无符号整数(UInt32):2 个连续寄存器
换算逻辑:2 个寄存器共 4 个字节(Byte0、Byte1 为第一个寄存器,Byte2、Byte3 为第二个寄存器,大端序下 Byte0 是最高位,Byte3 是最低位),按 “Byte0×2²⁴ + Byte1×2¹⁶ + Byte2×2⁸ + Byte3” 计算。
步骤:
① 提取 4 个字节(顺序:第一个寄存器的 Byte0→Byte1,第二个寄存器的 Byte2→Byte3);
② 计算十进制值:十进制 = Byte0×2²⁴ + Byte1×2¹⁶ + Byte2×2⁸ + Byte3
。
实例:
读取到 2 个连续寄存器的字节为0x00
(Byte0)、0x01
(Byte1)、0x02
(Byte2)、0x03
(Byte3):
4. 32 位有符号整数(Int32):2 个连续寄存器,支持负数
换算逻辑:先按 UInt32 计算出 “无符号十进制值”(记为U
),再判断最高位(第 31 位)是否为 1,若为负数则用 “补码” 换算:十进制 = U - 2³²
(2³²=4294967296)。
步骤:
① 同 UInt32 计算出U
;
② 若U ≥ 2147483648
(即十六进制0x80000000
,最高位为 1),则十进制值 = U - 4294967296;否则 = U。
实例:
读取到 4 个字节0xFF
(Byte0)、0xFF
(Byte1)、0xFD
(Byte2)、0x0C
(Byte3):
① 无符号值 U:0xFF×2²⁴ + 0xFF×2¹⁶ + 0xFD×2⁸ + 0x0C = 4278190080 + 65535×65536?不,直接算:0xFF=255,0xFD=253,0x0C=12 → 255×2²⁴ +255×2¹⁶ +253×2⁸ +12 = 255×16777216 +255×65536 +253×256 +12 = 4278190080 + 16711680 + 64768 +12 = 4294966540
;
② 因4294966540 ≥ 2147483648
,十进制值 = 4294966540 - 4294967296 = -756;
→ 最终十进制值:-756(如位移 - 756mm)。
5. 32 位浮点数(Float32):2 个连续寄存器,带小数
换算逻辑:浮点数按 IEEE 754 标准存储(1 位符号位 + 8 位指数位 + 23 位尾数位),需先将 4 个字节组合为 32 位二进制,再解析为十进制浮点数(手动计算复杂,推荐工具或代码换算)。
步骤:
① 按大端序组合 4 个字节为 32 位二进制(Byte0 最高位→Byte3 最低位);
② 解析符号位(第 31 位:0 = 正,1 = 负)、指数位(第 30~23 位,需减 127 得到实际指数)、尾数位(第 22~0 位,计算 “1 + 尾数 / 2²³”);
③ 十进制值 = (-1)^ 符号位 × (1 + 尾数 / 2²³) × 2^(指数 - 127)。
实例(推荐工具换算):
读取到 4 个字节0x44
(Byte0)、0x48
(Byte1)、0x00
(Byte2)、0x00
(Byte3):
三、关键补充:2 个易忽略的换算细节
四、工具与代码辅助:避免手动计算错误
手动换算易出错,推荐用工具或代码快速处理:
总结
Modbus RTU 数据换算为十进制的核心流程是:
若换算结果异常,优先检查字节序是否正确、缩放比例是否遗漏,或用在线工具验证原始数据,排除计算错误。