59 lines
2.1 KiB
Python
59 lines
2.1 KiB
Python
# 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}") |