Modbus RTU 与 Modbus TCP 深入指南-字节顺序与跨平台问题

十、字节顺序与跨平台问题

10.1 Modbus 标准字节序

Modbus标准大端序(Big Endian,网络字节序)

  • 16位值 0x1234 → 发送 0x12(高字节) 0x34(低字节)

10.2 常见设备的小端序问题

部分PLC使用小端序(Little Endian):

厂商/设备 字节序 说明
Schneider Electric 大端 遵循标准
Siemens S7 小端 需配置或转换
Allen-Bradley (Rockwell) 小端 需转换
Mitsubishi 大端 遵循标准
Omron 大端 遵循标准
国产设备 不定 需测试确认

10.3 字节序转换方法

10.3.1 C语言转换
复制代码
// 单寄存器转换
uint16_t swap_endian_16(uint16_t val) {
    return (val << 8) | (val >> 8);
}

// 寄存器数组转换(就地)
void swap_endian_array(uint16_t *data, int count) {
    for (int i = 0; i < count; i++) {
        data[i] = (data[i] << 8) | (data[i] >> 8);
    }
}
10.3.2 Python转换
python 复制代码
def swap_endian_16(value):
    return ((value & 0xFF) << 8) | ((value >> 8) & 0xFF)

def swap_endian_array(data):
    return [swap_endian_16(v) for v in data]

# 使用struct处理字节序
import struct
data = b'\x12\x34\x56\x78'
regs = struct.unpack('>HH', data)  # 大端: (0x1234, 0x5678)
regs = struct.unpack('<HH', data)  # 小端: (0x3412, 0x7856)

10.4 32位浮点数处理

Modbus协议不直接支持浮点,通常用2个连续寄存器存储32位浮点数(IEEE 754):

python 复制代码
def uint16_to_float(reg_high, reg_low, little_endian=False):
    """将两个寄存器合并为浮点数"""
    if little_endian:
        # 小端: 低寄存器在前
        bytes_data = struct.pack('<HH', reg_low, reg_high)
    else:
        # 大端: 高寄存器在前(标准)
        bytes_data = struct.pack('>HH', reg_high, reg_low)
    return struct.unpack('>f', bytes_data)[0]  # 或 '<f' 根据格式

# 示例:IEEE 754 浮点数 3.14 = 0x4048F5C3
# 寄存器0x0000=0x4048,0x0001=0xF5C3(大端)
value = uint16_to_float(0x4048, 0xF5C3, little_endian=False)  # =3.14
相关推荐
Orange_sparkle2 小时前
Pi Agent vs LangGraph:从人机交互、企业 RAG 到持久化工作流的完整选型指南
java·网络·人机交互
xiaoye-duck3 小时前
《Linux 网络编程》深入传输层 UDP 协议原理:端口、报文、缓冲区与内核源码解析
linux·网络·udp
好评1244 小时前
【Linux】数据链路层
linux·运维·网络
天衍四九-4 小时前
第一章:从 LLM 到 Agent —— DeepSeek Harness 入门
网络·数据库·人工智能·python
Jae den4 小时前
网络丢包是什么?
网络
CC城子5 小时前
EtherNet/IP I/O 丢包排查(linux系统)
linux·单片机·tcp/ip·ethernetip
M78佐菲5 小时前
HTML学习笔记
linux·笔记·学习·tcp/ip·html
XR1234567885 小时前
医院无线整网高密覆盖选型深度解析
运维·网络
发量惊人的中年网工5 小时前
企业一体化安全网关选型:适用规模、需求架构与实施建议
网络
取啥都被占用6 小时前
两个网络供应商靠树莓派跨个域
网络·树莓派