返回主站|会员中心|保存桌面

希玛仪表综合服务商    

希玛红外测温仪,风速计,气体检测仪,兆欧表,测振仪,PH值检测仪,温湿度仪

联系方式
  • 联系人:吴经理
  • 电话:18576370666
新闻分类
  • 暂无分类
站内搜索
 
首页 > 新闻中心 > 将多状态的十H1124六进制的数据分解出来!
新闻中心
将多状态的十H1124六进制的数据分解出来!
发布时间:2025-12-31        浏览次数:38        返回列表

把十六进制格式的 H1124 这类多状态组合数据分解成独立的状态位 / 数值段,核心思路是先将十六进制转二进制,再按预设的位定义提取对应状态,或按字节 / 半字节拆分数值。以下是通用分解方法、代码示例(适配 PLC/Python)和实际应用案例,新手也能快速落地。


一、先明确核心逻辑:十六进制→二进制的位映射

十六进制数的每 1 位对应二进制 4 位,多状态数据通常是 “不同位 / 字节对应不同功能”,以H1124(十进制 4388,二进制0001 0001 0010 0100)为例,先拆解二进制结构:

plaintext

H1124 = 0x1124 → 二进制:0001 0001 0010 0100
        高位←      字节3  字节2  字节1  字节0 →低位
        对应:     0001    0001    0010    0100
        十六进制位:1      1      2      4

关键:分解前必须明确每一位 / 字节的定义(如哪几位表示泵启停、哪几位表示故障、哪几位表示数值),这是所有分解的前提。


二、通用分解方法(分 2 类场景)

场景 1:按 “位” 分解(状态位,如启停 / 故障 / 报警)

适用于:每 1 个二进制位对应 1 个开关状态(0 = 关闭,1 = 开启)。

步骤 1:定义位功能(示例,可按实际需求调整)
二进制位(从 0 开始,低位为 0)功能定义H1124 对应值(0/1)状态解读
位 2泵 1 运行1(0100 的第 2 位)泵 1 正在运行
位 5泵 2 运行0(0010 0100 的第 5 位)泵 2 停止
位 8故障报警1(0001 0000 0000 的第 8 位)存在故障
位 12手动模式1(0001 0000 0000 0000 的第 12 位)设备处于手动模式
步骤 2:分解逻辑(核心:位掩码 & 移位)
  • 位掩码:用1 << 位号生成对应位的掩码(如位 2 的掩码 = 0b100=0x4);

  • 按位与:原数 & 掩码 → 结果≠0 则该位为 1,=0 则为 0;

  • 移位:(原数 & 掩码) >> 位号 → 直接得到 0/1 状态。

场景 2:按 “字节 / 半字节” 分解(数值段,如温度 / 压力 / 转速)

适用于:连续的字节 / 半字节表示具体数值(如高字节存温度,低字节存压力)。以H1124(4 字节拆分)为例:

字节段二进制十六进制十进制功能定义
高字节(字节 2-3)0001 00010x1117温度(℃)
低字节(字节 0-1)0010 01000x2436压力(0.1MPa)

三、代码实现(2 种常用场景,可直接复用)

1. PLC 端分解(以三菱 FX3U 为例,STL 语言)

适用于工业现场直接分解十六进制状态数据:

stl

// 定义原始数据:D0 = H1124(0x1124)
MOV K4388 D0 // H1124=十进制4388,存入D0

// 场景1:按位分解状态
AND D0 K4 M10   // 位2(掩码K4=0x4)→ M10=1(泵1运行)
AND D0 K32 M11  // 位5(掩码K32=0x20)→ M11=0(泵2停止)
AND D0 K256 M12 // 位8(掩码K256=0x100)→ M12=1(故障报警)
AND D0 K4096 M13// 位12(掩码K4096=0x1000)→ M13=1(手动模式)

// 场景2:按字节分解数值
MOV D0 D1       // 复制原始数据到D1
AND D1 K255 D2  // 取低字节(掩码K255=0xFF)→ D2=0x24=36(压力)
SHR D1 K8       // 右移8位,提取高字节
AND D1 K255 D3  // 高字节→ D3=0x11=17(温度)

2. 通用代码(Python,适配电脑 / 上位机)

可直接运行,输入任意十六进制数即可分解:

python

运行

def hex_decompose(hex_str):
    # 1. 十六进制转十进制(处理带H的格式,如H1124→0x1124)
    hex_num = int(hex_str.replace('H', ''), 16)
    # 2. 转二进制(补全16位,方便查看)
    bin_str = bin(hex_num)[2:].zfill(16)
    print(f"原始数据:{hex_str} → 二进制:{bin_str}")
    
    # 场景1:按位分解状态(自定义位功能)
    status = {
        "泵1运行(位2)": (hex_num & (1 << 2)) >> 2,
        "泵2运行(位5)": (hex_num & (1 << 5)) >> 5,
        "故障报警(位8)": (hex_num & (1 << 8)) >> 8,
        "手动模式(位12)": (hex_num & (1 << 12)) >> 12
    }
    print("\n【状态位分解】")
    for name, val in status.items():
        print(f"{name}:{'开启' if val==1 else '关闭'}")
    
    # 场景2:按字节分解数值
    low_byte = hex_num & 0xFF  # 低字节(0-7位)
    high_byte = (hex_num >> 8) & 0xFF  # 高字节(8-15位)
    print("\n【字节分解】")
    print(f"高字节(温度):0x{high_byte:02X} → 十进制:{high_byte}")
    print(f"低字节(压力):0x{low_byte:02X} → 十进制:{low_byte}")# 测试:分解H1124hex_decompose("H1124")
运行结果:

plaintext

原始数据:H1124 → 二进制:0001000100100100

【状态位分解】
泵1运行(位2):开启
泵2运行(位5):关闭
故障报警(位8):开启
手动模式(位12):开启

【字节分解】
高字节(温度):0x11 → 十进制:17
低字节(压力):0x24 → 十进制:36

四、实际应用案例(工业 PLC 多状态数据分解)

假设某设备的状态数据H1124定义为:

  • 位 0-3:运行模式(0 = 自动,1 = 手动,2 = 调试);

  • 位 4-7:泵组数量(0-3 台);

  • 位 8-11:故障代码(0 = 无故障,1 = 过载,2 = 缺相);

  • 位 12-15:报警等级(0 = 无,1 = 低,2 = 中,3 = 高)。

分解步骤:

  1. 提取位 0-3:0x1124 & 0x000F = 0x4 → 十进制 4(需按定义映射为 “调试模式”);

  2. 提取位 4-7:(0x1124 >> 4) & 0x000F = 0x2 → 十进制 2(2 台泵运行);

  3. 提取位 8-11:(0x1124 >> 8) & 0x000F = 0x1 → 十进制 1(过载故障);

  4. 提取位 12-15:(0x1124 >> 12) & 0x000F = 0x1 → 十进制 1(低等级报警)。


总结

  1. 核心步骤:十六进制转二进制→按预设的位 / 字节定义→用掩码 & 移位提取状态 / 数值

  2. 关键前提:必须明确每一位 / 字节对应的功能(如位 2 = 泵 1 运行、高字节 = 温度);

  3. 落地方式:PLC 用位指令(AND/SHR)分解,电脑 / 上位机用 Python/Excel 公式分解。

收缩
  • QQ咨询

  • 电话咨询

  • 18576370666
  • 添加微信客服