把十六进制格式的 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:分解逻辑(核心:位掩码 & 移位)
场景 2:按 “字节 / 半字节” 分解(数值段,如温度 / 压力 / 转速)
适用于:连续的字节 / 半字节表示具体数值(如高字节存温度,低字节存压力)。以H1124(4 字节拆分)为例:
| 字节段 | 二进制 | 十六进制 | 十进制 | 功能定义 |
|---|---|---|---|---|
| 高字节(字节 2-3) | 0001 0001 | 0x11 | 17 | 温度(℃) |
| 低字节(字节 0-1) | 0010 0100 | 0x24 | 36 | 压力(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定义为:
分解步骤:

