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
相关推荐
M哥支付10 小时前
什么是收付一体模式?
服务器·网络·其他·微信·金融
瓦学妹10 小时前
X(Twitter)新号如何防封?2026 养号与防限流全攻略
大数据·网络·人工智能·新媒体运营·twitter
你怎么知道我是队长12 小时前
计算机虚拟存储管理与页面置换算法详解
服务器·网络·算法
发量惊人的中年网工13 小时前
工业视觉云边 AI 推理总是卡顿?SD-WAN 打通边缘算力互联
网络·人工智能·网络安全·云计算
聚铭网络13 小时前
聚铭网络入选《2026人工智能安全产业全景图》“安全运营智能体”赛道
网络·人工智能·安全
AC赳赳老秦13 小时前
软著公开信息批量采集:OpenClaw 抓取软件著作权公开数据,分析企业技术布局方向
大数据·网络·人工智能·python·php·deepseek·openclaw
liuyunshengsir14 小时前
perftest 工具集ib_write_bw中的 RDMA Write 带宽测试工具手册
网络·rdma
tjjingpan14 小时前
HCIP-Datacom Core Technology V1.0_20 IPv6概述
linux·服务器·网络
我命由我1234514 小时前
Android 开发 - 广播组件(标准广播、有序广播、静态注册广播、分钟到达广播、网络变更广播...)
android·java·开发语言·网络·java-ee·android studio·android-studio
MartinYeung514 小时前
[论文学习]WASP:面向提示注入攻击的Web代理安全性基准测试
前端·网络·学习