2025-03-14 11:02:02 +08:00

59 lines
2.1 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# command_09.py
import struct
import logging
class Command09:
def process_09h(self, data):
if len(data) < 14:
logging.warning("09H数据长度不足")
return
pile_id = data[3:11]
data_start = 14
data_len = struct.unpack('<H', data[12:14])[0]
data_end = data_start + data_len
if len(data) < data_end + 1:
logging.warning("09H数据域长度不匹配")
return
# 提取字段
timestamp = data[data_start:data_start + 6]
pile_status = data[data_start + 6]
num_guns = data[data_start + 7]
guns_status = []
offset = data_start + 8
# 解析每枪状态
for i in range(num_guns):
if offset >= data_end:
break
gun_status = data[offset]
guns_status.append({"gun_id": i + 1, "status": f"0x{gun_status:02X}"})
offset += 1
# 解析详细数据示例假设每枪有电压、电流、SOC 等)
detailed_data = []
for i in range(num_guns):
if offset + 12 > data_end: # 示例假设每枪12字节电压4字节电流4字节SOC 1字节预留3字节
break
voltage = struct.unpack('<f', data[offset:offset + 4])[0] # 电压(浮点数)
current = struct.unpack('<f', data[offset + 4:offset + 8])[0] # 电流(浮点数)
soc = data[offset + 8] # SOC百分比
offset += 12
detailed_data.append({
"gun_id": i + 1,
"voltage": voltage,
"current": current,
"soc": soc
})
# 转换为键值对
parsed_data = {
"pile_id": pile_id.hex().upper(),
"timestamp": f"20{timestamp[0]:02X}-{timestamp[1]:02X}-{timestamp[2]:02X} {timestamp[3]:02X}:{timestamp[4]:02X}:{timestamp[5]:02X}",
"pile_status": f"0x{pile_status:02X}",
"num_guns": num_guns,
"guns_status": guns_status,
"detailed_data": detailed_data
}
logging.info(f"09H解析结果: {parsed_data}")