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
相关推荐
老李IT笔记3 小时前
连不上不一定是网不好:新系统不认的服务端配置卡在哪一档
运维·服务器·网络
小此方3 小时前
Linux网络(二十八):从NAT转换到正反向代理:图解内网通信、NAPT端口映射
linux·运维·网络
万年咸鱼3 小时前
WebSocket、Socket 与 HTTP 的区别详解
websocket·网络协议·http
万年咸鱼4 小时前
HTTPS 是如何保证传输安全的?
网络协议·安全·https
万联WANFLOW4 小时前
拆解 Meta Prometheus 网络:20,736 张 GPU 如何互联?4 个设计取舍值得关注
tcp/ip·meta·gpu
隐擎fox4 小时前
深入 Android 移动端风控与协议层对抗:内核级虚拟环境检测、网络堆栈特征伪装与住宅 IP 协同实战
android·网络·python·网络协议·tcp/ip
Da Da 泓5 小时前
[项目] --- 基于websocket的网页五子棋(可多用户)
网络·websocket·网络协议·多线程·项目
lazy H5 小时前
【计算机网络】第 2 篇:一条数据如何穿过网络?彻底理解数据封装与解封装
网络·经验分享·后端·学习·计算机网络
一木 之林5 小时前
微信小程序开发全攻略·文章版|05 路由·交互·网络与音乐播放器实战
网络·微信小程序·小程序·交互
格叽格叽噗6 小时前
企业风控怎么落地IP核验?从IP查询字段到分级处置的3步法
tcp/ip