新增复合管控器(pCCU) + 惯导数据解析 + 设备控制页增强 + 0824协议文档归档
- 新增 pCCU 复合管控器程序(src/pCCU):FC/PM 双链路(UDP)、协议编解码器 (FcProtocol/PmProtocol/Frame/Message/MessageRegistry)、快照与落库(DbStore)、 内置 WebServer;挂入 src/CMakeLists.txt 与板卡 mission(h100.moos) - 惯导/深度数据:新增 uDevice_insData 消息解析,接入 UpperCommManager, pPowerMangerHost 注册监视,UpmsgTest 覆盖 - pPowerMangerHost 设备控制页增强(web/index.html) - 部署/运维脚本改为 4 个 systemd 服务(moosdb/pPowerManger/pPowerMangerHost/pCCU): deploy/clean-data/fetch-data 同步适配 - 协议文档:归档 0824 控制主机与复合管控器通信协议 xlsx 及关联 docx,移除旧 md - 测试:新增 pccu 单元/集成测试与 disSysTest Python 配电仿真 - 清理:移除未使用的 CCU 状态调试打印 coutMsg;.gitignore 补充编译产物/临时文件忽略
This commit is contained in:
@@ -0,0 +1,209 @@
|
||||
import tkinter as tk
|
||||
from tkinter import ttk, scrolledtext
|
||||
|
||||
from . import ccuMsg
|
||||
from datetime import datetime
|
||||
|
||||
class CCUStatusSummaryDialog:
|
||||
"""CCU状态汇总弹窗"""
|
||||
def __init__(self, parent, ccu_status=None, title="CCU状态汇总"):
|
||||
self.parent = parent
|
||||
self.ccu_status = ccu_status or ccuMsg.msg_ccUFbMsg()
|
||||
|
||||
# 创建弹窗
|
||||
self.dialog = tk.Toplevel(parent)
|
||||
self.dialog.title(title)
|
||||
self.dialog.geometry("1000x700")
|
||||
self.dialog.transient(parent) # 设置为父窗口的临时窗口
|
||||
self.dialog.grab_set() # 模态对话框
|
||||
|
||||
# 创建主框架
|
||||
main_frame = ttk.Frame(self.dialog, padding="10")
|
||||
main_frame.pack(fill=tk.BOTH, expand=True)
|
||||
|
||||
# 标题
|
||||
title_label = ttk.Label(main_frame, text="CCU状态详细信息", font=('Arial', 16, 'bold'))
|
||||
title_label.pack(pady=10)
|
||||
|
||||
# 时间标签
|
||||
self.time_label = ttk.Label(main_frame, text="", font=('Arial', 10))
|
||||
self.time_label.pack(pady=5)
|
||||
|
||||
# 创建滚动文本框
|
||||
self.summary_text = scrolledtext.ScrolledText(main_frame, width=90, height=30, wrap=tk.WORD, font=('Courier', 10))
|
||||
self.summary_text.pack(fill=tk.BOTH, expand=True, padx=10, pady=10)
|
||||
|
||||
# 按钮框架
|
||||
button_frame = ttk.Frame(main_frame)
|
||||
button_frame.pack(pady=10)
|
||||
|
||||
# 关闭按钮
|
||||
close_btn = ttk.Button(button_frame, text="关闭", command=self.dialog.destroy)
|
||||
close_btn.pack(side=tk.LEFT, padx=5)
|
||||
|
||||
# 刷新按钮
|
||||
refresh_btn = ttk.Button(button_frame, text="刷新", command=self.update_display)
|
||||
refresh_btn.pack(side=tk.LEFT, padx=5)
|
||||
|
||||
# 初始更新显示
|
||||
self.update_display()
|
||||
|
||||
def update_display(self):
|
||||
"""更新显示数据"""
|
||||
# 更新时间标签
|
||||
self.time_label.config(text=f"更新时间: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}")
|
||||
|
||||
# 生成汇总信息
|
||||
summary = self.generate_summary()
|
||||
|
||||
# 清空并插入新的汇总信息
|
||||
self.summary_text.delete(1.0, tk.END)
|
||||
self.summary_text.insert(1.0, summary)
|
||||
|
||||
def generate_summary(self):
|
||||
"""生成汇总信息"""
|
||||
return f"""CCU状态汇总 - {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}
|
||||
|
||||
燃料电池状态:
|
||||
运行模式: 0x{self.ccu_status.fc_mode:02X}
|
||||
运行状态: 0x{self.ccu_status.fc_status:02X}
|
||||
故障等级: 0x{self.ccu_status.fc_fault_level:02X}
|
||||
输出功率限制: {self.ccu_status.output_power_limit}W
|
||||
累计发电时间: {self.ccu_status.total_generation_time * 0.1:.1f}小时
|
||||
发电总功率: {self.ccu_status.total_generation_power}W
|
||||
故障等级1-4: {self.ccu_status.fault_level_1}, {self.ccu_status.fault_level_2}, {self.ccu_status.fault_level_3}, {self.ccu_status.fault_level_4}
|
||||
储氢容量: {self.ccu_status.hydrogen_capacity}%
|
||||
液氧容量: {self.ccu_status.liquid_oxygen_capacity}%
|
||||
|
||||
传感器数据:
|
||||
钯膜温度: {self.ccu_status.palladium_temp}℃
|
||||
主水路压力: {self.ccu_status.main_pipe_pressure * 0.01:.2f}kPa
|
||||
辅水路压力: {self.ccu_status.aux_pipe_pressure * 0.01:.2f}kPa
|
||||
舱室压力1/2: {self.ccu_status.cabin_pressure1}/{self.ccu_status.cabin_pressure2}Pa
|
||||
舱室温度1/2: {self.ccu_status.cabin_temp1}/{self.ccu_status.cabin_temp2}℃
|
||||
舱室湿度1/2: {self.ccu_status.cabin_humidity1}/{self.ccu_status.cabin_humidity2}%
|
||||
火焰探测器1/2: 0x{self.ccu_status.flame_detector1:02X}/0x{self.ccu_status.flame_detector2:02X}
|
||||
|
||||
浓度检测:
|
||||
H2浓度1/2/3: {self.ccu_status.h2_concentration1}/{self.ccu_status.h2_concentration2}/{self.ccu_status.h2_concentration3}
|
||||
O2浓度1/2: {self.ccu_status.o2_concentration1}/{self.ccu_status.o2_concentration2}
|
||||
CH3OH浓度1/2: {self.ccu_status.ch3oh_concentration1}/{self.ccu_status.ch3oh_concentration2}
|
||||
|
||||
应急电池:
|
||||
电池1电压/电流: {self.ccu_status.emergency_battery1_voltage}V/{self.ccu_status.emergency_battery1_current}A
|
||||
电池1最高温度: {self.ccu_status.emergency_battery1_max_temp}℃
|
||||
电池1故障字: 0x{self.ccu_status.emergency_battery1_fault_word:04X}
|
||||
电池2电压/电流: {self.ccu_status.emergency_battery2_voltage}V/{self.ccu_status.emergency_battery2_current}A
|
||||
电池2最高温度: {self.ccu_status.emergency_battery2_max_temp}℃
|
||||
电池2故障字: 0x{self.ccu_status.emergency_battery2_fault_word:04X}
|
||||
|
||||
舱室环境:
|
||||
舱室氧浓度: {self.ccu_status.cabin_ox_concentration}
|
||||
舱室温度: {self.ccu_status.cabin_temperature}℃
|
||||
舱室湿度: {self.ccu_status.cabin_humidity}%
|
||||
舱室压力: {self.ccu_status.cabin_pressure}Pa
|
||||
动力舱氧浓度: {self.ccu_status.power_cabin_ox_concentration}
|
||||
动力舱温度: {self.ccu_status.power_cabin_temperature}℃
|
||||
动力舱湿度: {self.ccu_status.power_cabin_humidity}%
|
||||
动力舱压力: {self.ccu_status.power_cabin_pressure}Pa
|
||||
|
||||
报警状态:
|
||||
动态报警标志: {[flag for flag in self.ccu_status.dyn_alarm_flag]}
|
||||
绝缘报警标志: {[flag for flag in self.ccu_status.ins_alarm_flag]}
|
||||
动态报警总数: {sum(self.ccu_status.dyn_alarm_flag)}
|
||||
绝缘报警总数: {sum(self.ccu_status.ins_alarm_flag)}
|
||||
|
||||
继电器状态:
|
||||
仪表继电器1/2: 0x{self.ccu_status.ins_relay_status1:02X}/0x{self.ccu_status.ins_relay_status2:02X}
|
||||
动力继电器1/2: 0x{self.ccu_status.dyn_relay_status1:02X}/0x{self.ccu_status.dyn_relay_status2:02X}
|
||||
|
||||
功率信息:
|
||||
仪表最大放电功率: {self.ccu_status.ins_max_discharge_power}W
|
||||
动力最大放电功率: {self.ccu_status.dyn_max_discharge_power}W
|
||||
仪表SOC: {self.ccu_status.ins_soc}%
|
||||
动力SOC: {self.ccu_status.dyn_soc}%
|
||||
仪表总能量: {self.ccu_status.ins_total_energy}Wh
|
||||
动力总能量: {self.ccu_status.dyn_total_energy}Wh
|
||||
仪表功率输入: {self.ccu_status.ins_power_input}W
|
||||
动力功率输入: {self.ccu_status.dyn_power_input}W
|
||||
|
||||
充电状态:
|
||||
仪表充电状态: 0x{self.ccu_status.ins_charge_status:02X}
|
||||
动力充电状态: 0x{self.ccu_status.dyn_charge_status:02X}
|
||||
|
||||
电气参数:
|
||||
仪表链路电压: {self.ccu_status.ins_voltage_link * 0.1:.1f}V
|
||||
仪表电池电压: {self.ccu_status.ins_voltage_pack * 0.1:.1f}V
|
||||
仪表电流: {self.ccu_status.ins_current * 0.1:.1f}A
|
||||
仪表正极绝缘电阻: {self.ccu_status.ins_resistance_pos}Ω
|
||||
仪表负极绝缘电阻: {self.ccu_status.ins_resistance_neg}Ω
|
||||
动力链路电压: {self.ccu_status.dyn_voltage_link * 0.1:.1f}V
|
||||
动力电池电压: {self.ccu_status.dyn_voltage_pack * 0.1:.1f}V
|
||||
动力电流: {self.ccu_status.dyn_current * 0.1:.1f}A
|
||||
动力正极绝缘电阻: {self.ccu_status.dyn_resistance_pos}Ω
|
||||
动力负极绝缘电阻: {self.ccu_status.dyn_resistance_neg}Ω
|
||||
|
||||
紧急状态:
|
||||
仪表紧急状态: 0x{self.ccu_status.ins_emergency_status:02X}
|
||||
动力紧急状态: 0x{self.ccu_status.dyn_emergency_status:02X}
|
||||
|
||||
SOC门限值:
|
||||
仪表SOC门限1/2/3: {self.ccu_status.ins_soc_threshold1}/{self.ccu_status.ins_soc_threshold2}/{self.ccu_status.ins_soc_threshold3}%
|
||||
动力SOC门限1/2/3: {self.ccu_status.dyn_soc_threshold1}/{self.ccu_status.dyn_soc_threshold2}/{self.ccu_status.dyn_soc_threshold3}%
|
||||
|
||||
功率限制值:
|
||||
仪表功率限制1/2: {self.ccu_status.ins_power_limit1}/{self.ccu_status.ins_power_limit2}W
|
||||
动力功率限制1/2: {self.ccu_status.dyn_power_limit1}/{self.ccu_status.dyn_power_limit2}W
|
||||
|
||||
设备在线状态:
|
||||
设备在线标志1: 0x{self.ccu_status.device_online_flag1:08X}
|
||||
设备在线标志2: 0x{self.ccu_status.device_online_flag2:08X}
|
||||
|
||||
其他状态:
|
||||
动力充电等级: 0x{self.ccu_status.dyn_charge_level:02X}
|
||||
动力漏水状态: 0x{self.ccu_status.dyn_water_leak_status:02X}
|
||||
仪表漏水DCDC状态: 0x{self.ccu_status.ins_water_leak_dcdc_status:02X}
|
||||
心跳计数器: {self.ccu_status.heartbeat}
|
||||
"""
|
||||
|
||||
def set_ccu_status(self, ccu_status):
|
||||
"""设置CCU状态数据"""
|
||||
self.ccu_status = ccu_status
|
||||
self.update_display()
|
||||
|
||||
|
||||
# 测试函数
|
||||
def test_ccu_summary_dialog():
|
||||
"""测试CCU状态汇总弹窗"""
|
||||
root = tk.Tk()
|
||||
root.withdraw() # 隐藏主窗口
|
||||
|
||||
# 设置一些测试数据
|
||||
test_status = ccuMsg.msg_ccUFbMsg()
|
||||
test_status.fc_mode = 0x02 # 自动模式
|
||||
test_status.fc_status = 0x06 # 运行状态
|
||||
test_status.output_power_limit = 15000
|
||||
test_status.total_generation_time = 100 # 10小时
|
||||
test_status.hydrogen_capacity = 80
|
||||
test_status.liquid_oxygen_capacity = 75
|
||||
test_status.ins_soc = 85
|
||||
test_status.dyn_soc = 90
|
||||
test_status.heartbeat = 12345
|
||||
test_status.palladium_temp = 65
|
||||
test_status.main_pipe_pressure = 1500 # 15.00 kPa
|
||||
test_status.aux_pipe_pressure = 800 # 8.00 kPa
|
||||
|
||||
# 设置一些报警标志
|
||||
test_status.dyn_alarm_flag[0] = 1
|
||||
test_status.ins_alarm_flag[2] = 1
|
||||
|
||||
# 创建弹窗
|
||||
dialog = CCUStatusSummaryDialog(root, test_status)
|
||||
|
||||
# 等待弹窗关闭
|
||||
root.wait_window(dialog.dialog)
|
||||
root.destroy()
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
test_ccu_summary_dialog()
|
||||
Reference in New Issue
Block a user