import struct class msg_ccUFbMsg: def __init__(self): # 消息头 - 对应C++中的m_header self.start1 = 0x20 self.start2 = 0x20 self.id = 0x0051 # CCU_STATE_FB_ID self.length = 0 self.checkCode = 0 # 使用4字节校验码,对应C++中的Checksum (unsigned int) # CCU状态数据 - 完全对应C++中的ccuState结构体 self.fc_mode = 0x00 # 燃料电池系统运行模式:00H-无效, 01H-调试, 02H-自动, 03H-补给 self.fc_status = 0x00 # 燃料电池状态:00H-无效, 01H-初始化, ..., 0DH-维护完成 self.fc_fault_level = 0x00 # 燃料电池故障等级:00H-无故障, 10H-一级, 20H-二级, 30H-三级, 40H-四级 self.output_power_limit = 0 # 系统输出功率限制值,单位:W,范围:0~30000W self.total_generation_time = 0 # 系统累计发电时间,单位:0.1小时,最大值6553.5小时 self.total_generation_power = 0 # 系统累计发电总功率,单位:W self.fault_level_1 = 0 # 一级故障位,按位表示不同的故障项 self.fault_level_2 = 0 # 二级故障位 self.fault_level_3 = 0 # 三级故障位 self.fault_level_4 = 0 # 四级故障位 self.hydrogen_capacity = 0 # 储氢罐剩余容量百分比,单位:%,范围:0~100 self.liquid_oxygen_capacity = 0 # 液氧罐剩余容量百分比,单位:%,范围:0~100 self.palladium_temp = 0 # 钯膜最高温度,单位:℃ self.main_pipe_pressure = 0 # 主水路压力,单位:0.01kPa self.aux_pipe_pressure = 0 # 辅水路压力,单位:0.01kPa self.cabin_pressure1 = 0 # 舱室1压力,单位:0.01kPa self.cabin_pressure2 = 0 # 舱室2压力,单位:0.01kPa self.cabin_temp1 = 0 # 舱室1温度,单位:0.01℃ self.cabin_temp2 = 0 # 舱室2温度,单位:0.01℃ self.cabin_humidity1 = 0 # 舱室1湿度,单位:0.01%RH self.cabin_humidity2 = 0 # 舱室2湿度,单位:0.01%RH self.flame_detector1 = 0x00 # 火焰探测器1状态:00H-无效, 01H-报警, 02H-故障 self.flame_detector2 = 0x00 # 火焰探测器2状态:00H-无效, 01H-报警, 02H-故障 self.h2_concentration1 = 0 # 舱室H2浓度1,单位:0.01% LEL self.h2_concentration2 = 0 # 舱室H2浓度2,单位:0.01% LEL self.h2_concentration3 = 0 # 舱室H2浓度3,单位:0.01% LEL self.o2_concentration1 = 0 # 舱室O2浓度1,单位:0.01% LEL self.o2_concentration2 = 0 # 舱室O2浓度2,单位:0.01% LEL self.ch3oh_concentration1 = 0 # 舱室甲醇气体浓度1,单位:0.01% LEL self.ch3oh_concentration2 = 0 # 舱室甲醇气体浓度2,单位:0.01% LEL self.reserved1 = [0, 0] # 保留字段前2个元素 self.emergency_battery1_voltage = 0 # 应急电池1总电压 [V] self.emergency_battery1_current = 0 # 应急电池1总电流 [A] self.emergency_battery1_max_temp = 0 # 应急电池1最高温度 [°C] self.emergency_battery1_fault_word = 0 # 应急电池1故障字 self.emergency_battery2_voltage = 0 # 应急电池2总电压 [V] self.emergency_battery2_current = 0 # 应急电池2总电流 [A] self.emergency_battery2_max_temp = 0 # 应急电池2最高温度 [°C] self.emergency_battery2_fault_word = 0 # 应急电池2故障字 self.cabin_ox_concentration = 0 # 仪表舱内氧气浓度 [%] self.cabin_temperature = 0 # 仪表舱内温度 [°C] self.cabin_humidity = 0 # 仪表舱内湿度 [%RH] self.cabin_pressure = 0 # 仪表舱内大气压 [kPa] self.power_cabin_ox_concentration = 0 # 动力舱内氧气浓度 [%] self.power_cabin_temperature = 0 # 动力舱内温度 [°C] self.power_cabin_humidity = 0 # 动力舱内湿度 [%RH] self.power_cabin_pressure = 0 # 动力舱内大气压 [kPa] self.reserved2 = [0] # 保留字段,地址范围54~55,共2个uint8_t,协议预留 self.dyn_alarm_flag = [0] * 6 # 动力锂电池报警标志字数组,共6字节,按位表示各类报警 self.ins_alarm_flag = [0] * 6 # 仪表锂电池报警标志字数组,共6字节,按位表示各类报警 self.ins_relay_status1 = 0x00 # 仪表电池继电器状态,高4位表示正极继电器,低4位表示充电继电器 self.ins_relay_status2 = 0x00 # 仪表电池预充继电器和负极继电器状态 self.dyn_relay_status1 = 0x00 # 动力电池正极与充电继电器状态 self.dyn_relay_status2 = 0x00 # 动力电池预充与负极继电器状态 self.ins_max_discharge_power = 0 # 仪表电池最大允许放电功率,单位:kW,精度0.05kW self.dyn_max_discharge_power = 0 # 动力电池最大允许放电功率,单位:kW,精度0.05kW self.ins_soc = 0 # 仪表锂电池荷电状态SOC,范围:0~100 self.dyn_soc = 0 # 动力锂电池荷电状态SOC,范围:0~100 self.ins_total_energy = 0 # 仪表电池总能量,单位:kWh self.dyn_total_energy = 0 # 动力电池总能量,单位:kWh self.ins_power_input = 0 # 仪表电池输入功率,单位:kW self.dyn_power_input = 0 # 动力电池输入功率,单位:kW self.ins_charge_status = 0x00 # 仪表电池充放电状态:00H-无效,10H-充电,20H-放电 self.dyn_charge_status = 0x00 # 动力电池充放电状态:00H-无效,10H-充电,20H-放电 self.ins_voltage_link = 0 # 仪表电池LINK端电压,单位:0.01V self.ins_voltage_pack = 0 # 仪表电池PACK端电压,单位:0.01V self.ins_current = 0 # 仪表电池电流,单位:0.01A(正值放电) self.ins_resistance_pos = 0 # 仪表电池正极绝缘电阻,单位:kΩ self.ins_resistance_neg = 0 # 仪表电池负极绝缘电阻,单位:kΩ self.dyn_voltage_link = 0 # 动力电池LINK端电压,单位:0.01V self.dyn_voltage_pack = 0 # 动力电池PACK端电压,单位:0.01V self.dyn_current = 0 # 动力电池电流,单位:0.01A(正值放电) self.dyn_resistance_pos = 0 # 动力电池正极绝缘电阻,单位:kΩ self.dyn_resistance_neg = 0 # 动力电池负极绝缘电阻,单位:kΩ self.ins_emergency_status = 0x00 # 仪表电池紧急状态字,按位表示异常或告警状态 self.dyn_emergency_status = 0x00 # 动力电池紧急状态字,按位表示异常或告警状态 self.reserved3 = [0] * 2 # 保留字节,协议预留 self.ins_soc_threshold1 = 0 # 仪表电池1 SOC门限,范围:0~100 self.ins_soc_threshold2 = 0 # 仪表电池2 SOC门限,范围:0~100 self.ins_soc_threshold3 = 0 # 仪表电池3 SOC门限,范围:0~100 self.dyn_soc_threshold1 = 0 # 动力电池1 SOC门限,范围:0~100 self.dyn_soc_threshold2 = 0 # 动力电池2 SOC门限,范围:0~100 self.dyn_soc_threshold3 = 0 # 动力电池3 SOC门限,范围:0~100 self.ins_power_limit1 = 0 # 仪表电池1功率限制值,单位:% self.ins_power_limit2 = 0 # 仪表电池2功率限制值,单位:% self.dyn_power_limit1 = 0 # 动力电池1功率限制值,单位:% self.dyn_power_limit2 = 0 # 动力电池2功率限制值,单位:% self.device_online_flag1 = 0 # 设备在线状态标志1,byte0:低压配电板在线标志位 byte1:复合管控主机在线标志位 byte2:复合管控备机在线标志位 self.device_online_flag2 = 0 # 设备在线状态标志2,byte0:仪表锂电在线标志位 byte1:动力锂电在线标志位 byte2:燃电锂电在线标志位 byte3:高压配电板在线标志位 self.dyn_charge_level = 0x00 # 动力电池充电状态:01H-1级(不限), 02H-2级(限功率), 03H-3级(关闭) self.dyn_water_leak_status = 0x00 # 动力漏水状态:0XH-正常, 1XH-异常漏水 self.ins_water_leak_dcdc_status = 0x00 # 仪表漏水状态与DCDC状态:低4位-漏水状态(0XH正常,1XH异常),高4位-DCDC状态(X0H正常,X1H故障) self.reserved4 = 0x00 self.heartbeat = 0 # 主机心跳计数器或标志值 def pack(self): """打包消息为字节数据 - 完全对应C++中的msg_CcuStateFbMsg结构体""" # 重置校验码 self.checkCode = 0 # 首先打包CCU状态数据(不包括消息头和校验码) body_data = b'' # 打包CCU状态数据 - 完全对应C++中的ccuState结构体 # 第一部分:基本状态 body_data += struct.pack('