From f3dd9e2c5a6310b40a50133d71f69d615dc21d86 Mon Sep 17 00:00:00 2001 From: zjk <1553836110@qq.com> Date: Tue, 18 Aug 2026 19:45:50 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9E=84=E5=BB=BA=EF=BC=9A=E4=BF=AE=E5=A4=8D?= =?UTF-8?q?=20GTest=20=E9=93=BE=E6=8E=A5=E5=A4=B1=E8=B4=A5=E2=80=94?= =?UTF-8?q?=E2=80=94=E6=98=BE=E5=BC=8F=E6=8C=87=E5=AE=9A=20Linux=20GTest?= =?UTF-8?q?=20=E9=85=8D=E7=BD=AE=EF=BC=8C=E9=81=BF=E5=85=8D=E4=BB=8E=20PAT?= =?UTF-8?q?H=20=E6=8E=A2=E6=B5=8B=E5=88=B0=20Windows=20Anaconda=20?= =?UTF-8?q?=E7=9A=84=20.lib?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 1 + build.sh | 19 +- docs/上位机下位机通信协议.md | 1240 +++++++++++++++ scripts/run_host_sim.sh | 306 ++++ src/CMakeLists.txt | 1 + src/pPowerManger/httpserver/httpserver.cpp | 2 +- src/pPowerManger/upmsg/uPower_disSysState.h | 8 +- src/pPowerMangerHost/CMakeLists.txt | 115 ++ src/pPowerMangerHost/HostSim.cpp | 229 +++ src/pPowerMangerHost/HostSim.h | 61 + src/pPowerMangerHost/HostSim_Info.cpp | 114 ++ src/pPowerMangerHost/HostSim_Info.h | 17 + src/pPowerMangerHost/WebServer.cpp | 115 ++ src/pPowerMangerHost/WebServer.h | 42 + src/pPowerMangerHost/main.cpp | 51 + src/pPowerMangerHost/pPowerMangerHost.moos | 8 + src/pPowerMangerHost/web/index.html | 720 +++++++++ test/disSysTest.zip | Bin 323990 -> 0 bytes test/disSysTest/PowerManagerApp111.py | 1578 +++++++++++++++++++ test/until/DriverTest.cpp | 8 + 20 files changed, 4629 insertions(+), 6 deletions(-) create mode 100644 docs/上位机下位机通信协议.md create mode 100755 scripts/run_host_sim.sh create mode 100644 src/pPowerMangerHost/CMakeLists.txt create mode 100644 src/pPowerMangerHost/HostSim.cpp create mode 100644 src/pPowerMangerHost/HostSim.h create mode 100644 src/pPowerMangerHost/HostSim_Info.cpp create mode 100644 src/pPowerMangerHost/HostSim_Info.h create mode 100644 src/pPowerMangerHost/WebServer.cpp create mode 100644 src/pPowerMangerHost/WebServer.h create mode 100644 src/pPowerMangerHost/main.cpp create mode 100644 src/pPowerMangerHost/pPowerMangerHost.moos create mode 100644 src/pPowerMangerHost/web/index.html delete mode 100644 test/disSysTest.zip create mode 100644 test/disSysTest/PowerManagerApp111.py diff --git a/.gitignore b/.gitignore index 9a673a8..078ff44 100644 --- a/.gitignore +++ b/.gitignore @@ -250,6 +250,7 @@ bin/ccuState.txt bin/pPowerManger bin/SQLiteTest bin/pPMtest +bin/pPowerMangerHost # CI test reports reports/ diff --git a/build.sh b/build.sh index e96a58a..25e9198 100755 --- a/build.sh +++ b/build.sh @@ -38,7 +38,24 @@ done mkdir -p build cd build -cmake -DCMAKE_BUILD_TYPE=${BUILD_TYPE} ../ +# 修复: PATH 中包含了 Windows Anaconda(/mnt/d/Software/Anaconda), +# 其下的 GTest 是 Windows .lib, 无法被 Linux 链接器使用。 +# 因此显式指定 Linux 平台的 GTest 配置, 覆盖 CMake 从 PATH 探测到的不正确路径。 +CMAKE_ARGS="-DCMAKE_BUILD_TYPE=${BUILD_TYPE}" +if [ -z "${GTest_DIR}" ]; then + for GTEST_CONFIG in \ + /usr/lib/x86_64-linux-gnu/cmake/GTest/GTestConfig.cmake \ + /usr/lib/cmake/GTest/GTestConfig.cmake \ + /usr/local/lib/cmake/GTest/GTestConfig.cmake \ + "${HOME}/miniconda/lib/cmake/GTest/GTestConfig.cmake"; do + if [ -f "${GTEST_CONFIG}" ]; then + CMAKE_ARGS="${CMAKE_ARGS} -DGTest_DIR=$(dirname "${GTEST_CONFIG}")" + break + fi + done +fi + +cmake ${CMAKE_ARGS} ../ make ${CMD_LINE_ARGS} cd ${INVOCATION_ABS_DIR} diff --git a/docs/上位机下位机通信协议.md b/docs/上位机下位机通信协议.md new file mode 100644 index 0000000..44b1e65 --- /dev/null +++ b/docs/上位机下位机通信协议.md @@ -0,0 +1,1240 @@ +# H100PowerManger 上位机 / 下位机通信协议 + +> 本文档整理自 `src/pPowerManger` 源码,完整描述能源管理程序 `pPowerManger` 与 **上位机**(任务规划 / 决策 / 外部通信 / XC 阵 / ZDP 等 MOOS 应用)以及与 **下位机**(复合管控器 CCU、高压母线、高压汇流排 A、仪表母线、仪表汇流排等配电设备)之间的通信协议。 +> +> 主要源码依据: +> - 上位机:`UpperCommManager.h/.cpp`、`PowerManger.h/.cpp`、`driver.h/.cpp`、`upmsg/*.h` +> - 下位机:`LowerCommManager.h/.cpp`、`udpcomm/udpComm.h/.cpp`、`udpcomm/ccuUdpMsg.h`、`pmSysvariable.h` + +## 目录 + +1. [总体架构](#1-总体架构) +2. [上位机通信协议(MOOS + JSON)](#2-上位机通信协议moos--json) + - 2.1 通信方式与参数 + - 2.2 消息总览 + - 2.3 上位机 → pPowerManger(订阅消息) + - 2.4 pPowerManger → 上位机(发布消息) + - 2.5 设备表(DriverTable)字段 + - 2.6 次级配电(secdist)字段 + - 2.7 设备 ID 枚举 +3. [下位机通信协议(UDP 二进制)](#3-下位机通信协议udp-二进制) + - 3.1 通信方式与参数 + - 3.2 通用帧格式与校验 + - 3.3 消息 ID 汇总 + - 3.4 复合管控器(CCU)报文 + - 3.5 配电系统报文 +4. [附录:常量与枚举](#4-附录常量与枚举) + +--- + +## 1. 总体架构 + +``` + ┌─────────────────────────────────────────────────────┐ + │ 上 位 机 │ + │ 任务规划 / 决策 / 外部通信 / XC阵 / ZDP / 推进器 │ + └─────────────────────┬───────────────────────────────┘ + │ MOOS 消息(JSON 字符串) + │ MOOSDB ServerPort=9000 AppTick=4 + ┌─────────────────────▼───────────────────────────────┐ + │ pPowerManger(能源管理程序) │ + │ UpperCommManager ⇄ 状态机 FSM ⇄ LowerCommManager │ + └─────────────────────┬───────────────────────────────┘ + │ UDP 二进制帧(小端) + │ 本机 5001 ⇄ CCU 192.168.0.140:7000 + ┌─────────────────────▼───────────────────────────────┐ + │ 下 位 机 │ + │ 复合管控器 CCU / 高压母线 / 高压汇流排A / 仪表母线 / 仪表汇流排 │ + └─────────────────────────────────────────────────────┘ +``` + +- **上位机通信**:MOOS 变量承载 **JSON 字符串**,由 `UpperCommManager` 处理。订阅注册于 `PowerManger::registerVariables()`,发布通过 `PowerManger::sendNotification()`。 +- **下位机通信**:**UDP** 承载 **二进制结构体帧**(`#pragma pack(1)` 紧凑、小端),由 `LowerCommManager` + `udpComm` 处理。 +- 关键配置(`PowerManger.h`): + + ```c + #define IPORT 5001 // 本机 UDP 监听端口 + #define CCUPORT 7000 // CCU 目标端口 + #define CCUHOST "192.168.0.140" // CCU 目标地址 + #define MAX_UDP_PKT_SIZE 65535 // UDP 最大报文 + ``` + +--- + +## 2. 上位机通信协议(MOOS + JSON) + +### 2.1 通信方式与参数 + +| 项目 | 说明 | +|------|------| +| 传输载体 | MOOS 消息(`CMOOSMsg`),值为 `std::string` 型 JSON | +| 报文格式 | JSON(jsoncpp),键名带类型后缀,如 `xxx_uint8`、`xxx_fp32`、`xxx_array` | +| 运行频率 | `AppTick = 4`(状态机主循环 4Hz)、`CommsTick = 4` | +| 消息倾斜校验 | `OnNewMail` 中,消息时标与本地时差 > `m_skew`(默认 10s)则丢弃 | +| 周期发送 | `commLoop()` 每 1s 调用 `processPeriodicTasks()` 发布周期反馈 | + +### 2.2 消息总览 + +#### 2.2.1 订阅消息(上位机 → pPowerManger) + +| 序号 | MOOS 变量名 | 含义 | 触发动作 | +|------|-------------|------|----------| +| 1 | `uPower_sysState_cmd` | 系统主控指令 | `MasterCommandEvent` | +| 2 | `uPower_equState_cmd` | 设备控制指令(设备表) | `DevCmdExt`(逐设备) | +| 3 | `uDevice_secdistState_st` | 次级配电状态反馈 | 更新 `m_subDisSysState` | +| 4 | `uDevice_depth_st` | 深度(三路取均值) | 更新 `m_depth` | +| 5 | `uPlan_taskStart_st` | 任务开始 | `TaskStartEvent` | +| 6 | `uPlan_planStop_st` | 任务停止 | — | +| 7 | `uExternComm_setOpCondition_cmd` | 设置工况 | `MasterCommandEvent` | +| 8 | `uExternComm_setOpMode_cmd` | 设置模式 | `MasterCommandEvent` | +| 9 | `uExternComm_setPowerSystem_cmd` | 设置电源系统 | `MasterCommandEvent` | +| 10 | `uExternComm_setDeviceSwitch_cmd` | 单个设备开关 | `DevCmdExt` | +| 11 | `uDetect_xcVoltage_cmd` | XC 阵电压申请 | 舷侧声呐电压指令 | +| 12 | `uDetect_zdpVoltage_cmd` | ZDP 电压申请 | 低频声呐开关 | +| 13 | `uDevice_thruster_st` | 推进器状态 | 更新转速/使能 | + +> `uExternComm_setThrustSpeed_cmd`(字段 `rpm_int16`、`enable_int16`)已在 `upmsg` 中定义,但 `registerVariables()` 中已注释,当前**未订阅**。 + +#### 2.2.2 发布消息(pPowerManger → 上位机) + +| 序号 | MOOS 变量名 | 含义 | +|------|-------------|------| +| 1 | `uPower_pmState_fb` | 能源管理整体状态 | +| 2 | `uPower_fcsState_st` | 燃料电池系统状态 | +| 3 | `uPower_liBatState_st` | 锂电池状态(仪表 / 动力 / 应急) | +| 4 | `uPower_disSysState_st` | 配电系统状态(断路器位图 + 故障码) | +| 5 | `uPower_currentState_st` | 各母线电压 / 电流 | +| 6 | `uPower_equState_fb` | 设备状态反馈(设备表) | +| 7 | `uPower_secdistState_cmd` | 次级配电指令(UNIT1~5 设备开关) | +| 8 | `uPower_equInsState_fb` | 设备在线状态(位图) | +| 9 | `uPower_subDisFault_st` | (仅 `_DEBUG`)次级配电故障表 | + +--- + +### 2.3 上位机 → pPowerManger(订阅消息) + +#### 2.3.1 `uPower_sysState_cmd` — 系统主控指令 + +解析结果写入 `m_msCmd`(`MSControlCmd`),并触发 `MasterCommandEvent`。 + +| 字段 | 类型 | 说明 | +|------|------|------| +| `powerCMD` | uint | 电源系统指令 | +| `modCMD` | uint | 模式指令 | +| `workCMD` | uint | 工况指令 | + +示例: + +```json +{"powerCMD":1,"modCMD":2,"workCMD":3} +``` + +#### 2.3.2 `uPower_equState_cmd` — 设备控制指令(设备表) + +解析 `DriverTable`,逐条派发 `DevCmdExt{id, cmd}`(`id` 为设备 ID,见 2.7)。字段名 → 设备 ID 映射见 `Driver::loadDriverIdFromJson()`。 + +JSON 字段为 `<设备名>_uint8`,取值含义见 `EquipmentCommand`(0=断电,1=上电,2=仪表电上电,3=动力电上电,4=仪表电断电,5=动力电断电)。 + +示例: + +```json +{"thruster_uint8":1,"depth1_uint8":1,"buoyage_uint8":0} +``` + +> 完整字段清单见 [2.5 设备表字段](#25-设备表drivertable字段)。 + +#### 2.3.3 `uDevice_secdistState_st` — 次级配电状态反馈 + +解析到 `m_subDisSysState`(`DriverTable`)。字段为 `<设备名>_uint8`,按 UNIT1~5 分组。 + +> 完整字段清单见 [2.6 次级配电字段](#26-次级配电secdist字段)。 + +#### 2.3.4 `uDevice_depth_st` — 深度 + +| 字段 | 类型 | 说明 | +|------|------|------| +| `value_array_int32` | int[] | 深度数组,取前 3 个元素平均值 | + +示例: + +```json +{"value_array_int32":[1200,1210,1190]} +``` + +#### 2.3.5 `uPlan_taskStart_st` — 任务开始 + +| 字段 | 类型 | 说明 | +|------|------|------| +| `taskType_str` | string | 任务类型(见 `TaskType::fromString`) | +| `balanceEnabled_bool` | bool | 使能浮力调节 | +| `bowRudderUnfold_bool` | bool | 艏舵展开 | + +示例: + +```json +{"taskType_str":"sail","balanceEnabled_bool":true,"bowRudderUnfold_bool":false} +``` + +#### 2.3.6 `uPlan_planStop_st` — 任务停止 + +| 字段 | 类型 | 说明 | +|------|------|------| +| `op_int32` | int | 1 = 停止 | + +示例: + +```json +{"op_int32":1} +``` + +#### 2.3.7 `uExternComm_setOpCondition_cmd` — 设置工况 + +| 字段 | 类型 | 说明 | +|------|------|------| +| `state_uint8` | uint | 工况值(见 `WorkCondition`) | + +#### 2.3.8 `uExternComm_setOpMode_cmd` — 设置模式 + +| 字段 | 类型 | 说明 | +|------|------|------| +| `state_uint8` | uint | 模式值(见 `RunMode`) | + +#### 2.3.9 `uExternComm_setPowerSystem_cmd` — 设置电源系统 + +| 字段 | 类型 | 说明 | +|------|------|------| +| `powerCmd_uint8` | uint | 电源系统指令 | + +#### 2.3.10 `uExternComm_setDeviceSwitch_cmd` — 单个设备开关 + +| 字段 | 类型 | 说明 | +|------|------|------| +| `id_uint8` | uint | 设备 ID(见 2.7) | +| `cmd_uint8` | uint | 开关指令(`EquipmentCommand`) | + +示例: + +```json +{"id_uint8":53,"cmd_uint8":1} +``` + +#### 2.3.11 `uDetect_xcVoltage_cmd` — XC 阵电压申请 + +| 字段 | 类型 | 说明 | +|------|------|------| +| `xcLowVoltageAdd_int32` | int | 低压申请(0=无命令,1=申请仪表上电,2=申请仪表断电) | +| `xcHighVoltageAdd_int32` | int | 高压申请(0=无命令,1=申请高压上电,2=申请高压断电) | + +#### 2.3.12 `uDetect_zdpVoltage_cmd` — ZDP 电压申请 + +| 字段 | 类型 | 说明 | +|------|------|------| +| `zdpVoltageAdd_int32` | int | 电压申请(同 XC 定义) | + +#### 2.3.13 `uDevice_thruster_st` — 推进器状态 + +| 字段 | 类型 | 单位 | 说明 | +|------|------|------|------| +| `rpm_int16` | int16 | rpm | 实际转速 | +| `voltage_uint16` | uint16 | V | 电压 | +| `current_uint16` | uint16 | A | 电流 | +| `ctrlTemp_uint16` | uint16 | ℃ | 控制器温度 | +| `motorTemp_uint16` | uint16 | ℃ | 电机温度 | +| `motorTorque_uint16` | uint16 | N·m | 电机扭矩 | +| `maxTorque_uint16` | uint16 | N·m | 电机最大扭矩(0=未使能) | +| `error_int64` | int64 | — | 错误码 | + +--- + +### 2.4 pPowerManger → 上位机(发布消息) + +#### 2.4.1 `uPower_pmState_fb` — 能源管理整体状态 + +| 字段 | 类型 | 说明 | +|------|------|------| +| `workCondition_uint8` | uint8 | 当前工况(`WorkCondition`) | +| `currentMod_uint8` | uint8 | 当前模式 | +| `powerState_uint8` | uint8 | 电源状态 | +| `faultLevel_uint8` | uint8 | 故障等级(取 `getFaultCodeLevel()`) | +| `faultCode_array` | uint[] | 故障码数组 | +| `soc_uint16` | uint16 | 荷电状态 SOC | +| `sustainableTime_int64` | int64 | 可持续时间 | +| `leakage_uint8` | uint8 | 漏水标志(`generateLeakageCode()`) | +| `info_str` | string | 系统信息描述 | + +#### 2.4.2 `uPower_fcsState_st` — 燃料电池系统状态 + +| 字段 | 类型 | 说明 | +|------|------|------| +| `backpressure1_fp32` | float | 背压 1 | +| `backpressure2_fp32` | float | 背压 2 | +| `ch4oConcent1_fp32` | float | 甲醇浓度 1 | +| `ch4oConcent2_fp32` | float | 甲醇浓度 2 | +| `ch4o_fp32` | float | 备用 | +| `excTemp_fp32` | float | 钯膜温度 | +| `fcuCurIns_fp32` | float | 备用 | +| `fcuCurPower_fp32` | float | 备用 | +| `fcuCur_fp32` | float | 备用 | +| `fcuFaultLeve_uint8` | uint8 | 故障等级 | +| `fcuOutIns_fp32` | float | 备用 | +| `fcuOutPower_fp32` | float | 备用 | +| `fcuState_uint8` | uint8 | 燃料电池状态(`FcuState`) | +| `fcuVolIns_fp32` | float | 备用 | +| `fcuVolPower_fp32` | float | 备用 | +| `fcuVol_fp32` | float | 备用 | +| `h2Concent1_fp32` | float | H2 浓度 1 | +| `h2Concent2_fp32` | float | H2 浓度 2 | +| `o2Concent1_fp32` | float | O2 浓度 1 | +| `o2Concent2_fp32` | float | O2 浓度 2 | +| `o2Level_fp32` | float | 备用 | +| `o2_fp32` | float | 备用 | +| `powLimit_fp32` | float | 输出功率限制 | +| `powerGen_fp32` | float | 累计发电功率 | +| `flameDet_uint8` | uint8 | 火焰探测器状态 | +| `faultCode1_uint16` | uint16 | 一级故障字 | +| `faultCode2_uint16` | uint16 | 二级故障字 | +| `faultCode3_uint16` | uint16 | 三级故障字 | +| `faultCode4_uint16` | uint16 | 四级故障字 | +| `fcCommState_uint8` | uint8 | 通信状态(当前固定为 0) | + +#### 2.4.3 `uPower_liBatState_st` — 锂电池状态 + +| 字段 | 类型 | 说明 | +|------|------|------| +| `insBatCurElect_uint16` | uint16 | 仪表电池电流电量 | +| `insBatLimit_uint16` | uint16 | 仪表电池限功率 | +| `insBatSoc_uint8` | uint8 | 仪表电池 SOC | +| `insBatTotalElect_uint16` | uint16 | 仪表电池总能量 | +| `insChargeState_uint8` | uint8 | 仪表电池充放电状态 | +| `insCurSocHold1_uint8` | uint8 | 备用 | +| `insCurSocHold2_uint8` | uint8 | 备用 | +| `insCurSocHold3_uint8` | uint8 | 备用 | +| `insCurrent_uint16` | uint16 | 仪表电池电流 | +| `insLinkVol_uint16` | uint16 | 仪表电池 LINK 电压 | +| `insNegRelayState_uint8` | uint8 | 仪表电池负极继电器状态(固定 0) | +| `insNegRes_uint16` | uint16 | 仪表电池负极绝缘电阻 | +| `insPackVol_uint16` | uint16 | 仪表电池 PACK 电压 | +| `insPosRelayState_uint8` | uint8 | 仪表电池正极继电器状态(固定 0) | +| `insPosRes_uint16` | uint16 | 仪表电池正极绝缘电阻 | +| `powBatCurElect_uint16` | uint16 | 动力电池电流电量(固定 0) | +| `powBatSoc_uint8` | uint8 | 动力电池 SOC | +| `powBatTotalElect_uint16` | uint16 | 动力电池总能量 | +| `powChargeState_uint8` | uint8 | 动力电池充放电状态 | +| `powCurSocHold1_uint8` | uint8 | 备用 | +| `powCurSocHold2_uint8` | uint8 | 备用 | +| `powCurSocHold3_uint8` | uint8 | 备用 | +| `powCurToInsLimit1_uint8` | uint8 | 动力→仪表限功率 1 | +| `powCurToInsLimit2_uint8` | uint8 | 动力→仪表限功率 2 | +| `powCur_uint16` | uint16 | 动力电池电流 | +| `powLinkVol_uint16` | uint16 | 动力电池 LINK 电压 | +| `powNegRelayState_uint8` | uint8 | 动力电池负极继电器状态(固定 0) | +| `powNegRes_uint16` | uint16 | 动力电池负极绝缘电阻 | +| `powPosRelayState_uint8` | uint8 | 动力电池正极继电器状态(固定 0) | +| `powPosRes_uint16` | uint16 | 动力电池正极绝缘电阻 | +| `powerBatLimit_uint16` | uint16 | 备用 | +| `powerPackVol_uint16` | uint16 | 动力电池 PACK 电压 | +| `powFaultCode_uint8` | uint8 | 动力电池故障码 | +| `insFaultCode_uint8` | uint8 | 仪表电池故障码 | +| `insCommState_uint8` | uint8 | 仪表电池通信状态(固定 0) | +| `powCommState_uint8` | uint8 | 动力电池通信状态(固定 0) | +| `emergencyBattery1Voltage_int16` | int16 | 应急电池 1 电压 | +| `emergencyBattery1Current_int16` | int16 | 应急电池 1 电流 | +| `emergencyBattery1MaxTemp_int16` | int16 | 应急电池 1 最高温度 | +| `emergencyBattery1FaultWord_uint16` | uint16 | 应急电池 1 故障字 | +| `emergencyBattery2Voltage_int16` | int16 | 应急电池 2 电压 | +| `emergencyBattery2Current_int16` | int16 | 应急电池 2 电流 | +| `emergencyBattery2MaxTemp_int16` | int16 | 应急电池 2 最高温度 | +| `emergencyBattery2FaultWord_uint16` | uint16 | 应急电池 2 故障字 | + +#### 2.4.4 `uPower_disSysState_st` — 配电系统状态 + +| 字段 | 类型 | 说明 | +|------|------|------| +| `HVolABusBreaker_uint16` | uint16 | 高压母线(BUS1)断路器位图 | +| `HVolBBusBreaker_uint16` | uint16 | 高压汇流排 A(BUS2)断路器位图 | +| `HVolBusBreaker_uint16` | uint16 | 仪表母线(BUS3)断路器位图 | +| `LVolBusBreaker_uint16` | uint16 | 仪表汇流排(BUS4)断路器位图 | +| `faultCode_array` | uint[] | 配电故障码数组 | + +位图定义(bit0 起始): + +| 位 | HVolABusBreaker | HVolBBusBreaker | HVolBusBreaker | LVolBusBreaker | +|----|-----------------|-----------------|----------------|----------------| +| bit0 | 燃料电池断路器 | 艏部FT装置1-3 | 锂电池组(仪表)断路器 | UNIT1断路器 | +| bit1 | 动力锂电池断路器 | 启闭机构断路器 | 艏部低压配电箱断路器 | UNIT2断路器 | +| bit2 | 推进电机断路器 | 桅杆舵机控制箱断路器 | UNIT4仪表DC48V断路器 | UNIT3断路器 | +| bit3 | 锂电池组仪表断路器 | XCZ断路器 | DC-C1直流配电板断路器 | UNIT5断路器 | +| bit4 | DC/DC5模块断路器 | 艏舵控制箱断路器 | 预留断路器1 | 艏部PZ装置断路器 | +| bit5 | 艏部高压配电箱断路器 | 敞水盖启动电缸断路器 | 预留断路器2 | 预留断路器1 | +| bit6 | 艉部FT装置4/5断路器 | — | 应急锂电池组2断路器 | 预留断路器2 | +| bit7 | 艉舵开关1断路器 | — | — | 应急锂电池组1断路器 | +| bit8 | 艉舵开关2断路器 | — | — | — | +| bit9 | FB预留断路器 | — | — | — | +| bit10 | TYZ预留断路器 | — | — | — | +| bit11 | 预留断路器 | — | — | — | + +#### 2.4.5 `uPower_currentState_st` — 各母线电压/电流 + +**高压母线(HVB,BUS1)** + +| 字段 | 类型 | 来源 | +|------|------|------| +| `HVBpowerBusVol_uint16` | uint16 | 动力汇流排电压 | +| `HVBdcDc5Cur_uint16` | uint16 | DC/DC5 模块电流 | +| `HVBpowerBusCur_uint16` | uint16 | 动力汇流排电流 | +| `HVBbusAVol_uint16` | uint16 | A 汇流排电压 | +| `HVBmotorCur_uint16` | uint16 | 推进电机控制箱电流 | +| `HVBbusACur_uint16` | uint16 | A 汇流排电流 | +| `HVBbatGroupCur_uint16` | uint16 | 锂电池组(仪表)电流 | +| `HVBbowHVolDisBoxCur_uint16` | uint16 | 艏部高压配电箱电流 | +| `HVBFTDev45Cur_uint16` | uint16 | 艉部FT装置4/5电流 | +| `HVBtyzCur_uint16` | uint16 | TYZ预留开关电流 | +| `HVBsternRud1Cur_uint16` | uint16 | 艉舵开关1电流 | +| `HVBreservedCur1_uint16` | uint16 | 预留电流1 | +| `HVBsternRud2Cur_uint16` | uint16 | 艉舵开关2电流 | +| `HVBreservedCur2_uint16` | uint16 | 预留电流2 | +| `HVBfbCur_uint16` | uint16 | FB预留电流 | +| `HVBreservedCur3_uint16` | uint16 | 预留电流3 | + +**高压汇流排 A(HVAB,BUS2)** + +| 字段 | 类型 | 来源 | +|------|------|------| +| `HVABbusBVol_uint16` | uint16 | 汇流排 B 电压 | +| `HVABbusBCur_uint16` | uint16 | 汇流排 B 电流 | +| `HVABFTDev123Cur_uint16` | uint16 | 艏部FT装置1/2/3电流 | +| `HVABactCur_uint16` | uint16 | 启闭机构电流 | +| `HVABmastSteGeaCur_uint16` | uint16 | 桅杆舵机控制箱电流 | +| `HVABxczCur_uint16` | uint16 | XCZ电流 | +| `HVABbowRudCur_uint16` | uint16 | 艏舵控制箱电流 | +| `HVABopenWaterCur_uint16` | uint16 | 敞水盖启动电缸电流 | + +**仪表母线(HVBB,BUS3)** + +| 字段 | 类型 | 来源 | +|------|------|------| +| `HVBBinsBusVol_uint16` | uint16 | 仪表母排电压 | +| `HVBBbowLowVolDisBoxCur_uint16` | uint16 | 艏部低压配电箱电流 | +| `HVBBdcC1InsCur_uint16` | uint16 | DC-C1 仪表DC48V电流 | +| `HVBBreservedCur1_uint16` | uint16 | 预留电流1 | +| `HVBBemerBatCur_uint16` | uint16 | 应急锂电池组2电流 | +| `HVBBbatInsCur_uint16` | uint16 | 锂电池组(仪表)电流 | +| `HVBBunit4Cur_uint16` | uint16 | UNIT4 仪表DC48V电流 | +| `HVBBreservedCur2_uint16` | uint16 | 预留电流2 | +| `HVBBemer2BusVol_uint16` | uint16 | 应急2汇流排电压 | +| `HVBBCCUCur_uint16` | uint16 | 复合能源管控系统应急DC48V电流 | +| `HVBBFCSSecurSysCur_uint16` | uint16 | 燃料电池安全系统应急DC48V电流 | +| `HVBBplcCur_uint16` | uint16 | PLC控制电源电流 | + +**仪表汇流排(LVB,BUS4)** + +| 字段 | 类型 | 来源 | +|------|------|------| +| `LVBinsBusVol_uint16` | uint16 | 仪表母排电压 | +| `LVBBinsBusCur_uint16` | uint16 | 仪表母排电流 | +| `LVBBunit1Cur_uint16` | uint16 | UNIT1 电流 | +| `LVBBunit2Cur_uint16` | uint16 | UNIT2 电流 | +| `LVBBunit3Cur_uint16` | uint16 | UNIT3 电流 | +| `LVBBunit5Cur_uint16` | uint16 | UNIT5 电流 | +| `LVBBbowPZDevCur_uint16` | uint16 | 艏部PZ装置电流 | +| `LVBBemerBatCur_uint16` | uint16 | 应急锂电池组1电流 | +| `LVBBemerBusVol_uint16` | uint16 | 应急1汇流排电压 | + +#### 2.4.6 `uPower_equState_fb` — 设备状态反馈 + +设备表 JSON(字段同 2.5),反映当前设备状态。 + +#### 2.4.7 `uPower_secdistState_cmd` — 次级配电指令 + +次级配电 JSON(字段同 2.6),向次级配电系统下发 UNIT1~5 设备开关指令。 + +#### 2.4.8 `uPower_equInsState_fb` — 设备在线状态(位图) + +| 字段 | 类型 | 说明 | +|------|------|------| +| `sensor_int16` | uint16 | 传感器状态位图 | +| `actuator_int16` | uint16 | 执行机构状态位图 | +| `motion_int16` | uint16 | 运动状态位图 | +| `loadcomm_int16` | uint16 | 负载通信状态位图 | +| `throwpower_int16` | uint16 | 抛载/电源状态位图 | + +位图定义: + +| 位 | sensor_int16 | actuator_int16 | motion_int16 | loadcomm_int16 | throwpower_int16 | +|----|--------------|----------------|--------------|----------------|------------------| +| bit0 | 单波束声呐1 | 启闭机构1 | 艉部舵机1 | 载荷发控 | 艏部抛载 | +| bit1 | 单波束声呐2 | 启闭机构2 | 艉部舵机2 | 光电桅杆 | 保留 | +| bit2 | 单波束声呐3 | 启闭机构3 | 艉部舵机3 | 电磁桅杆 | 保留 | +| bit3 | 单波束声呐4 | 启闭机构4 | 艉部舵机4 | 保留 | 保留 | +| bit4 | 单波束声呐5 | 启闭机构5 | 艏舵电缸 | 舷侧声纳 | 保留 | +| bit5 | 单波束声呐6 | 启闭机构6 | 注水机构 | 拖曳声纳 | 保留 | +| bit6 | 单波束声呐7 | 保留 | 推进电机 | 保留 | 保留 | +| bit7 | 单波束声呐8 | 保留 | 浮调机构1 | 保留 | 保留 | +| bit8 | 前视声呐 | 敞水机构1 | 浮调机构2 | 通信桅杆 | 燃料电池控制器 | +| bit9 | CTD1 | 敞水机构2 | 浮调机构3 | 中低频声呐 | 仪表配电板 | +| bit10 | CTD2 | 敞水机构3 | 浮调机构4 | 高频声通机 | 动力配电板 | +| bit11 | 声速仪 | 敞水机构4 | 浮调机构5 | 浮标系统 | 仪表锂电池 | +| bit12 | NTP | 敞水机构5 | DVL | 通信桅杆舵机 | 动力锂电 | +| bit13 | 深度计1 | 敞水机构6 | 惯导系统 | 光电桅杆舵机 | 艉部抛载 | +| bit14 | 深度计2 | 敞水机构7 | 艏舵左舵机 | 电磁桅杆舵机 | 保留 | +| bit15 | 深度计3 | 敞水机构8 | 艏右舵舵机 | 保留 | 保留 | + +--- + +### 2.5 设备表(DriverTable)字段 + +以下字段用于 `uPower_equState_cmd` 与 `uPower_equState_fb`,全部为 `<设备名>_uint8`: + +| 序号 | 字段 | 对应设备 ID | +|------|------|-------------| +| 1 | `depth1_uint8` | 18 | +| 2 | `depth2_uint8` | 19 | +| 3 | `depth3_uint8` | 20 | +| 4 | `overDeep1_uint8` | 21 | +| 5 | `overDeep2_uint8` | 22 | +| 6 | `ctd1_uint8` | 23 | +| 7 | `ctd2_uint8` | 24 | +| 8 | `soundVeloc_uint8` | 25 | +| 9 | `commDev_uint8` | 40 | +| 10 | `ins_uint8` | 57 | +| 11 | `ntp_uint8` | 58 | +| 12 | `inputWaterSensor1_uint8` | 59 | +| 13 | `inputWaterSensor2_uint8` | 60 | +| 14 | `inputWaterSensor3_uint8` | 61 | +| 15 | `singleBeamSonar1_uint8` | 0 | +| 16 | `singleBeamSonar2_uint8` | 1 | +| 17 | `singleBeamSonar3_uint8` | 2 | +| 18 | `singleBeamSonar4_uint8` | 3 | +| 19 | `singleBeamSonar5_uint8` | 4 | +| 20 | `singleBeamSonar6_uint8` | 5 | +| 21 | `singleBeamSonar7_uint8` | 6 | +| 22 | `singleBeamSonar8_uint8` | 7 | +| 23 | `forwardSonar_uint8` | 8 | +| 24 | `DVL_uint8` | 43 | +| 25 | `lowFreqSonar_uint8` | 36 | +| 26 | `USBL_uint8` | 42 | +| 27 | `bowCover1_uint8` | 9 | +| 28 | `bowCover2_uint8` | 10 | +| 29 | `bowCover3_uint8` | 11 | +| 30 | `bowCover4_uint8` | 12 | +| 31 | `bowCover5_uint8` | 13 | +| 32 | `bowCover6_uint8` | 14 | +| 33 | `bowRudderDeploy_uint8` | 15 | +| 34 | `bowRudderServo1_uint8` | 16 | +| 35 | `bowRudderServo2_uint8` | 17 | +| 36 | `bowWaterInet1_uint8` | 27 | +| 37 | `bowWaterInet2_uint8` | 28 | +| 38 | `bowWaterInet3_uint8` | 29 | +| 39 | `bowWaterInet4_uint8` | 30 | +| 40 | `bowWaterInet5_uint8` | 31 | +| 41 | `bowWaterInet6_uint8` | 32 | +| 42 | `bowWaterInet7_uint8` | 33 | +| 43 | `bowWaterInet8_uint8` | 34 | +| 44 | `waterInject_uint8` | 26 | +| 45 | `mastLiftingServo_uint8` | 41 | +| 46 | `buoyancyAdjust1_uint8` | 44 | +| 47 | `buoyancyAdjust2_uint8` | 45 | +| 48 | `buoyancyAdjust3_uint8` | 46 | +| 49 | `buoyancyAdjust4_uint8` | 47 | +| 50 | `buoyancyAdjust5_uint8` | 48 | +| 51 | `sternRudderServo1_uint8` | 49 | +| 52 | `sternRudderServo2_uint8` | 50 | +| 53 | `sternRudderServo3_uint8` | 51 | +| 54 | `sternRudderServo4_uint8` | 52 | +| 55 | `thruster_uint8` | 53 | +| 56 | `bowThrow_uint8` | 54 | +| 57 | `sternThrow_uint8` | 55 | +| 58 | `photoSensor_uint8` | 38 | +| 59 | `electSensor_uint8` | 39 | +| 60 | `launchControler_uint8` | 37 | +| 61 | `sideSonar_uint8` | 35 | +| 62 | `buoyage_uint8` | 56 | + +--- + +### 2.6 次级配电(secdist)字段 + +以下字段用于 `uPower_secdistState_cmd` 与 `uDevice_secdistState_st`,全部为 `<设备名>_uint8`: + +**UNIT1(19 项)** + +| 字段 | 字段 | 字段 | +|------|------|------| +| `bowCover1_uint8` | `bowCover2_uint8` | `bowCover3_uint8` | +| `bowCover4_uint8` | `bowCover5_uint8` | `bowCover6_uint8` | +| `singleBeamSonar1_uint8` | `singleBeamSonar2_uint8` | `singleBeamSonar3_uint8` | +| `singleBeamSonar4_uint8` | `singleBeamSonar5_uint8` | `singleBeamSonar6_uint8` | +| `forwardSonar_uint8` | `depth3_uint8` | `soundVeloc_uint8` | +| `bowRudderServo_uint8` | `bowRudderDeploy_uint8` | `ctd1_uint8` | +| `waterInject_uint8` | | | + +**UNIT2(11 项)** + +| 字段 | 字段 | 字段 | +|------|------|------| +| `sideSonar_uint8` | `bowWaterInet1_uint8` | `bowWaterInet2_uint8` | +| `bowWaterInet3_uint8` | `bowWaterInet4_uint8` | `bowWaterInet5_uint8` | +| `bowWaterInet6_uint8` | `bowWaterInet7_uint8` | `bowWaterInet8_uint8` | +| `launchControler_uint8` | `electSensor_uint8` | `lowFreqSonar_uint8` | + +**UNIT3(11 项)** + +| 字段 | 字段 | 字段 | +|------|------|------| +| `buoyancyAdjust1_uint8` | `buoyancyAdjust2_uint8` | `buoyancyAdjust3_uint8` | +| `USBL_uint8` | `depth1_uint8` | `commDev_uint8` | +| `mastLiftingServo_uint8` | `DVL_uint8` | `ADCP_uint8` | +| `inOutLetWater1_uint8` | `inOutLetWater2_uint8` | | + +**UNIT4(16 项)** + +| 字段 | 字段 | 字段 | +|------|------|------| +| `singleBeamSonar7_uint8` | `singleBeamSonar8_uint8` | `buoyage_uint8` | +| `bowThrow_uint8` | `depth2_uint8` | `thruster_uint8` | +| `dragSonar_uint8` | `haulingMachine_uint8` | `buoyancyAdjust4_uint8` | +| `buoyancyAdjust5_uint8` | `sternRudderServo1_uint8` | `sternRudderServo2_uint8` | +| `sternRudderServo3_uint8` | `sternRudderServo4_uint8` | `ctd2_uint8` | +| `commDevStern_uint8` | `inOutLetWater3_uint8` | | + +**UNIT5(4 项)** + +| 字段 | 字段 | +|------|------| +| `secINS_uint8` | `photoSensor_uint8` | +| `sternThrow_uint8` | `mainINS_uint8` | + +--- + +### 2.7 设备 ID 枚举(DeviceId) + +| ID | 名称 | ID | 名称 | ID | 名称 | +|----|------|----|------|----|------| +| 0 | singleBeamSonar1 | 21 | overDeep1 | 42 | USBL | +| 1 | singleBeamSonar2 | 22 | overDeep2 | 43 | DVL | +| 2 | singleBeamSonar3 | 23 | ctd1 | 44 | buoyancyAdjust1 | +| 3 | singleBeamSonar4 | 24 | ctd2 | 45 | buoyancyAdjust2 | +| 4 | singleBeamSonar5 | 25 | soundVeloc | 46 | buoyancyAdjust3 | +| 5 | singleBeamSonar6 | 26 | waterInject | 47 | buoyancyAdjust4 | +| 6 | singleBeamSonar7 | 27 | bowWaterInet1 | 48 | buoyancyAdjust5 | +| 7 | singleBeamSonar8 | 28 | bowWaterInet2 | 49 | sternRudderServo1 | +| 8 | forwardSonar | 29 | bowWaterInet3 | 50 | sternRudderServo2 | +| 9 | bowCover1 | 30 | bowWaterInet4 | 51 | sternRudderServo3 | +| 10 | bowCover2 | 31 | bowWaterInet5 | 52 | sternRudderServo4 | +| 11 | bowCover3 | 32 | bowWaterInet6 | 53 | thruster | +| 12 | bowCover4 | 33 | bowWaterInet7 | 54 | bowThrow | +| 13 | bowCover5 | 34 | bowWaterInet8 | 55 | sternThrow | +| 14 | bowCover6 | 35 | sideSonar | 56 | buoyage | +| 15 | bowRudderDeploy | 36 | lowFreqSonar | 57 | ins | +| 16 | bowRudderServo1 | 37 | launchControler | 58 | ntp | +| 17 | bowRudderServo2 | 38 | photoSensor | 59 | inputWaterSensor1 | +| 18 | depth1 | 39 | electSensor | 60 | inputWaterSensor2 | +| 19 | depth2 | 40 | commMast | 61 | inputWaterSensor3 | +| 20 | depth3 | 41 | mastLiftingServo | — | — | + +--- + +## 3. 下位机通信协议(UDP 二进制) + +### 3.1 通信方式与参数 + +| 项目 | 说明 | +|------|------| +| 传输 | UDP 单播 | +| 本机地址 | 绑定端口 `5001` | +| 下位机地址 | `192.168.0.140:7000` | +| 字节序 | 小端(little-endian) | +| 对齐 | `#pragma pack(1)` 紧凑,无填充 | +| 监听 | `LowerCommManager::listenThreadFunc()` 独立线程接收 | +| 分拣 | `udpComm::pushMsgToQueue()` 按消息 ID 入队,队列上限 `QUENUE_SIZE = 100` | +| 周期发送 | `commLoop()` 每 1s:`sendCcuCommand`(CCU 操作指令)+ `processPeriodicTasks` | + +### 3.2 通用帧格式与校验 + +所有报文统一为:**消息头(6B)+ 数据区 + 校验字段**。以下帧结构表中,`偏移(字节)` 均为相对整帧起始的绝对偏移。 + +#### 3.2.1 消息头 `m_header`(6 字节) + +| 偏移(字节) | 字段 | 类型 | 说明 | +|------------|------|------|------| +| 0 | start1 | u8 | 起始符 1 | +| 1 | start2 | u8 | 起始符 2 | +| 2~3 | id | u16 | 消息标识(小端) | +| 4~5 | length | u16 | 数据区长度 | + +- 起始符分类: + - CCU 报文:`start1 = start2 = 0x20` + - 配电报文:`start1 = start2 = 0x40` + +#### 3.2.2 日期 `m_date`(8 字节,仅 CCU 操作指令携带) + +| 偏移(字节) | 字段 | 类型 | 说明 | +|------------|------|------|------| +| 0 | year | u16 | 年 | +| 2 | month | u8 | 月 | +| 3 | day | u8 | 日 | +| 4 | hour | u8 | 时 | +| 5 | minute | u8 | 分 | +| 6 | second | u8 | 秒 | +| 7 | milliseconds | u8 | 毫秒(每 10ms 一档) | + +#### 3.2.3 校验字段宽度 + +| 报文类别 | 校验字段类型 | 宽度 | +|----------|--------------|------| +| CCU 报文 | `Checksum`(unsigned int) | 4 字节 | +| 配电报文 | `cChecksum`(unsigned char) | 1 字节 | + +#### 3.2.4 校验算法 + +``` +校验和 = 从 start1 起至校验字段之前的所有字节累加求和(不含校验字段本身) +``` + +- CCU 报文:校验字段 4 字节,实际发送 / 比较取累加和**低 8 位**(`cc & 0xFF`)。 +- 配电报文:校验字段 1 字节,`sum = 累加和 & 0xFF`。 +- 接收端校验不符则丢弃该帧并记录 `Check error`。 + +```c +Checksum calculateChecksum(const unsigned char* data, int size) { + Checksum checksum = 0; + int size_data = size - sizeof(Checksum); // 去掉末尾校验字段 + for (int i = 0; i < size_data; i++) checksum += data[i]; + return checksum; +} +``` + +### 3.3 消息 ID 汇总 + +| 分类 | ID | 方向 | 报文结构体 | 说明 | +|------|-----|------|------------|------| +| CCU | `0x0040` | 发送 | `msg_CcuColCmdMsg` | 复合管控器操作指令 | +| CCU | `0x0041` | 发送 | `msg_CcuSetParmMsg` | 复合管控器参数设定指令 | +| CCU | `0x0051` | 接收 | `msg_CcuStateFbMsg` | 复合管控器状态反馈 | +| CCU | `0x0040` | 接收 | `msg_CcuSetParmFbMsg` | 复合管控器参数设定反馈(与操作指令 ID 复用) | +| 配电 | `0x0001` | 发送 | `msg_disHVBCmd` | 高压母线配电指令 | +| 配电 | `0x0002` | 发送 | `msg_disHVBACmd` | 高压汇流排A配电指令 | +| 配电 | `0x0003` | 发送 | `msg_disHVBBCmd` | 仪表母线配电指令 | +| 配电 | `0x0004` | 发送 | `msg_disLVBCmd` | 仪表汇流排配电指令 | +| 配电 | `0x0005` | 接收 | `msg_disHighVolBusFbMsg` | 高压母线配电反馈 | +| 配电 | `0x0006` | 接收 | `msg_disHighAVolBusFbMsg` | 高压汇流排A配电反馈 | +| 配电 | `0x0007` | 接收 | `msg_disLowMainBusFbMsg` | 仪表母线配电反馈 | +| 配电 | `0x0008` | 接收 | `msg_disLowBusFbMsg` | 仪表汇流排配电反馈 | + +> 说明:`CCU_SET_PARM_FB_ID` 与 `CCU_CMD_ID` 同为 `0x0040`。接收端以起始符 `0x20 0x20` 判定为 CCU 报文后,将 `0x0040` 一律按“参数设定反馈”处理(操作指令只发送不接收,实际不冲突)。 + +### 3.4 复合管控器(CCU)报文 + +#### 3.4.1 操作指令 `msg_CcuColCmdMsg`(0x0040,发送) + +总长度 36 字节。 + +| 偏移(字节) | 字段 | 类型 | 说明 | +|------------|------|------|------| +| 0 | start1 | u8 | 起始符 0x20 | +| 1 | start2 | u8 | 起始符 0x20 | +| 2~3 | id | u16 | 消息标识 0x0040 | +| 4~5 | length | u16 | 数据区长度(=18) | +| 6~7 | year | u16 | 年 | +| 8 | month | u8 | 月 | +| 9 | day | u8 | 日 | +| 10 | hour | u8 | 时 | +| 11 | minute | u8 | 分 | +| 12 | second | u8 | 秒 | +| 13 | milliseconds | u8 | 毫秒(每 10ms 一档) | +| 14 | fcmode | u8 | 燃料电池运行模式 | +| 15 | fcuCmd | u8 | 燃料电池控制指令(`FcuCommand`) | +| 16 | fcuPowerEfficiency | u8 | 燃料电池输出功率(默认 8kW) | +| 17 | insChargeEnable | u8 | 仪表电池充电使能(0x30=不允许充电) | +| 18 | insBatCmd | u8 | 仪表电池指令(`BatteryCommand`) | +| 19 | powerBatCmd | u8 | 动力电池指令 | +| 20~21 | powerBatEfficiency | u16 | 动力电池效率(0=最大) | +| 22 | heartbeat | u8 | 心跳计数(周期自增) | +| 23 | masterState | u8 | 主站状态(0xAA=运行中) | +| 24~27 | paceholder1 | u32 | 预留 | +| 28~31 | paceholder2 | u32 | 预留 | +| 32~35 | checkCode | u32 | 校验和(累加和低 8 位) | + +#### 3.4.2 参数设定指令 `msg_CcuSetParmMsg`(0x0041,发送) + +总长度 20 字节。 + +| 偏移(字节) | 字段 | 类型 | 说明 | +|------------|------|------|------| +| 0 | start1 | u8 | 起始符 0x20 | +| 1 | start2 | u8 | 起始符 0x20 | +| 2~3 | id | u16 | 消息标识 0x0041 | +| 4~5 | length | u16 | 数据区长度(=10) | +| 6 | insSocHold1 | u8 | 仪表 SOC 保持门限 1 | +| 7 | insSocHold2 | u8 | 仪表 SOC 保持门限 2 | +| 8 | insSocHold3 | u8 | 仪表 SOC 保持门限 3 | +| 9 | fcuToInsLimit1 | u8 | FCU→仪表限功率 1 | +| 10 | fcuToinsLimit2 | u8 | FCU→仪表限功率 2 | +| 11 | powerSocHold1 | u8 | 动力 SOC 保持门限 1 | +| 12 | powerSocHold2 | u8 | 动力 SOC 保持门限 2 | +| 13 | powerSocHold3 | u8 | 动力 SOC 保持门限 3 | +| 14 | fcuToPowerLimit1 | u8 | FCU→动力限功率 1 | +| 15 | fcuToPowerLimit2 | u8 | FCU→动力限功率 2 | +| 16~19 | checkCode | u32 | 校验和(累加和低 8 位) | + +#### 3.4.3 状态反馈 `msg_CcuStateFbMsg`(0x0051,接收) + +总长度 182 字节。 + +| 偏移(字节) | 字段 | 类型 | 说明 | +|------------|------|------|------| +| 0 | start1 | u8 | 起始符 0x20 | +| 1 | start2 | u8 | 起始符 0x20 | +| 2~3 | id | u16 | 消息标识 0x0051 | +| 4~5 | length | u16 | 数据区长度 | +| 6 | fc_mode | u8 | 燃料电池运行模式(00=无效,01=调试,02=自动,03=补给) | +| 7 | fc_status | u8 | 燃料电池状态(`FcuState`) | +| 8 | fc_fault_level | u8 | 故障等级(00=无,10=一级,20=二级,30=三级,40=四级) | +| 9~10 | output_power_limit | u16 | 输出功率限制 [W],0~30000 | +| 11~12 | total_generation_time | u16 | 累计发电时间 [0.1h],最大 6553.5h | +| 13~14 | total_generation_power | u16 | 累计发电总功率 [W] | +| 15~16 | fault_level_1 | u16 | 一级故障位 | +| 17~18 | fault_level_2 | u16 | 二级故障位 | +| 19~20 | fault_level_3 | u16 | 三级故障位 | +| 21~22 | fault_level_4 | u16 | 四级故障位 | +| 23 | hydrogen_capacity | u8 | 储氢罐剩余容量 [%] | +| 24 | liquid_oxygen_capacity | u8 | 液氧罐剩余容量 [%] | +| 25~26 | palladium_temp | u16 | 钯膜最高温度 [℃] | +| 27~28 | main_pipe_pressure | u16 | 主水路压力 [0.01kPa] | +| 29~30 | aux_pipe_pressure | u16 | 辅水路压力 [0.01kPa] | +| 31~32 | cabin_pressure1 | u16 | 舱室1压力 [0.01kPa] | +| 33~34 | cabin_pressure2 | u16 | 舱室2压力 [0.01kPa] | +| 35~36 | cabin_temp1 | u16 | 舱室1温度 [0.01℃] | +| 37~38 | cabin_temp2 | u16 | 舱室2温度 [0.01℃] | +| 39~40 | cabin_humidity1 | u16 | 舱室1湿度 [0.01%RH] | +| 41~42 | cabin_humidity2 | u16 | 舱室2湿度 [0.01%RH] | +| 43 | flame_detector1 | u8 | 火焰探测器1(00=无效,01=报警,02=故障) | +| 44 | flame_detector2 | u8 | 火焰探测器2 | +| 45~46 | h2_concentration1 | u16 | 舱室H2浓度1 [0.01% LEL] | +| 47~48 | h2_concentration2 | u16 | 舱室H2浓度2 [0.01% LEL] | +| 49~50 | h2_concentration3 | u16 | 舱室H2浓度3 [0.01% LEL] | +| 51~52 | o2_concentration1 | u16 | 舱室O2浓度1 [0.01% LEL] | +| 53~54 | o2_concentration2 | u16 | 舱室O2浓度2 [0.01% LEL] | +| 55~56 | ch3oh_concentration1 | u16 | 舱室甲醇浓度1 [0.01% LEL] | +| 57~58 | ch3oh_concentration2 | u16 | 舱室甲醇浓度2 [0.01% LEL] | +| 59~62 | reserved1[2] | u16×2 | 保留 | +| 63~64 | emergency_battery1_voltage | u16 | 应急电池1总电压 [V] | +| 65~66 | emergency_battery1_current | u16 | 应急电池1总电流 [A] | +| 67~68 | emergency_battery1_max_temp | u16 | 应急电池1最高温度 [℃] | +| 69~70 | emergency_battery1_fault_word | u16 | 应急电池1故障字 | +| 71~72 | emergency_battery2_voltage | u16 | 应急电池2总电压 [V] | +| 73~74 | emergency_battery2_current | u16 | 应急电池2总电流 [A] | +| 75~76 | emergency_battery2_max_temp | u16 | 应急电池2最高温度 [℃] | +| 77~78 | emergency_battery2_fault_word | u16 | 应急电池2故障字 | +| 79~80 | cabin_ox_concentration | u16 | 仪表舱氧气浓度 [%] | +| 81~82 | cabin_temperature | u16 | 仪表舱温度 [℃] | +| 83~84 | cabin_humidity | u16 | 仪表舱湿度 [%RH] | +| 85~86 | cabin_pressure | u16 | 仪表舱大气压 [kPa] | +| 87~88 | power_cabin_ox_concentration | u16 | 动力舱氧气浓度 [%] | +| 89~90 | power_cabin_temperature | u16 | 动力舱温度 [℃] | +| 91~92 | power_cabin_humidity | u16 | 动力舱湿度 [%RH] | +| 93~94 | power_cabin_pressure | u16 | 动力舱大气压 [kPa] | +| 95 | reserved2[1] | u8 | 保留 | +| 96~101 | dyn_alarm_flag[6] | u8×6 | 动力锂电池报警标志 | +| 102~107 | ins_alarm_flag[6] | u8×6 | 仪表锂电池报警标志 | +| 108 | ins_relay_status1 | u8 | 仪表电池正极(高4)/充电(低4)继电器 | +| 109 | ins_relay_status2 | u8 | 仪表电池预充/负极继电器 | +| 110 | dyn_relay_status1 | u8 | 动力电池正极/充电继电器 | +| 111 | dyn_relay_status2 | u8 | 动力电池预充/负极继电器 | +| 112~113 | ins_max_discharge_power | u16 | 仪表电池最大放电功率 [kW, 0.05] | +| 114~115 | dyn_max_discharge_power | u16 | 动力电池最大放电功率 [kW, 0.05] | +| 116 | ins_soc | u8 | 仪表电池 SOC [%] | +| 117 | dyn_soc | u8 | 动力电池 SOC [%] | +| 118~119 | ins_total_energy | u16 | 仪表电池总能量 [kWh] | +| 120~121 | dyn_total_energy | u16 | 动力电池总能量 [kWh] | +| 122~123 | ins_power_input | u16 | 仪表电池输入功率 [kW] | +| 124~125 | dyn_power_input | u16 | 动力电池输入功率 [kW] | +| 126 | ins_charge_status | u8 | 仪表电池充放电(00=无效,10=充电,20=放电) | +| 127 | dyn_charge_status | u8 | 动力电池充放电状态 | +| 128~129 | ins_voltage_link | u16 | 仪表电池 LINK 电压 [0.01V] | +| 130~131 | ins_voltage_pack | u16 | 仪表电池 PACK 电压 [0.01V] | +| 132~133 | ins_current | u16 | 仪表电池电流 [0.01A],正值放电 | +| 134~135 | ins_resistance_pos | u16 | 仪表电池正极绝缘电阻 [kΩ] | +| 136~137 | ins_resistance_neg | u16 | 仪表电池负极绝缘电阻 [kΩ] | +| 138~139 | dyn_voltage_link | u16 | 动力电池 LINK 电压 [0.01V] | +| 140~141 | dyn_voltage_pack | u16 | 动力电池 PACK 电压 [0.01V] | +| 142~143 | dyn_current | u16 | 动力电池电流 [0.01A],正值放电 | +| 144~145 | dyn_resistance_pos | u16 | 动力电池正极绝缘电阻 [kΩ] | +| 146~147 | dyn_resistance_neg | u16 | 动力电池负极绝缘电阻 [kΩ] | +| 148 | ins_emergency_status | u8 | 仪表电池紧急状态(0x00=无,0x3A=4级…0x3D=1级) | +| 149 | dyn_emergency_status | u8 | 动力电池紧急状态 | +| 150~151 | reserved3[2] | u8×2 | 保留 | +| 152 | ins_soc_threshold1 | u8 | 仪表电池1 SOC 门限 | +| 153 | ins_soc_threshold2 | u8 | 仪表电池2 SOC 门限 | +| 154 | ins_soc_threshold3 | u8 | 仪表电池3 SOC 门限 | +| 155 | dyn_soc_threshold1 | u8 | 动力电池1 SOC 门限 | +| 156 | dyn_soc_threshold2 | u8 | 动力电池2 SOC 门限 | +| 157 | dyn_soc_threshold3 | u8 | 动力电池3 SOC 门限 | +| 158 | ins_power_limit1 | u8 | 仪表电池1功率限制 [%] | +| 159 | ins_power_limit2 | u8 | 仪表电池2功率限制 [%] | +| 160 | dyn_power_limit1 | u8 | 动力电池1功率限制 [%] | +| 161 | dyn_power_limit2 | u8 | 动力电池2功率限制 [%] | +| 162~165 | device_online_flag1 | u32 | 设备在线标志1(byte0=低压配电板,byte1=CCU主机,byte2=CCU备机) | +| 166~169 | device_online_flag2 | u32 | 设备在线标志2(byte0=仪表锂电,byte1=动力锂电,byte2=燃电锂电,byte3=高压配电板) | +| 170 | dyn_charge_level | u8 | 动力电池充电(01=1级,02=2级限功率,03=3级关闭) | +| 171 | dyn_water_leak_status | u8 | 动力漏水(0X=正常,1X=异常) | +| 172 | ins_water_leak_dcdc_status | u8 | 仪表漏水(低4)/DCDC(高4)状态 | +| 173 | reserved4 | u8 | 保留 | +| 174~177 | heartbeat | u32 | 主机心跳 | +| 178~181 | checkCode | u32 | 校验和 | + +#### 3.4.4 参数设定反馈 `msg_CcuSetParmFbMsg`(0x0040,接收) + +总长度 12 字节。 + +| 偏移(字节) | 字段 | 类型 | 说明 | +|------------|------|------|------| +| 0 | start1 | u8 | 起始符 0x20 | +| 1 | start2 | u8 | 起始符 0x20 | +| 2~3 | id | u16 | 消息标识 0x0040 | +| 4~5 | length | u16 | 数据区长度 | +| 6 | flag | u8 | 应答标志 | +| 7 | failureCode | u8 | 失败码 | +| 8~11 | checkCode | u32 | 校验和 | + +### 3.5 配电系统报文 + +断路器字段取值: + +| 值 | 含义 | +|----|------| +| `0x55` | 合闸(ON) | +| `0xAA` | 分闸(OFF) | +| `0x00` | 无操作 / 保持 | +| `0x5A` | 故障脱扣(仅反馈) | + +#### 3.5.1 高压母线(BUS1) + +**指令 `msg_disHVBCmd`(0x0001,发送)** + +总长度 21 字节。 + +| 偏移(字节) | 字段 | 类型 | 说明 | +|------------|------|------|------| +| 0 | start1 | u8 | 起始符 0x40 | +| 1 | start2 | u8 | 起始符 0x40 | +| 2~3 | id | u16 | 消息标识 0x0001 | +| 4~5 | length | u16 | 数据区长度(固定 18) | +| 6 | fuelCellCircuitBreaker | u8 | 燃料电池断路器 | +| 7 | powerLithiumBatteryCircuitBreaker | u8 | 动力锂电池断路器 | +| 8 | propulsionMotorCircuitBreaker | u8 | 推进电机断路器 | +| 9 | lithiumBatteryGroupInstrumentCircuitBreaker | u8 | 锂电池组仪表断路器 | +| 10 | dcDc5ModuleCircuitBreaker | u8 | DC/DC5模块断路器 | +| 11 | bowHighVoltageDistributionBoxCircuitBreaker | u8 | 艏部高压配电箱断路器 | +| 12 | sternFTDevice45CircuitBreaker | u8 | 艉部FT装置4/5断路器 | +| 13 | fbReservedCircuitBreaker | u8 | FB预留断路器 | +| 14 | sternRudderSwitch1CircuitBreaker | u8 | 艉舵开关1断路器 | +| 15 | sternRudderSwitch2CircuitBreaker | u8 | 艉舵开关2断路器 | +| 16 | tyzReservedCircuitBreaker | u8 | TYZ预留断路器 | +| 17 | reservedCircuitBreaker | u8 | 预留断路器 | +| 18 | dcdc5Module | u8 | DC/DC5模块启动 | +| 19 | coolingSystem | u8 | 冷却系统启动 | +| 20 | checkCode | u8 | 校验和(累加和低 8 位) | + +**反馈 `msg_disHighVolBusFbMsg`(0x0005,接收)** + +总长度 60 字节。 + +| 偏移(字节) | 字段 | 类型 | 说明 | +|------------|------|------|------| +| 0 | start1 | u8 | 起始符 0x40 | +| 1 | start2 | u8 | 起始符 0x40 | +| 2~3 | id | u16 | 消息标识 0x0005 | +| 4~5 | length | u16 | 数据区长度 | +| 6 | fuelCellCircuitBreaker | u8 | 燃料电池断路器状态 | +| 7 | powerLithiumBatteryCircuitBreaker | u8 | 动力锂电池断路器状态 | +| 8 | propulsionMotorCircuitBreaker | u8 | 推进电机断路器状态 | +| 9 | lithiumBatteryGroupInstrumentCircuitBreaker | u8 | 锂电池组仪表断路器状态 | +| 10 | dcDc5ModuleCircuitBreaker | u8 | DC/DC5模块断路器状态 | +| 11 | bowHighVoltageDistributionBoxCircuitBreaker | u8 | 艏部高压配电箱断路器状态 | +| 12 | sternFTDevice45CircuitBreaker | u8 | 艉部FT装置4/5断路器状态 | +| 13 | fbReservedCircuitBreaker | u8 | FB预留断路器状态 | +| 14 | sternRudderSwitch1CircuitBreaker | u8 | 艉舵开关1断路器状态 | +| 15 | sternRudderSwitch2CircuitBreaker | u8 | 艉舵开关2断路器状态 | +| 16 | tyzReservedCircuitBreaker | u8 | TYZ预留断路器状态 | +| 17 | reservedCircuitBreaker | u8 | 预留断路器状态 | +| 18 | dcDcFaultWord1 | u8 | DC/DC5故障字低(Bit0过温关机…Bit7内部故障) | +| 19 | dcDcFaultWord2 | u8 | DC/DC5故障字高(Bit0通讯故障,Bit1工作状态,Bit2/3冷却泵1/2故障,Bit5/6冷却泵1/2运行) | +| 20 | powerBusInsulationStatus | u8 | 动力母排绝缘状态(0x55正常,0xAA绝缘低) | +| 21 | aBusInsulationStatus | u8 | A汇流排绝缘状态(0x55正常,0xAA绝缘低) | +| 22 | meterPowerLossSignal | u8 | 仪表电源状态(0x55正常,0xAA故障) | +| 23 | emergencyPowerLossSignal | u8 | 应急电源状态(0x55正常,0xAA故障) | +| 24 | dcDcTemperature | u8 | DC/DC温度 | +| 25~26 | powerBusVoltage | u16 | 动力汇流排电压 | +| 27~28 | dcDc5ModuleCurrent | u16 | DC/DC5模块电流 | +| 29~30 | powerBusCurrent | u16 | 动力汇流排电流 | +| 31~32 | busbarAVoltage | u16 | A汇流排电压 | +| 33~34 | propulsionMotorControlBoxCurrent | u16 | 推进电机控制箱电流 | +| 35~36 | busbarACurrent | u16 | A汇流排电流 | +| 37~38 | lithiumBatteryGroupMeterCurrent | u16 | 锂电池组(仪表)电流 | +| 39~40 | bowHighVoltageDistributionBoxCurrent | u16 | 艏部高压配电箱电流 | +| 41~42 | sternFTDevice45Current | u16 | 艉部FT装置4/5电流 | +| 43~44 | tyzReservedSwitchCurrent | u16 | TYZ预留开关电流 | +| 45~46 | sternRudderSwitch1Current | u16 | 艉舵开关1电流 | +| 47~48 | reservedCurrent1 | u16 | 预留电流1 | +| 49~50 | sternRudderSwitch2Current | u16 | 艉舵开关2电流 | +| 51~52 | reservedCurrent2 | u16 | 预留电流2 | +| 53~54 | fbReservedSwitchCurrent | u16 | FB预留电流 | +| 55~56 | reservedCurrent3 | u16 | 预留电流3 | +| 57~58 | coolWaterPressure | u16 | 冷却水压力 | +| 59 | checkCode | u8 | 校验和(累加和低 8 位) | + +#### 3.5.2 高压汇流排 A(BUS2) + +**指令 `msg_disHVBACmd`(0x0002,发送)** + +总长度 13 字节。 + +| 偏移(字节) | 字段 | 类型 | 说明 | +|------------|------|------|------| +| 0 | start1 | u8 | 起始符 0x40 | +| 1 | start2 | u8 | 起始符 0x40 | +| 2~3 | id | u16 | 消息标识 0x0002 | +| 4~5 | length | u16 | 数据区长度(固定 6) | +| 6 | bowFTDevice123CircuitBreaker | u8 | 艏部FT装置1/2/3断路器 | +| 7 | actuatorCircuitBreaker | u8 | 启闭机构断路器 | +| 8 | mastSteeringGearControlBoxCircuitBreaker | u8 | 桅杆舵机控制箱断路器 | +| 9 | xczCircuitBreaker | u8 | XCZ断路器 | +| 10 | bowRudderControlBoxCircuitBreaker | u8 | 艏舵控制箱断路器 | +| 11 | openWaterCoverStartCylinderCircuitBreaker | u8 | 敞水盖启动电缸断路器 | +| 12 | checkCode | u8 | 校验和(累加和低 8 位) | + +**反馈 `msg_disHighAVolBusFbMsg`(0x0006,接收)** + +总长度 32 字节。 + +| 偏移(字节) | 字段 | 类型 | 说明 | +|------------|------|------|------| +| 0 | start1 | u8 | 起始符 0x40 | +| 1 | start2 | u8 | 起始符 0x40 | +| 2~3 | id | u16 | 消息标识 0x0006 | +| 4~5 | length | u16 | 数据区长度 | +| 6 | bowFTDevice123CircuitBreaker | u8 | 艏部FT装置1/2/3断路器状态 | +| 7 | actuatorCircuitBreaker | u8 | 启闭机构断路器状态 | +| 8 | mastSteeringGearControlBoxCircuitBreaker | u8 | 桅杆舵机控制箱断路器状态 | +| 9 | xczCircuitBreaker | u8 | XCZ断路器状态 | +| 10 | bowRudderControlBoxCircuitBreaker | u8 | 艏舵控制箱断路器状态 | +| 11 | openWaterCoverStartCylinderCircuitBreaker | u8 | 敞水盖启动电缸断路器状态 | +| 12 | instrumentPowerFailureSignal | u8 | 仪表电源失电信号(0x55正常,0xAA故障) | +| 13 | emergencyPowerFailureSignal | u8 | 应急电源失电信号(0x55正常,0xAA故障) | +| 14 | waterIngressionAlarm | u8 | 浸水报警 | +| 15~16 | busbarBVoltage | u16 | 汇流排B电压 | +| 17~18 | busbarBCurrent | u16 | 汇流排B电流 | +| 19~20 | bowFTDevice123Current | u16 | 艏部FT装置1/2/3电流 | +| 21~22 | actuatorCurrent | u16 | 启闭机构电流 | +| 23~24 | mastSteeringGearControlBoxCurrent | u16 | 桅杆舵机控制箱电流 | +| 25~26 | xczCurrent | u16 | XCZ电流 | +| 27~28 | bowRudderControlBoxCurrent | u16 | 艏舵控制箱电流 | +| 29~30 | openWaterCoverStartCylinderCurrent | u16 | 敞水盖启动电缸电流 | +| 31 | checkCode | u8 | 校验和(累加和低 8 位) | + +#### 3.5.3 仪表母线(BUS3,低压主母线) + +**指令 `msg_disHVBBCmd`(0x0003,发送)** + +总长度 14 字节。 + +| 偏移(字节) | 字段 | 类型 | 说明 | +|------------|------|------|------| +| 0 | start1 | u8 | 起始符 0x40 | +| 1 | start2 | u8 | 起始符 0x40 | +| 2~3 | id | u16 | 消息标识 0x0003 | +| 4~5 | length | u16 | 数据区长度(固定 8) | +| 6 | lithiumBatteryGroupInstrumentCircuitBreaker | u8 | 锂电池组(仪表)断路器 | +| 7 | bowLowVoltageDistributionBoxCircuitBreaker | u8 | 艏部低压配电箱断路器 | +| 8 | unit4InstrumentDC48VCircuitBreaker | u8 | UNIT4仪表DC48V断路器 | +| 9 | dcC1DCDistributionPanelCircuitBreaker | u8 | DC-C1直流配电板断路器 | +| 10 | reservedCircuitBreaker1 | u8 | 预留断路器1 | +| 11 | reservedCircuitBreaker2 | u8 | 预留断路器2 | +| 12 | emergencyLithiumBatteryGroup2CircuitBreaker | u8 | 应急锂电池组2断路器 | +| 13 | checkCode | u8 | 校验和(累加和低 8 位) | + +**反馈 `msg_disLowMainBusFbMsg`(0x0007,接收)** + +总长度 41 字节。 + +| 偏移(字节) | 字段 | 类型 | 说明 | +|------------|------|------|------| +| 0 | start1 | u8 | 起始符 0x40 | +| 1 | start2 | u8 | 起始符 0x40 | +| 2~3 | id | u16 | 消息标识 0x0007 | +| 4~5 | length | u16 | 数据区长度 | +| 6 | lithiumBatteryGroupInstrumentCircuitBreaker | u8 | 锂电池组(仪表)断路器状态 | +| 7 | bowLowVoltageDistributionBoxCircuitBreaker | u8 | 艏部低压配电箱断路器状态 | +| 8 | unit4InstrumentDC48VCircuitBreaker | u8 | UNIT4仪表DC48V断路器状态 | +| 9 | dcC1DCDistributionPanelCircuitBreaker | u8 | DC-C1直流配电板断路器状态 | +| 10 | reservedCircuitBreaker1 | u8 | 预留断路器1状态 | +| 11 | reservedCircuitBreaker2 | u8 | 预留断路器2状态 | +| 12 | emergencyLithiumBatteryGroup2CircuitBreaker | u8 | 应急锂电池组2断路器状态 | +| 13 | instrumentPowerFailureSignal | u8 | 仪表电源失电信号(0x55正常,0xAA故障) | +| 14 | emergencyPowerFailureSignal | u8 | 应急电源失电信号(0x55正常,0xAA故障) | +| 15 | instrumentBusbarInsulationLow | u8 | 仪表汇流排绝缘低(0x55正常,0x55绝缘低) | +| 16~17 | instrumentBusbarVoltage | u16 | 仪表母排电压 | +| 18~19 | bowLowVoltageDistributionBoxCurrent | u16 | 艏部低压配电箱电流 | +| 20~21 | dcC1InstrumentDC48VCurrent | u16 | DC-C1仪表DC48V电流 | +| 22~23 | reservedCurrent1 | u16 | 预留电流1 | +| 24~25 | emergencyLithiumBatteryGroup2Current | u16 | 应急锂电池组2电流 | +| 26~27 | lithiumBatteryGroupInstrumentCurrent | u16 | 锂电池组(仪表)电流 | +| 28~29 | unit4InstrumentDC48VCurrent | u16 | UNIT4仪表DC48V电流 | +| 30~31 | reservedCurrent2 | u16 | 预留电流2 | +| 32~33 | emergency2BusbarVoltage | u16 | 应急2汇流排电压 | +| 34~35 | compositeEnergyManagementSystemEmergencyDC48VCurrent | u16 | 复合能源管控系统应急DC48V电流 | +| 36~37 | fuelCellSecuritySystemEmergencyDC48VCurrent | u16 | 燃料电池安全系统应急DC48V电流 | +| 38~39 | plcControlPowerCurrent | u16 | PLC控制电源电流 | +| 40 | checkCode | u8 | 校验和(累加和低 8 位) | + +#### 3.5.4 仪表汇流排(BUS4) + +**指令 `msg_disLVBCmd`(0x0004,发送)** + +总长度 15 字节。 + +| 偏移(字节) | 字段 | 类型 | 说明 | +|------------|------|------|------| +| 0 | start1 | u8 | 起始符 0x40 | +| 1 | start2 | u8 | 起始符 0x40 | +| 2~3 | id | u16 | 消息标识 0x0004 | +| 4~5 | length | u16 | 数据区长度(固定 8) | +| 6 | unit1CircuitBreaker | u8 | UNIT1断路器 | +| 7 | unit2CircuitBreaker | u8 | UNIT2断路器 | +| 8 | unit3CircuitBreaker | u8 | UNIT3断路器 | +| 9 | unit5CircuitBreaker | u8 | UNIT5断路器 | +| 10 | bowPZDeviceCircuitBreaker | u8 | 艏部PZ装置断路器 | +| 11 | reservedCircuitBreaker1 | u8 | 预留断路器1 | +| 12 | reservedCircuitBreaker2 | u8 | 预留断路器2 | +| 13 | emergencyLithiumBatteryGroup1CircuitBreaker | u8 | 应急锂电池组1断路器 | +| 14 | checkCode | u8 | 校验和(累加和低 8 位) | + +**反馈 `msg_disLowBusFbMsg`(0x0008,接收)** + +总长度 36 字节。 + +| 偏移(字节) | 字段 | 类型 | 说明 | +|------------|------|------|------| +| 0 | start1 | u8 | 起始符 0x40 | +| 1 | start2 | u8 | 起始符 0x40 | +| 2~3 | id | u16 | 消息标识 0x0008 | +| 4~5 | length | u16 | 数据区长度 | +| 6 | unit1CircuitBreaker | u8 | UNIT1断路器状态 | +| 7 | unit2CircuitBreaker | u8 | UNIT2断路器状态 | +| 8 | unit3CircuitBreaker | u8 | UNIT3断路器状态 | +| 9 | unit5CircuitBreaker | u8 | UNIT5断路器状态 | +| 10 | bowPZDeviceCircuitBreaker | u8 | 艏部PZ装置断路器状态 | +| 11 | reservedCircuitBreaker1 | u8 | 预留断路器1状态 | +| 12 | reservedCircuitBreaker2 | u8 | 预留断路器2状态 | +| 13 | emergencyLithiumBatteryGroup1CircuitBreaker | u8 | 应急锂电池组1断路器状态 | +| 14 | powerFailureSignal | u8 | 仪表电源失电信号(0x55正常,0xAA故障) | +| 15 | emergencyPowerFailureSignal | u8 | 应急电源失电信号(0x55正常,0xAA故障) | +| 16 | waterIngressionAlarm | u8 | 浸水报警(0x55正常,0xAA故障) | +| 17~18 | instrumentBusbarVoltage | u16 | 仪表母排电压 | +| 19~20 | instrumentBusbarCurrent | u16 | 仪表母排电流 | +| 21~22 | unit1Current | u16 | UNIT1电流 | +| 23~24 | unit2Current | u16 | UNIT2电流 | +| 25~26 | unit3Current | u16 | UNIT3电流 | +| 27~28 | unit5Current | u16 | UNIT5电流 | +| 29~30 | bowPZDeviceCurrent | u16 | 艏部PZ装置电流 | +| 31~32 | emergencyLithiumBatteryGroup1Current | u16 | 应急锂电池组1电流 | +| 33~34 | emergency1BusbarVoltage | u16 | 应急1汇流排电压 | +| 35 | checkCode | u8 | 校验和(累加和低 8 位) | + +--- + +## 4. 附录:常量与枚举 + +### 4.1 断路器 / 信号常量 + +```c +#define BREAK_OFF 0xAA // 分闸 +#define BREAK_ON 0x55 // 合闸 +#define BREAK_FALSE 0x5A // 故障脱扣(仅反馈) +``` + +### 4.2 燃料电池控制指令 `FcuCommand` + +| 值 | 含义 | +|----|------| +| 0x01 | 自检 SelfCheck | +| 0x02 | 启动 Start | +| 0x03 | 停机 Stop | +| 0x04 | 复位 Reset | +| 0x05 | 急停 EmergencyStop | +| 0x06 | 补给 Supply | +| 0x07 | 预热 WarmUp | +| 0x08 | 维护 Maintenance | + +### 4.3 燃料电池状态 `FcuState` + +| 值 | 含义 | 值 | 含义 | +|----|------|----|------| +| 0x01 | 初始化 Init | 0x08 | 故障 Fault | +| 0x02 | 待机 Standby | 0x09 | 补给 Supply | +| 0x03 | 自检异常 SelfCheckError | 0x0A | 预热 WarmUp | +| 0x04 | 就绪 Ready | 0x0B | 预热完成 WarmUpComplete | +| 0x05 | 启动 Start | 0x0C | 维护 Maintenance | +| 0x06 | 运行 Running | 0x0D | 维护完成 MaintenanceComplete | +| 0x07 | 停机 Stop | — | — | + +### 4.4 电池指令 `BatteryCommand` + +| 值 | 含义 | +|----|------| +| 0x00 | 保持 Hold | +| 0x10 | 启动 Start | +| 0x20 | 停机 Stop | + +### 4.5 设备控制 `EquipmentCommand` + +| 值 | 含义 | +|----|------| +| 0 | 断电 OFF | +| 1 | 上电 ON | +| 2 | 仪表电上电 METER_ON | +| 3 | 动力电上电 POWER_ON | +| 4 | 仪表电断电 METER_OFF | +| 5 | 动力电断电 POWER_OFF | + +### 4.6 任务类型 `TaskType` + +| 值 | 含义 | 字符串 | +|----|------|--------| +| 1 | 抛载 | throwLoad | +| 2 | 运动上浮 | floatUp | +| 3 | 回收 | recycle | +| 4 | 悬停 | hover | +| 5 | 上浮通信 | satComm | +| 6 | 上浮校准 | satCalibrate | +| 7 | 游曳 | tour | +| 8 | 航行 | sail | +| 9 | 紧急上浮通信 | emerSatComm | +| 10 | 紧急航行 | emerSail | + +### 4.7 工况 `WorkCondition` + +| 值 | 含义 | 值 | 含义 | +|----|------|----|------| +| 0 | 工况切换中 | 7 | 上浮下潜 | +| 1 | 待机 | 8 | 浮调模式 | +| 2 | 岸基备航 | 9 | 水下侦查 | +| 3 | 水中备航 | 10 | 水面侦查 | +| 4 | 遥控工况 | 11 | DJ模式 | +| 5 | 巡航模式 | 12 | 调试模式 | +| 6 | 高速模式 | — | — | + +### 4.8 运行模式 `RunMode` + +| 值 | 含义 | +|----|------| +| 0 | 正常模式 Normal | +| 1 | 测试模式 Test | +| 2 | 调试模式 Debug | + +### 4.9 故障码格式 + +- 系统故障码:`faultCode` 中每个值为 `0xabcd`,`b` 位(右移 8 位取低 4 位)表示故障等级(`PowerManger::getFaultLevel()`)。 +- 锂电池故障码映射表:`src/pPowerManger/faultCode.h` 中 `batfaultMap`(1~4 级,0x01~0xC9)。 +- 配电故障码映射表:`src/pPowerManger/faultCode.h` 中 `disfaultMap`(1~45 项断路器脱扣/绝缘/失电/浸水故障)。 diff --git a/scripts/run_host_sim.sh b/scripts/run_host_sim.sh new file mode 100755 index 0000000..0b4a815 --- /dev/null +++ b/scripts/run_host_sim.sh @@ -0,0 +1,306 @@ +#!/bin/bash +#======================================================================= +# FILE: scripts/run_host_sim.sh +# DESC: 运行与测试 pPowerMangerHost(模拟 pPowerManger 上位机的网页程序) +# +# 用法: +# ./scripts/run_host_sim.sh run 启动 MOOSDB + pPowerManger +# + pPowerMangerHost(前台运行, +# Ctrl-C 退出并清理) +# ./scripts/run_host_sim.sh test 自动化测试 pPowerMangerHost: +# 网页 HTTP / WebSocket 反馈 / +# 指令下发到 MOOSDB +# ./scripts/run_host_sim.sh build 仅编译需要的目标 +# ./scripts/run_host_sim.sh stop 清理残留进程 +# ./scripts/run_host_sim.sh help 显示帮助 +# +# 环境变量(可覆盖): +# SERVER_HOST MOOSDB 地址(默认 localhost) +# SERVER_PORT MOOSDB 端口(默认 9000) +# WEB_PORT 网页监听端口(默认 18080) +# WITH_POWERMANGER run 模式是否同时启动 pPowerManger(默认 1) +#======================================================================= +set -uo pipefail + +ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" +BIN_DIR="${ROOT}/bin" +MOOS_TEMPLATE="${ROOT}/src/pPowerMangerHost/pPowerMangerHost.moos" + +SERVER_HOST="${SERVER_HOST:-localhost}" +SERVER_PORT="${SERVER_PORT:-9000}" +WEB_PORT="${WEB_PORT:-18080}" +WITH_POWERMANGER="${WITH_POWERMANGER:-1}" + +MOOSDB_BIN="${MOOSDB_BIN:-$(command -v MOOSDB || true)}" +POKE_BIN="$(command -v uPokeDB || true)" +PM_BIN="${BIN_DIR}/pPowerManger" +HOST_BIN="${BIN_DIR}/pPowerMangerHost" + +MOOSDB_PID="" +PM_PID="" +HOST_PID="" +WORKDIR="" +MISSION="" + +info() { printf '\033[1;36m[host-sim]\033[0m %s\n' "$*"; } +ok() { printf '\033[1;32m[host-sim]\033[0m %s\n' "$*"; } +warn() { printf '\033[1;33m[host-sim]\033[0m %s\n' "$*"; } +err() { printf '\033[1;31m[host-sim]\033[0m %s\n' "$*"; } + +usage() { + sed -n '2,23p' "${BASH_SOURCE[0]}" | sed 's/^# \{0,1\}//' + exit 0 +} + +# 生成临时 mission 文件(同时含 pPowerManger 与 pPowerMangerHost 两个配置块) +make_mission() { + WORKDIR="$(mktemp -d)" + MISSION="${WORKDIR}/host_sim.moos" + cat > "${MISSION}" </dev/null && wait "$1" 2>/dev/null +} + +cleanup() { + kill_proc "${HOST_PID}" + kill_proc "${PM_PID}" + kill_proc "${MOOSDB_PID}" + [ -n "${WORKDIR}" ] && rm -rf "${WORKDIR}" +} + +build_targets() { + info "编译 pPowerManger / pPowerMangerHost ..." + mkdir -p "${ROOT}/build" + cd "${ROOT}/build" + cmake -DCMAKE_BUILD_TYPE=Release "${ROOT}" >/dev/null 2>&1 || { err "cmake 失败"; return 1; } + make -j2 pPowerManger pPowerMangerHost >/dev/null 2>&1 || { err "make 失败"; return 1; } + cd "${ROOT}" + ok "编译完成" +} + +check_binaries() { + local missing=0 + [ -n "${MOOSDB_BIN}" ] || { err "未找到 MOOSDB(请加入 PATH)"; missing=1; } + [ -x "${HOST_BIN}" ] || { err "未找到 ${HOST_BIN}(请先运行: $0 build)"; missing=1; } + if [ "${WITH_POWERMANGER}" = "1" ]; then + [ -x "${PM_BIN}" ] || { err "未找到 ${PM_BIN}(请先运行: $0 build)"; missing=1; } + fi + return "${missing}" +} + +start_moosdb() { + make_mission + info "启动 MOOSDB (${SERVER_HOST}:${SERVER_PORT}) ..." + "${MOOSDB_BIN}" --moos_no_colour "${MISSION}" > "${WORKDIR}/moosdb.log" 2>&1 & + MOOSDB_PID=$! + sleep 1 + kill -0 "${MOOSDB_PID}" 2>/dev/null || { err "MOOSDB 未存活"; return 1; } +} + +start_pm() { + info "启动 pPowerManger ..." + ( cd "${WORKDIR}" && exec "${PM_BIN}" "${MISSION}" ) > "${WORKDIR}/pm.log" 2>&1 & + PM_PID=$! + sleep 1 + kill -0 "${PM_PID}" 2>/dev/null || warn "pPowerManger 未存活(无 CCU 硬件属正常)" +} + +start_host() { + info "启动 pPowerMangerHost (网页端口 ${WEB_PORT}) ..." + ( cd "${WORKDIR}" && exec "${HOST_BIN}" "${MISSION}" ) > "${WORKDIR}/host.log" 2>&1 & + HOST_PID=$! + sleep 2 + kill -0 "${HOST_PID}" 2>/dev/null || { err "pPowerMangerHost 未存活"; return 1; } +} + +#----------------------------------------------------------------------- +# 测试项 +#----------------------------------------------------------------------- +test_http() { + info "测试: 网页 HTTP (http://${SERVER_HOST}:${WEB_PORT}/) ..." + local code + code="$(curl -s -o /dev/null -w '%{http_code}' "http://${SERVER_HOST}:${WEB_PORT}/" 2>/dev/null || echo 000)" + if [ "${code}" = "200" ]; then + ok "网页 HTTP 200 通过" + return 0 + else + err "网页 HTTP 失败 (code=${code})" + return 1 + fi +} + +# 反馈链路:向 MOOSDB 注入一条假的反馈变量 → 宿主订阅后应经 WS 推给浏览器 +test_monitor_loop() { + info "测试: 反馈链路 (MOOSDB -> pPowerMangerHost -> WebSocket) ..." + if [ -z "${POKE_BIN}" ]; then + warn "未找到 uPokeDB,跳过反馈链路测试" + return 0 + fi + if ! python3 -c "import websockets" >/dev/null 2>&1; then + warn "未安装 python3 websockets,跳过反馈链路测试" + return 0 + fi + + local fb_key="uPower_pmState_fb" + local fb_val='{"workCondition_uint8":9,"currentMod_uint8":1,"powerState_uint8":1,"faultLevel_uint8":0,"soc_uint16":88,"sustainableTime_int64":3600,"leakage_uint8":0,"info_str":"host-sim-test"}' + + # 先让 WS 客户端连接等待快照,再注入反馈 + FB_KEY="${fb_key}" python3 - "${WEB_PORT}" > "${WORKDIR}/ws_fb.log" 2>&1 <<'PY' & +import asyncio, json, os, sys +import websockets + +PORT = int(sys.argv[1]) +KEY = os.environ["FB_KEY"] + +async def main(): + uri = f"ws://localhost:{PORT}/ws" + async with websockets.connect(uri) as ws: + try: + while True: + msg = await asyncio.wait_for(ws.recv(), timeout=8) + snap = json.loads(msg) + if isinstance(snap, dict) and KEY in snap: + print(f"FEEDBACK_OK {KEY}") + return + except asyncio.TimeoutError: + pass + print("FEEDBACK_TIMEOUT") + +asyncio.run(main()) +PY + WS_PID=$! + sleep 1 + + "${POKE_BIN}" --host="${SERVER_HOST}" --port="${SERVER_PORT}" "${fb_key}=${fb_val}" >/dev/null 2>&1 + wait "${WS_PID}" 2>/dev/null + + if grep -q "FEEDBACK_OK" "${WORKDIR}/ws_fb.log" 2>/dev/null; then + ok "反馈链路通过(${fb_key} 已推送到浏览器)" + return 0 + else + err "反馈链路失败(WS 未收到 ${fb_key})" + cat "${WORKDIR}/ws_fb.log" >&2 + return 1 + fi +} + +# 指令下发:网页 WS 下发 -> 宿主 Notify -> MOOSDB -> (宿主订阅回环) -> 推回浏览器 +# 利用宿主订阅了 uPower_pmState_fb,下发该变量后经 MOOSDB 回环,能收到即证明 +# 指令确实进入了 MOOSDB。 +test_command_notify() { + info "测试: 指令下发 (WebSocket -> pPowerMangerHost -> MOOSDB) ..." + if ! python3 -c "import websockets" >/dev/null 2>&1; then + warn "未安装 python3 websockets,跳过指令下发校验" + return 0 + fi + + python3 - "${WEB_PORT}" > "${WORKDIR}/ws_cmd.log" 2>&1 <<'PY' +import asyncio, json, sys +import websockets + +PORT = int(sys.argv[1]) +KEY = "uPower_pmState_fb" +TAG = "cmd-loopback-test" + +async def main(): + uri = f"ws://localhost:{PORT}/ws" + async with websockets.connect(uri) as ws: + await ws.send(json.dumps({"key": KEY, "value": {"info_str": TAG, "workCondition_uint8": 7}})) + try: + while True: + msg = await asyncio.wait_for(ws.recv(), timeout=8) + snap = json.loads(msg) + if isinstance(snap, dict) and KEY in snap: + obj = json.loads(snap[KEY]) + if obj.get("info_str") == TAG: + print("CMD_OK") + return + except asyncio.TimeoutError: + pass + print("CMD_TIMEOUT") + +asyncio.run(main()) +PY + local r=$? + + if [ ${r} -eq 0 ] && grep -q "CMD_OK" "${WORKDIR}/ws_cmd.log" 2>/dev/null; then + ok "指令下发到 MOOSDB 通过(uPower_pmState_fb 已回环)" + return 0 + else + err "指令下发校验失败:未收到回环快照" + cat "${WORKDIR}/ws_cmd.log" >&2 + return 1 + fi +} + +#----------------------------------------------------------------------- +# 命令入口 +#----------------------------------------------------------------------- +cmd_run() { + check_binaries || return 1 + start_moosdb || return 1 + [ "${WITH_POWERMANGER}" = "1" ] && start_pm + start_host || return 1 + + info "全部启动完成。" + info "浏览器访问: http://${SERVER_HOST}:${WEB_PORT}/" + info "按 Ctrl-C 退出并清理。" + echo "" + + trap 'info "退出清理..."; cleanup; exit 0' INT TERM + while kill -0 "${HOST_PID}" 2>/dev/null; do sleep 1; done + info "pPowerMangerHost 已退出。" + cleanup +} + +cmd_test() { + check_binaries || return 1 + start_moosdb || return 1 + start_host || return 1 + + local pass=0 fail=0 r + + test_http; r=$?; [ $r -eq 0 ] && pass=$((pass+1)) || fail=$((fail+1)) + test_monitor_loop; r=$?; [ $r -eq 0 ] && pass=$((pass+1)) || fail=$((fail+1)) + test_command_notify;r=$?; [ $r -eq 0 ] && pass=$((pass+1)) || fail=$((fail+1)) + + echo "" + info "==== 测试结果: 通过 ${pass} / 失败 ${fail} ====" + cleanup + [ "${fail}" -eq 0 ] +} + +cmd_stop() { + pkill -f "${HOST_BIN}" 2>/dev/null + pkill -f "${PM_BIN}" 2>/dev/null + pkill -x MOOSDB 2>/dev/null + ok "已清理残留进程" +} + +case "${1:-run}" in + run) cmd_run ;; + test) cmd_test ;; + build) build_targets ;; + stop) cmd_stop ;; + help|-h|--help) usage ;; + *) usage ;; +esac diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 900b228..40c1d62 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -19,6 +19,7 @@ INCLUDE_DIRECTORIES(${LOCAL_LIBRARY_DIRS}) ADD_SUBDIRECTORY(pPowerManger) # ADD_SUBDIRECTORY(appPowerMangerWebUI) add_subdirectory(pPMtest) +add_subdirectory(pPowerMangerHost) ############################################################################## # END of CMakeLists.txt ############################################################################## diff --git a/src/pPowerManger/httpserver/httpserver.cpp b/src/pPowerManger/httpserver/httpserver.cpp index 68c82dc..0a466dc 100644 --- a/src/pPowerManger/httpserver/httpserver.cpp +++ b/src/pPowerManger/httpserver/httpserver.cpp @@ -865,7 +865,7 @@ void HttpServer::handleLogRequest(struct mg_connection* c, const std::string& ms response["type"] = "log"; response["page"] = page; response["pageSize"] = pageSize; - response["total"] = static_cast(logs.size()); // 返回总条数 + response["total"] = static_cast(logs.size()); // 返回总条数 response["content"] = Json::arrayValue; if (reverse) { diff --git a/src/pPowerManger/upmsg/uPower_disSysState.h b/src/pPowerManger/upmsg/uPower_disSysState.h index e7f7fed..6af268a 100644 --- a/src/pPowerManger/upmsg/uPower_disSysState.h +++ b/src/pPowerManger/upmsg/uPower_disSysState.h @@ -152,7 +152,7 @@ public: m_state_of_bus_hv.set_fb_reserved_breaker((data.power_bus_status.fbReservedCircuitBreaker == 1)); m_state_of_bus_hv.set_tyz_reserved_breaker((data.power_bus_status.tyzReservedCircuitBreaker == 1)); m_state_of_bus_hv.set_reserved_breaker((data.power_bus_status.reservedCircuitBreaker == 1)); - dis["HVolABusBreaker_uint16"] = static_cast(m_state_of_bus_hv.relay_states.to_ulong()); + dis["HVolABusBreaker_uint16"] = static_cast(m_state_of_bus_hv.relay_states.to_ulong()); m_state_of_bus_hv_a.set_bow_ft_device_1_3_breaker((data.power_a_bus_status.bowFTDevice123CircuitBreaker == 1)); @@ -161,7 +161,7 @@ public: m_state_of_bus_hv_a.set_xcz_breaker((data.power_a_bus_status.xczCircuitBreaker == 1)); m_state_of_bus_hv_a.set_bow_rudder_control_box_breaker((data.power_a_bus_status.bowRudderControlBoxCircuitBreaker == 1)); m_state_of_bus_hv_a.set_open_water_cover_actuator_breaker((data.power_a_bus_status.openWaterCoverStartCylinderCircuitBreaker == 1)); - dis["HVolBBusBreaker_uint16"] = static_cast(m_state_of_bus_hv_a.relay_states.to_ulong()); + dis["HVolBBusBreaker_uint16"] = static_cast(m_state_of_bus_hv_a.relay_states.to_ulong()); m_state_of_bus_lv.set_bow_low_voltage_box_breaker((data.instrument_main_bus_status.bowLowVoltageDistributionBoxCircuitBreaker == 1)); m_state_of_bus_lv.set_dc_c1_dc_distribution_board_breaker((data.instrument_main_bus_status.dcC1DCDistributionPanelCircuitBreaker == 1)); @@ -170,7 +170,7 @@ public: m_state_of_bus_lv.set_emergency_lithium_battery_group_2_breaker((data.instrument_main_bus_status.emergencyLithiumBatteryGroup2CircuitBreaker == 1)); m_state_of_bus_lv.set_reserved_breaker_1((data.instrument_main_bus_status.reservedCircuitBreaker1 == 1)); m_state_of_bus_lv.set_reserved_breaker_2((data.instrument_main_bus_status.reservedCircuitBreaker2 == 1)); - dis["HVolBusBreaker_uint16"] = static_cast(m_state_of_bus_lv.relay_states.to_ulong()); + dis["HVolBusBreaker_uint16"] = static_cast(m_state_of_bus_lv.relay_states.to_ulong()); m_state_of_bus_lv_a.set_unit1_breaker((data.instrument_bus_status.unit1CircuitBreaker == 1)); @@ -181,7 +181,7 @@ public: m_state_of_bus_lv_a.set_reserved_breaker_1((data.instrument_bus_status.reservedCircuitBreaker1 == 1)); m_state_of_bus_lv_a.set_reserved_breaker_2((data.instrument_bus_status.reservedCircuitBreaker2 == 1)); m_state_of_bus_lv_a.set_emergency_lithium_battery_group_1_breaker((data.instrument_bus_status.emergencyLithiumBatteryGroup1CircuitBreaker == 1)); - dis["LVolBusBreaker_uint16"] = static_cast(m_state_of_bus_lv_a.relay_states.to_ulong()); + dis["LVolBusBreaker_uint16"] = static_cast(m_state_of_bus_lv_a.relay_states.to_ulong()); //构建配电系统故障码 Json::Value faultCodeDis_array = Json::Value(Json::arrayValue); diff --git a/src/pPowerMangerHost/CMakeLists.txt b/src/pPowerMangerHost/CMakeLists.txt new file mode 100644 index 0000000..6f0d0fe --- /dev/null +++ b/src/pPowerMangerHost/CMakeLists.txt @@ -0,0 +1,115 @@ +#-------------------------------------------------------- +# The CMakeLists.txt for: pPowerMangerHost +# Description: 模拟 pPowerManger 上位机(发指令 / 监控), +# 通过 mongoose HTTP+WebSocket 提供网页交互。 +# 复用 src/pPowerManger/httpserver/mongoose.c, +# 不新增任何第三方依赖。 +#-------------------------------------------------------- + +SET(MONGOOSE_SRC + ${CMAKE_SOURCE_DIR}/src/pPowerManger/httpserver/mongoose.c) + +SET(SRC + HostSim.cpp + HostSim_Info.cpp + WebServer.cpp + main.cpp + ${MONGOOSE_SRC} +) + +#-------------------------------------------------------- +# web/ 目录 -> webassets_gen.h : 通用嵌入式资源表 +# 扫描 web/ 下所有文件,逐个读成字节数组,并生成 {路径, MIME, 数据} 注册表。 +# 新增页面/资源只需放入 web/ 目录,CMake 自动重新生成(含重新 configure)。 +#-------------------------------------------------------- +SET(WEB_ASSET_DIR ${CMAKE_CURRENT_SOURCE_DIR}/web) +SET(WEB_ASSET_HDR ${CMAKE_CURRENT_BINARY_DIR}/webassets_gen.h) + +FILE(GLOB WEB_ASSET_FILES ${WEB_ASSET_DIR}/*) +LIST(SORT WEB_ASSET_FILES) +LIST(LENGTH WEB_ASSET_FILES WEB_ASSET_COUNT) +IF(NOT WEB_ASSET_FILES) + MESSAGE(FATAL_ERROR "web/ 目录为空,请至少放入一个页面资源") +ENDIF() + +# 目录内文件增删/修改时自动重新 configure +SET_PROPERTY(DIRECTORY APPEND PROPERTY CMAKE_CONFIGURE_DEPENDS + ${WEB_ASSET_DIR} ${WEB_ASSET_FILES}) + +SET(WEB_ASSET_HEADER +"// Auto-generated from web/, DO NOT EDIT +#ifndef WEBASSETS_GEN_H +#define WEBASSETS_GEN_H + +#include + +namespace webassets { + +struct Asset { + const char* path; + const char* mime; + const unsigned char* data; + unsigned long len; +}; + +") + +SET(WEB_ASSET_ARRAYS "") +SET(WEB_ASSET_REGISTRY "") + +FOREACH(f ${WEB_ASSET_FILES}) + GET_FILENAME_COMPONENT(name ${f} NAME) + STRING(MAKE_C_IDENTIFIER ${name} arrname) + + # 读成十六进制字节序列,再转成 C 数组初始化 + FILE(READ ${f} hexdata HEX) + STRING(REGEX REPLACE "([0-9a-f][0-9a-f])" "0x\\1," hexdata "${hexdata}") + + # 按扩展名推断 MIME(if/elseif 体内命令须另起一行) + SET(mime "application/octet-stream") + IF(name MATCHES "\\.(html|htm)$") + SET(mime "text/html; charset=utf-8") + ELSEIF(name MATCHES "\\.css$") + SET(mime "text/css") + ELSEIF(name MATCHES "\\.js$") + SET(mime "application/javascript") + ELSEIF(name MATCHES "\\.json$") + SET(mime "application/json") + ELSEIF(name MATCHES "\\.png$") + SET(mime "image/png") + ELSEIF(name MATCHES "\\.(jpe?g)$") + SET(mime "image/jpeg") + ELSEIF(name MATCHES "\\.gif$") + SET(mime "image/gif") + ELSEIF(name MATCHES "\\.svg$") + SET(mime "image/svg+xml") + ELSEIF(name MATCHES "\\.(woff2?)$") + SET(mime "font/woff2") + ELSEIF(name MATCHES "\\.txt$") + SET(mime "text/plain") + ENDIF() + + STRING(APPEND WEB_ASSET_ARRAYS + "static const unsigned char ${arrname}[] = { ${hexdata} };\n\n") + STRING(APPEND WEB_ASSET_REGISTRY + " { \"${name}\", \"${mime}\", ${arrname}, sizeof(${arrname}) },\n") +ENDFOREACH() + +FILE(WRITE ${WEB_ASSET_HDR} +"${WEB_ASSET_HEADER}${WEB_ASSET_ARRAYS}static const Asset REGISTRY[] = {\n${WEB_ASSET_REGISTRY}};\n\ninline const Asset* find(const char* path) {\n const unsigned long n = sizeof(REGISTRY) / sizeof(REGISTRY[0]);\n for (unsigned long i = 0; i < n; ++i) {\n if (strcmp(REGISTRY[i].path, path) == 0) return ®ISTRY[i];\n }\n return NULL;\n}\n\n}\n#endif\n") + +MESSAGE(STATUS "Generated ${WEB_ASSET_HDR} (${WEB_ASSET_COUNT} files) from ${WEB_ASSET_DIR}") + + +ADD_EXECUTABLE(pPowerMangerHost ${SRC}) + +TARGET_INCLUDE_DIRECTORIES(pPowerMangerHost PRIVATE + ${CMAKE_SOURCE_DIR}/src/pPowerManger/httpserver + ${CMAKE_CURRENT_BINARY_DIR}) + +TARGET_LINK_LIBRARIES(pPowerMangerHost + ${MOOS_LIBRARIES} + mbutil + m + pthread + jsoncpp) diff --git a/src/pPowerMangerHost/HostSim.cpp b/src/pPowerMangerHost/HostSim.cpp new file mode 100644 index 0000000..4d3d268 --- /dev/null +++ b/src/pPowerMangerHost/HostSim.cpp @@ -0,0 +1,229 @@ +/************************************************************/ +/* NAME: */ +/* ORGN: MIT */ +/* FILE: HostSim.cpp */ +/* DATE: */ +/************************************************************/ + +#include +#include +#include "MBUtils.h" +#include "HostSim.h" +#include "WebServer.h" +#include "json/json.h" + +using namespace std; + +//--------------------------------------------------------- +// Constructor + +HostSim::HostSim() + : m_feedbackDirty(false), m_webServer(nullptr), m_webPort(18080) +{ +} + +//--------------------------------------------------------- +// Destructor + +HostSim::~HostSim() +{ + if (m_webServer) { + m_webServer->stop(); + delete m_webServer; + m_webServer = nullptr; + } +} + +//--------------------------------------------------------- +// Procedure: OnNewMail + +bool HostSim::OnNewMail(MOOSMSG_LIST &NewMail) +{ + MOOSMSG_LIST::iterator p; + for (p = NewMail.begin(); p != NewMail.end(); p++) { + CMOOSMsg &msg = *p; + string key = msg.GetKey(); + + if (msg.IsString()) { + lock_guard lock(m_feedbackMutex); + m_feedback[key] = msg.GetString(); + m_feedbackDirty = true; + } + } + return true; +} + +//--------------------------------------------------------- +// Procedure: OnConnectToServer + +bool HostSim::OnConnectToServer() +{ + RegisterVariables(); + return true; +} + +//--------------------------------------------------------- +// Procedure: Iterate() +// happens AppTick times per second + +bool HostSim::Iterate() +{ + // 1. 处理网页下发的指令 -> Notify 到 MOOSDB + drainCommands(); + + // 2. 若有反馈更新,推送快照到所有网页客户端 + bool dirty = false; + { + lock_guard lock(m_feedbackMutex); + dirty = m_feedbackDirty; + } + if (dirty && m_webServer) { + m_webServer->broadcast(buildSnapshot()); + lock_guard lock(m_feedbackMutex); + m_feedbackDirty = false; + } + + return true; +} + +//--------------------------------------------------------- +// Procedure: OnStartUp() + +bool HostSim::OnStartUp() +{ + list sParams; + m_MissionReader.EnableVerbatimQuoting(false); + if (m_MissionReader.GetConfiguration(GetAppName(), sParams)) { + list::iterator p; + for (p = sParams.begin(); p != sParams.end(); p++) { + string line = *p; + string param = tolower(biteStringX(line, '=')); + string value = line; + + if (param == "web_port") { + m_webPort = atoi(value.c_str()); + } + } + } + + // 启动网页服务器 + m_webServer = new WebServer(); + m_webServer->setOnMessage([this](const string& msg) { + this->handleWebMessage(msg); + }); + m_webServer->start(m_webPort); + + RegisterVariables(); + return true; +} + +//--------------------------------------------------------- +// Procedure: handleWebMessage +// 网页下发 JSON: {"key":"...", "value":{...}} 或 +// {"key":"...", "value":"..."},把 value 序列化为字符串后入队 + +void HostSim::handleWebMessage(const std::string& msg) +{ + Json::CharReaderBuilder builder; + Json::Value root; + JSONCPP_STRING errs; + istringstream stream(msg); + if (!Json::parseFromStream(builder, stream, &root, &errs)) { + return; + } + + if (!root.isMember("key")) { + return; + } + + string key = root["key"].asString(); + string valueStr; + + if (root.isMember("value")) { + const Json::Value& v = root["value"]; + if (v.isString()) { + // 允许直接发送原始 JSON 字符串 + valueStr = v.asString(); + } else { + Json::StreamWriterBuilder wb; + wb.settings_["indentation"] = ""; + valueStr = Json::writeString(wb, v); + } + } + + pushCommand(key, valueStr); +} + +//--------------------------------------------------------- +// Procedure: pushCommand + +void HostSim::pushCommand(const string& key, const string& jsonValue) +{ + lock_guard lock(m_cmdMutex); + m_cmdQueue.push(make_pair(key, jsonValue)); +} + +//--------------------------------------------------------- +// Procedure: drainCommands + +bool HostSim::drainCommands() +{ + vector > pending; + { + lock_guard lock(m_cmdMutex); + while (!m_cmdQueue.empty()) { + pending.push_back(m_cmdQueue.front()); + m_cmdQueue.pop(); + } + } + + for (size_t i = 0; i < pending.size(); i++) { + Notify(pending[i].first, pending[i].second); + } + return true; +} + +//--------------------------------------------------------- +// Procedure: buildSnapshot + +string HostSim::buildSnapshot() +{ + Json::Value root(Json::objectValue); + { + lock_guard lock(m_feedbackMutex); + for (map::iterator it = m_feedback.begin(); + it != m_feedback.end(); ++it) { + root[it->first] = it->second; + } + } + + Json::StreamWriterBuilder wb; + wb.settings_["indentation"] = ""; + return Json::writeString(wb, root); +} + +//--------------------------------------------------------- +// Procedure: RegisterVariables + +void HostSim::RegisterVariables() +{ + registerFeedbackVars(); +} + +//--------------------------------------------------------- +// Procedure: registerFeedbackVars +// 订阅 pPowerManger 上位机反馈变量 + +void HostSim::registerFeedbackVars() +{ + // 状态报告 + Register("uPower_pmState_fb", 0); // 能源管理总状态 + Register("uPower_fcsState_st", 0); // 燃料电池状态 + Register("uPower_liBatState_st", 0); // 锂电池状态 + Register("uPower_disSysState_st", 0); // 配电系统状态 + Register("uPower_currentState_st", 0); // 母线电压电流 + Register("uPower_equState_fb", 0); // 设备状态 + Register("uPower_equInsState_fb", 0); // 设备仪表状态 + Register("uPower_secdistState_cmd", 0);// 次级配电状态 + Register("uPower_subDisFault_st", 0); // 次级配电故障状态(_DEBUG 下发布) +} diff --git a/src/pPowerMangerHost/HostSim.h b/src/pPowerMangerHost/HostSim.h new file mode 100644 index 0000000..0838970 --- /dev/null +++ b/src/pPowerMangerHost/HostSim.h @@ -0,0 +1,61 @@ +/************************************************************/ +/* NAME: */ +/* ORGN: MIT */ +/* FILE: HostSim.h */ +/* DATE: */ +/************************************************************/ + +#ifndef HOSTSIM_HEADER +#define HOSTSIM_HEADER + +#include "MOOS/libMOOS/MOOSLib.h" +#include +#include +#include +#include +#include +#include + +class WebServer; + +// 模拟 pPowerManger 上位机:网页 <-> MOOSDB 桥 +class HostSim : public CMOOSApp +{ + public: + HostSim(); + ~HostSim(); + + protected: // Standard MOOSApp functions to overload + bool OnNewMail(MOOSMSG_LIST &NewMail); + bool Iterate(); + bool OnConnectToServer(); + bool OnStartUp(); + void RegisterVariables(); + + public: // 由 WebServer 线程调用 + // 网页下发的指令:key 为 MOOS 变量名,jsonValue 为已序列化的 JSON 字符串 + void pushCommand(const std::string& key, const std::string& jsonValue); + // 取当前所有反馈变量的 JSON 快照 + std::string buildSnapshot(); + + private: + void registerFeedbackVars(); + bool drainCommands(); + void handleWebMessage(const std::string& msg); + + private: // State variables + // 反馈缓存:key -> 最新 JSON 字符串 + std::mutex m_feedbackMutex; + std::map m_feedback; + bool m_feedbackDirty; + + // 待发送指令队列 + std::mutex m_cmdMutex; + std::queue > m_cmdQueue; + + // 网页服务器 + WebServer* m_webServer; + int m_webPort; +}; + +#endif diff --git a/src/pPowerMangerHost/HostSim_Info.cpp b/src/pPowerMangerHost/HostSim_Info.cpp new file mode 100644 index 0000000..6008e43 --- /dev/null +++ b/src/pPowerMangerHost/HostSim_Info.cpp @@ -0,0 +1,114 @@ +/****************************************************************/ +/* NAME: */ +/* ORGN: MIT Cambridge MA */ +/* FILE: HostSim_Info.cpp */ +/* DATE: */ +/****************************************************************/ + +#include +#include +#include "HostSim_Info.h" +#include "ColorParse.h" +#include "ReleaseInfo.h" + +using namespace std; + +//---------------------------------------------------------------- +// Procedure: showSynopsis + +void showSynopsis() +{ + blk("SYNOPSIS: "); + blk("------------------------------------ "); + blk(" pPowerMangerHost 模拟 pPowerManger 的上位机。 "); + blk(" 通过 MOOSDB 与 pPowerManger 交互,并使用网页进行界面交互: "); + blk(" 下发指令 / 监控反馈,浏览器访问 http://:18080 。 "); + blk(" "); +} + +//---------------------------------------------------------------- +// Procedure: showHelpAndExit + +void showHelpAndExit() +{ + blk(" "); + blu("=============================================================== "); + blu("Usage: pPowerMangerHost file.moos [OPTIONS] "); + blu("=============================================================== "); + blk(" "); + showSynopsis(); + blk(" "); + blk("Options: "); + mag(" --alias","= "); + blk(" Launch pPowerMangerHost with the given process name. "); + mag(" --example, -e "); + blk(" Display example MOOS configuration block. "); + mag(" --help, -h "); + blk(" Display this help message. "); + mag(" --interface, -i "); + blk(" Display MOOS publications and subscriptions. "); + mag(" --version,-v "); + blk(" Display the release version of pPowerMangerHost. "); + blk(" "); + exit(0); +} + +//---------------------------------------------------------------- +// Procedure: showExampleConfigAndExit + +void showExampleConfigAndExit() +{ + blk(" "); + blu("=============================================================== "); + blu("pPowerMangerHost Example MOOS Configuration "); + blu("=============================================================== "); + blk(" "); + blk("ProcessConfig = pPowerMangerHost "); + blk("{ "); + blk(" AppTick = 4 "); + blk(" CommsTick = 4 "); + blk(" WEB_PORT = 18080 // 网页监听端口 "); + blk("} "); + blk(" "); + exit(0); +} + +//---------------------------------------------------------------- +// Procedure: showInterfaceAndExit + +void showInterfaceAndExit() +{ + blk(" "); + blu("=============================================================== "); + blu("pPowerMangerHost INTERFACE "); + blu("=============================================================== "); + blk(" "); + showSynopsis(); + blk(" "); + blk("SUBSCRIPTIONS: "); + blk("------------------------------------ "); + blk(" uPower_pmState_fb 能源管理总状态 "); + blk(" uPower_fcsState_st 燃料电池状态 "); + blk(" uPower_liBatState_st 锂电池状态 "); + blk(" uPower_disSysState_st 配电系统状态 "); + blk(" uPower_currentState_st 母线电压电流 "); + blk(" uPower_equState_fb 设备状态 "); + blk(" uPower_equInsState_fb 设备仪表状态 "); + blk(" uPower_secdistState_cmd 次级配电状态 "); + blk(" "); + blk("PUBLICATIONS: "); + blk("------------------------------------ "); + blk(" 由网页下发,任意 MOOS 变量(命令类)Notify 到 MOOSDB。 "); + blk(" 例如 uExternComm_setOpCondition_cmd / uPlan_taskStart_st 等。 "); + blk(" "); + exit(0); +} + +//---------------------------------------------------------------- +// Procedure: showReleaseInfoAndExit + +void showReleaseInfoAndExit() +{ + showReleaseInfo("pPowerMangerHost", "gpl"); + exit(0); +} diff --git a/src/pPowerMangerHost/HostSim_Info.h b/src/pPowerMangerHost/HostSim_Info.h new file mode 100644 index 0000000..1361dc5 --- /dev/null +++ b/src/pPowerMangerHost/HostSim_Info.h @@ -0,0 +1,17 @@ +/****************************************************************/ +/* NAME: */ +/* ORGN: MIT Cambridge MA */ +/* FILE: HostSim_Info.h */ +/* DATE: */ +/****************************************************************/ + +#ifndef HOSTSIM_INFO_HEADER +#define HOSTSIM_INFO_HEADER + +void showSynopsis(); +void showHelpAndExit(); +void showExampleConfigAndExit(); +void showInterfaceAndExit(); +void showReleaseInfoAndExit(); + +#endif diff --git a/src/pPowerMangerHost/WebServer.cpp b/src/pPowerMangerHost/WebServer.cpp new file mode 100644 index 0000000..6f65b89 --- /dev/null +++ b/src/pPowerMangerHost/WebServer.cpp @@ -0,0 +1,115 @@ +#include "WebServer.h" +#include "webassets_gen.h" +#include + +//--------------------------------------------------------- +// 事件处理:HTTP 路由 + WebSocket 收发 + +void WebServer::handleEvent(struct mg_connection* c, int ev, void* ev_data) { + if (ev == MG_EV_HTTP_MSG) { + struct mg_http_message* hm = (struct mg_http_message*)ev_data; + + // WebSocket 升级 + if (mg_match(hm->uri, mg_str("/ws"), NULL)) { + mg_ws_upgrade(c, hm, NULL); + return; + } + + // 静态资源路由:在嵌入式资源表 webassets 中按路径查找并返回 + std::string path(hm->uri.buf, hm->uri.len); + if (path == "/" || path == "/index.html") { + path = "index.html"; + } else if (!path.empty() && path[0] == '/') { + path = path.substr(1); + } + + const webassets::Asset* a = webassets::find(path.c_str()); + if (a) { + std::string hdr = "Content-Type: "; + hdr += a->mime; + hdr += "\r\n"; + mg_http_reply(c, 200, hdr.c_str(), "%.*s", (int) a->len, + (const char*) a->data); + } else { + mg_http_reply(c, 404, "Content-Type: text/plain\r\n", "Not Found\n"); + } + } else if (ev == MG_EV_WS_OPEN) { + std::lock_guard lock(m_wsMutex); + m_wsConnections.push_back(c); + } else if (ev == MG_EV_CLOSE || ev == MG_EV_ERROR) { + std::lock_guard lock(m_wsMutex); + for (auto it = m_wsConnections.begin(); it != m_wsConnections.end(); ++it) { + if (*it == c) { + m_wsConnections.erase(it); + break; + } + } + } else if (ev == MG_EV_WS_MSG) { + struct mg_ws_message* wm = (struct mg_ws_message*)ev_data; + std::string msg(wm->data.buf, wm->data.len); + if (m_onMessage) { + m_onMessage(msg); + } + } +} + +WebServer::WebServer() : m_port(0), m_running(false) { + mg_mgr_init(&m_mgr); +} + +WebServer::~WebServer() { + stop(); + mg_mgr_free(&m_mgr); +} + +void WebServer::setOnMessage(std::function handler) { + m_onMessage = handler; +} + +bool WebServer::start(int port) { + if (m_running) return true; + m_port = port; + + std::string addr = "http://0.0.0.0:" + std::to_string(port); + mg_http_listen(&m_mgr, addr.c_str(), [](mg_connection* c, int ev, void* ev_data) { + WebServer* server = static_cast(c->fn_data); + if (server) server->handleEvent(c, ev, ev_data); + }, this); + + m_running = true; + m_thread = std::thread([this]() { serverThreadFunc(); }); + + std::cout << "pPowerMangerHost web UI listening on " << addr << std::endl; + return true; +} + +void WebServer::stop() { + if (!m_running) return; + m_running = false; + if (m_thread.joinable()) m_thread.join(); + + std::lock_guard lock(m_wsMutex); + for (auto c : m_wsConnections) { + mg_ws_send(c, "", 0, WEBSOCKET_OP_CLOSE); + } + m_wsConnections.clear(); +} + +bool WebServer::serverThreadCB(void* pParam) { + WebServer* pThis = static_cast(pParam); + return pThis->serverThreadFunc(); +} + +bool WebServer::serverThreadFunc() { + while (m_running) { + mg_mgr_poll(&m_mgr, 200); + } + return true; +} + +void WebServer::broadcast(const std::string& text) { + std::lock_guard lock(m_wsMutex); + for (auto c : m_wsConnections) { + mg_ws_send(c, text.c_str(), text.size(), WEBSOCKET_OP_TEXT); + } +} diff --git a/src/pPowerMangerHost/WebServer.h b/src/pPowerMangerHost/WebServer.h new file mode 100644 index 0000000..b2f94e5 --- /dev/null +++ b/src/pPowerMangerHost/WebServer.h @@ -0,0 +1,42 @@ +#ifndef WEBSERVER_H +#define WEBSERVER_H + +#include "mongoose.h" +#include +#include +#include +#include +#include +#include + +class WebServer { +public: + WebServer(); + ~WebServer(); + + // 启动 HTTP+WebSocket 服务器(阻塞在独立线程) + bool start(int port); + void stop(); + + // 向所有 WebSocket 客户端广播文本 + void broadcast(const std::string& text); + + // 收到网页 WS 消息时的回调 + void setOnMessage(std::function handler); + +private: + static bool serverThreadCB(void* pParam); + bool serverThreadFunc(); + void handleEvent(struct mg_connection* c, int ev, void* ev_data); + + struct mg_mgr m_mgr; + int m_port; + std::atomic m_running; + std::thread m_thread; + + std::mutex m_wsMutex; + std::vector m_wsConnections; + std::function m_onMessage; +}; + +#endif // WEBSERVER_H diff --git a/src/pPowerMangerHost/main.cpp b/src/pPowerMangerHost/main.cpp new file mode 100644 index 0000000..eee528a --- /dev/null +++ b/src/pPowerMangerHost/main.cpp @@ -0,0 +1,51 @@ +/************************************************************/ +/* NAME: */ +/* ORGN: MIT */ +/* FILE: main.cpp */ +/* DATE: */ +/************************************************************/ + +#include +#include "MBUtils.h" +#include "ColorParse.h" +#include "HostSim.h" +#include "HostSim_Info.h" + +using namespace std; + +int main(int argc, char *argv[]) +{ + string mission_file; + string run_command = argv[0]; + + for(int i=1; i + + + + +pPowerManger 上位机模拟 + + + +
+ +

pPowerManger 上位机模拟 (Web UI)

+ 连接中… +
+
+
+

指令下发

+
+ + +
+
+ + +
+
+ +
+ +
+ + +
+ +

快捷指令

+
+ +

通用 MOOS 通知

+
+ + + +
+
+ +
+

反馈监控(pPowerManger 发往上位机的全部消息)

+
+
+
+
+ +
+

连续数据曲线

+
+ + + + +
+
+ +
+ +
+

操作日志

+
+
+ + + + diff --git a/test/disSysTest.zip b/test/disSysTest.zip deleted file mode 100644 index 7b4b4d31cfad656087c27ccfed48037b6728fb57..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 323990 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
    =O^?B|p94f6t4OpCv~p^b{Y=Mx$`n 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

    Lw%tl>;tkrP8}h&&Tx|F}lkD&XjjXetayR+mH;Y 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", configure_canvas) + canvas.bind("", configure_canvas) + + # 绑定鼠标滚轮事件 + def on_mousewheel(event): + canvas.yview_scroll(int(-1 * (event.delta / 120)), "units") + + canvas.bind_all("", on_mousewheel) + + # 状态显示区 - 使用Notebook组织不同母线状态 + self.notebook_c = ttk.Notebook(inner_frame) + self.notebook_c.pack(fill="both", expand=True, padx=5, pady=5) + + high_vol_control_frame = ttk.Frame(self.notebook_c) + self.notebook_c.add(high_vol_control_frame, text="动力配电板") + self.setup_hvb_control(high_vol_control_frame) + + high_a_vol_control_frame = ttk.Frame(self.notebook_c) + self.notebook_c.add(high_a_vol_control_frame, text="艏部高压") + self.setup_hvba_control(high_a_vol_control_frame) + + low_main_control_frame = ttk.Frame(self.notebook_c) + self.notebook_c.add(low_main_control_frame, text="仪表配电板") + self.setup_lvmb_control(low_main_control_frame) + + low_bus_control_frame = ttk.Frame(self.notebook_c) + self.notebook_c.add(low_bus_control_frame, text="艏部低压") + self.setup_lvb_control(low_bus_control_frame) + + # 日志区 + log_frame = ttk.LabelFrame(main_frame, text="系统日志", padding="10") + log_frame.pack(fill=tk.BOTH, expand=True, pady=5) + log_frame.grid_rowconfigure(0, weight=1) + log_frame.grid_columnconfigure(0, weight=1) + + self.log_text = tk.Text(log_frame, height=10, state=tk.DISABLED) + self.log_text.pack(fill=tk.BOTH, expand=True) + + scrollbar = ttk.Scrollbar(log_frame, + orient=tk.VERTICAL, + command=self.log_text.yview) + scrollbar.pack(side=tk.RIGHT, fill=tk.Y) + self.log_text.config(yscrollcommand=scrollbar.set) + + def setup_hvb_control(self, parent): + """设置动力母线配电指令控制面板""" + frame = ttk.LabelFrame(parent, text="动力母线配电指令", padding="10") + frame.pack(fill=tk.X, pady=5) + + # 断路器控制按钮 + breaker_names = [ + "燃料电池断路器", "动力锂电池断路器", "推进电机断路器", "锂电池组仪表断路器", "DC/DC汇流排断路器", + "艏部高压断路器", "艉FT设备45断路器", "FB备用断路器", "艉舵机开关1断路器", "艉舵机开关2断路器", + "TYZ备用断路器", "备用断路器", "DC/DC模块启动", "冷却系统启动" + ] + + for i, name in enumerate(breaker_names): + row = i // 3 + col = i % 3 + btn_frame = ttk.Frame(frame) + btn_frame.grid(row=row, column=col, padx=10, pady=2, sticky=tk.W) + + ttk.Label(btn_frame, text=name, width=20).pack(side=tk.LEFT) + on_btn = ttk.Button( + btn_frame, + text="合", + width=3, + command=lambda n=name: self.send_hvb_cmd(n, 0x55)) + on_btn.pack(side=tk.LEFT, padx=2) + off_btn = ttk.Button( + btn_frame, + text="分", + width=3, + command=lambda n=name: self.send_hvb_cmd(n, 0xAA)) + off_btn.pack(side=tk.LEFT, padx=2) + + def setup_hvba_control(self, parent): + """设置动力汇流排A配电指令控制面板""" + frame = ttk.LabelFrame(parent, text="动力汇流排A配电指令", padding="10") + frame.pack(fill=tk.X, pady=5) + + # 断路器控制按钮 + breaker_names = [ + "艏FT设备123断路器", "启闭机构断路器", "桅杆舵机断路器", "XCZ断路器", "艏舵控制箱断路器", + "敞水盖断路器" + ] + + for i, name in enumerate(breaker_names): + row = i // 3 + col = i % 3 + btn_frame = ttk.Frame(frame) + btn_frame.grid(row=row, column=col, padx=10, pady=2, sticky=tk.W) + + ttk.Label(btn_frame, text=name, width=20).pack(side=tk.LEFT) + on_btn = ttk.Button( + btn_frame, + text="合", + width=3, + command=lambda n=name: self.send_hvba_cmd(n, 0x55)) + on_btn.pack(side=tk.LEFT, padx=2) + off_btn = ttk.Button( + btn_frame, + text="分", + width=3, + command=lambda n=name: self.send_hvba_cmd(n, 0xAA)) + off_btn.pack(side=tk.LEFT, padx=2) + + def setup_lvmb_control(self, parent): + """设置仪表母线配电指令控制面板""" + frame = ttk.LabelFrame(parent, text="仪表母线配电指令", padding="10") + frame.pack(fill=tk.X, pady=5) + + # 断路器控制按钮 + breaker_names = [ + "锂电池组仪表断路器", "艏部低压断路器", "单元4仪表48V断路器", "DC/C1直流配电板断路器", "备用断路器1", + "备用断路器2", "应急锂电池组2断路器" + ] + + for i, name in enumerate(breaker_names): + row = i // 3 + col = i % 3 + btn_frame = ttk.Frame(frame) + btn_frame.grid(row=row, column=col, padx=10, pady=2, sticky=tk.W) + + ttk.Label(btn_frame, text=name, width=20).pack(side=tk.LEFT) + on_btn = ttk.Button( + btn_frame, + text="合", + width=3, + command=lambda n=name: self.send_lvmb_cmd(n, 0x55)) + on_btn.pack(side=tk.LEFT, padx=2) + off_btn = ttk.Button( + btn_frame, + text="分", + width=3, + command=lambda n=name: self.send_lvmb_cmd(n, 0xaa)) + off_btn.pack(side=tk.LEFT, padx=2) + + def setup_lvb_control(self, parent): + """设置仪表汇流排配电指令控制面板""" + frame = ttk.LabelFrame(parent, text="仪表汇流排配电指令", padding="10") + frame.pack(fill=tk.X, pady=5) + + # 断路器控制按钮 + breaker_names = [ + "单元1断路器", "单元2断路器", "单元3断路器", "单元5断路器", "艏PZ设备断路器", "备用断路器1", + "备用断路器2", "应急锂电池组1断路器" + ] + + for i, name in enumerate(breaker_names): + row = i // 3 + col = i % 3 + btn_frame = ttk.Frame(frame) + btn_frame.grid(row=row, column=col, padx=10, pady=2, sticky=tk.W) + + ttk.Label(btn_frame, text=name, width=20).pack(side=tk.LEFT) + on_btn = ttk.Button( + btn_frame, + text="合", + width=3, + command=lambda n=name: self.send_lvb_cmd(n, 0x55)) + on_btn.pack(side=tk.LEFT, padx=2) + off_btn = ttk.Button( + btn_frame, + text="分", + width=3, + command=lambda n=name: self.send_lvb_cmd(n, 0xaa)) + off_btn.pack(side=tk.LEFT, padx=2) + + def send_hvb_cmd(self, breaker_name, state): + """发送动力母线配电指令""" + # print(breaker_name,state) + cmd = msg_disHVBCmdMsg() + if breaker_name == "燃料电池断路器": + cmd.fuelCellCircuitBreaker = state + elif breaker_name == "动力锂电池断路器": + cmd.powerLithiumBatteryCircuitBreaker = state + elif breaker_name == "推进电机断路器": + cmd.propulsionMotorCircuitBreaker = state + elif breaker_name == "锂电池组仪表断路器": + cmd.lithiumBatteryGroupInstrumentCircuitBreaker = state + elif breaker_name == "DC/DC汇流排断路器": + cmd.dcDc5ModuleCircuitBreaker = state + elif breaker_name == "艏部高压断路器": + cmd.bowHighVoltageDistributionBoxCircuitBreaker = state + elif breaker_name == "艉FT设备45断路器": + cmd.sternFTDevice45CircuitBreaker = state + elif breaker_name == "FB备用断路器": + cmd.sternRudderSwitch1CircuitBreaker = state + elif breaker_name == "艉舵机开关1断路器": + cmd.sternRudderSwitch2CircuitBreaker = state + elif breaker_name == "艉舵机开关2断路器": + cmd.fbReservedCircuitBreaker = state + elif breaker_name == "TYZ备用断路器": + cmd.tyzReservedCircuitBreaker = state + elif breaker_name == "备用断路器": + cmd.reservedCircuitBreaker = state + elif breaker_name == "DC/DC模块启动": + cmd.dcdc5Module = state + elif breaker_name == "冷却系统启动": + cmd.coolingSystem = state + + # self.send_udp_command(cmd.pack()) + self.send_udp_command(cmd.pack(), self.disSysHostC1, self.disSysPortC1) + self.db.insertHighVolBusCmd(cmd) + if state == 0x55: + buntu = True + else: + buntu = False + self.log_message(f"发送动力母线配电指令: {breaker_name} {'合' if buntu else '分'}") + + def send_hvba_cmd(self, breaker_name, state): + """发送动力汇流排A配电指令""" + cmd = msg_disHVBACmdMsg() + + if breaker_name == "艏FT设备123断路器": + cmd.bowFTDevice123CircuitBreaker = state + elif breaker_name == "启闭机构断路器": + cmd.actuatorCircuitBreaker = state + elif breaker_name == "桅杆舵机断路器": + cmd.mastSteeringGearControlBoxCircuitBreaker = state + elif breaker_name == "XCZ断路器": + cmd.xczCircuitBreaker = state + elif breaker_name == "艏舵控制箱断路器": + cmd.bowRudderControlBoxCircuitBreaker = state + elif breaker_name == "敞水盖断路器": + cmd.openWaterCoverStartCylinderCircuitBreaker = state + if state == 0x55: + buntu = True + else: + buntu = False + self.log_message( + f"发送动力汇流排A配电指令: {breaker_name} {'合' if buntu else '分'}") + # self.send_udp_command(cmd.pack()) + self.send_udp_command(cmd.pack(), self.disSysHostC1, self.disSysPortC1) + self.db.insertHighAVolBusCmd(cmd) + + def send_lvmb_cmd(self, breaker_name, state): + """发送仪表母线配电指令""" + cmd = msg_disLVMBCmdMsg() + if breaker_name == "锂电池组仪表断路器": + cmd.lithiumBatteryGroupInstrumentCircuitBreaker = state + elif breaker_name == "艏部低压断路器": + cmd.bowLowVoltageDistributionBoxCircuitBreaker = state + elif breaker_name == "单元4仪表48V断路器": + cmd.unit4InstrumentDC48VCircuitBreaker = state + elif breaker_name == "DC/C1直流配电板断路器": + cmd.dcC1DCDistributionPanelCircuitBreaker = state + elif breaker_name == "备用断路器1": + cmd.reservedCircuitBreaker1 = state + elif breaker_name == "备用断路器2": + cmd.reservedCircuitBreaker2 = state + elif breaker_name == "应急锂电池组2断路器": + cmd.emergencyLithiumBatteryGroup2CircuitBreaker = state + + # self.send_udp_command(cmd.pack()) + self.send_udp_command(cmd.pack(), self.disSysHostC2, self.disSysPortC2) + self.db.insertLowMainBusCmd(cmd) + if state == 0x55: + buntu = True + else: + buntu = False + self.log_message(f"发送仪表母线配电指令: {breaker_name} {'合' if buntu else '分'}") + + def send_lvb_cmd(self, breaker_name, state): + """发送仪表汇流排配电指令""" + cmd = msg_disLVBCmdMsg() + if breaker_name == "单元1断路器": + cmd.unit1CircuitBreaker = state + elif breaker_name == "单元2断路器": + cmd.unit2CircuitBreaker = state + elif breaker_name == "单元3断路器": + cmd.unit3CircuitBreaker = state + elif breaker_name == "单元5断路器": + cmd.unit5CircuitBreaker = state + elif breaker_name == "艏PZ设备断路器": + cmd.bowPZDeviceCircuitBreaker = state + elif breaker_name == "备用断路器1": + cmd.reservedCircuitBreaker1 = state + elif breaker_name == "备用断路器2": + cmd.reservedCircuitBreaker2 = state + elif breaker_name == "应急锂电池组1断路器": + cmd.emergencyLithiumBatteryGroup1CircuitBreaker = state + + # self.send_udp_command(cmd.pack()) + self.send_udp_command(cmd.pack(), self.disSysHostC2, self.disSysPortC2) + self.db.insertLowBusCmd(cmd) + if state == 0x55: + buntu = True + else: + buntu = False + self.log_message( + f"发送仪表汇流排配电指令: {breaker_name} {'合' if buntu else '分'}") + + def udp_receive_loop(self): + """UDP接收消息循环""" + while self.running: + # print('接收中') + try: + data, addr = self.sock.recvfrom(1024) + self.process_udp_message(data) + # print('接收成功') + except Exception as e: + self.log_message(f"接收错误: {str(e)}") + + def setup_high_vol_ui(self, parent): + """设置高压母线状态界面""" + # 初始化故障位列表 + self.high_vol_dcdc_fault1_bits = [] + self.high_vol_dcdc_fault2_bits = [] + + frame = ttk.LabelFrame(parent, text="高压母线状态") + frame.pack(fill=tk.BOTH, expand=True, padx=2, pady=2) + + # 使用网格布局管理器 + frame.grid_columnconfigure(0, weight=1) + frame.grid_columnconfigure(1, weight=1) + frame.grid_columnconfigure(2, weight=1) + frame.grid_columnconfigure(3, weight=1) + + # 电压显示 + ttk.Label(frame, text="动力母线电压(V):").grid(row=0, column=0, sticky=tk.W) + self.high_vol_power_voltage = ttk.Label(frame, text="0.0V") + self.high_vol_power_voltage.grid(row=0, column=1, sticky=tk.W) + + ttk.Label(frame, text="A母线电压(V):").grid(row=0, column=2, sticky=tk.W) + self.high_vol_a_voltage = ttk.Label(frame, text="0.0V") + self.high_vol_a_voltage.grid(row=0, column=3, sticky=tk.W) + + # 断路器状态 + ttk.Label(frame, text="断路器状态:").grid(row=2, + column=0, + columnspan=4, + sticky=tk.W) + self.high_vol_breakers = {} + breaker_names = list( + self.status_data["high_vol_bus"]["breakers"].keys()) + + for i, name in enumerate(breaker_names): + ttk.Label(frame, text=name).grid(row=3 + i // 3, + column=(i % 3) * 2, + sticky=tk.W) + canvas = tk.Canvas(frame, width=20, height=20, bg="white") + canvas.grid(row=3 + i // 3, column=(i % 3) * 2 + 1, sticky=tk.W) + self.high_vol_breakers[name] = canvas + + # 绝缘状态 + ttk.Label(frame, text="动力母线绝缘:").grid(row=9, column=0, sticky=tk.W) + self.high_vol_power_insulation = ttk.Label(frame, text="正常") + self.high_vol_power_insulation.grid(row=9, column=1, sticky=tk.W) + + ttk.Label(frame, text="A母线绝缘:").grid(row=9, column=2, sticky=tk.W) + self.high_vol_a_insulation = ttk.Label(frame, text="正常") + self.high_vol_a_insulation.grid(row=9, column=3, sticky=tk.W) + + # 故障状态 - 扩展显示所有故障位 + fault_labels1 = [ + "过温关机", "输出过流", "输出过压", "输出欠压", "输入过压", "输入欠压", "输出短路保护", "内部故障" + ] + fault_labels2 = [ + "通信故障", "工作状态", "冷却泵1故障", "冷却泵2故障", "冷却水泄漏", "冷却泵1运行状态", + "冷却泵2运行状态", "保留" + ] + + # DC/DC故障显示 + fault_frame = ttk.Frame(frame) + fault_frame.grid(row=10, column=0, columnspan=4, sticky=tk.W, pady=2) + + ttk.Label(fault_frame, text="DC/DC故障字1:").grid(row=0, + column=0, + sticky=tk.W) + for i, label in enumerate(fault_labels1): + ttk.Label(fault_frame, text=label).grid(row=1 + i // 4, + column=(i % 4) * 2, + sticky=tk.W, + padx=2) + canvas = tk.Canvas(fault_frame, + width=16, + height=16, + bg="white", + highlightthickness=1) + canvas.grid(row=1 + i // 4, + column=(i % 4) * 2 + 1, + sticky=tk.W, + padx=2) + self.high_vol_dcdc_fault1_bits.append(canvas) + + ttk.Label(fault_frame, text="DC/DC故障字2:").grid(row=3, + column=0, + sticky=tk.W) + for i, label in enumerate(fault_labels2): + ttk.Label(fault_frame, text=label).grid(row=4 + i // 4, + column=(i % 4) * 2, + sticky=tk.W, + padx=2) + canvas = tk.Canvas(fault_frame, + width=16, + height=16, + bg="white", + highlightthickness=1) + canvas.grid(row=4 + i // 4, + column=(i % 4) * 2 + 1, + sticky=tk.W, + padx=2) + self.high_vol_dcdc_fault2_bits.append(canvas) + + # 绝缘状态 - 详细显示 + ttk.Label(frame, text="动力母线绝缘:").grid(row=16, column=0, sticky=tk.W) + self.high_vol_power_insulation = ttk.Label(frame, text="正常") + self.high_vol_power_insulation.grid(row=16, column=1, sticky=tk.W) + + ttk.Label(frame, text="A母线绝缘:").grid(row=16, column=2, sticky=tk.W) + self.high_vol_a_insulation = ttk.Label(frame, text="正常") + self.high_vol_a_insulation.grid(row=16, column=3, sticky=tk.W) + + # 电流值显示 + current_labels = [ + ("动力母线电流(A):", "powerBusCurrent"), + ("A汇流排电流(A):", "busbarACurrent"), + ("DC/DC5模块电流(A):", "dcDc5ModuleCurrent"), + ("推进电机控制箱电流(A):", "propulsionMotorControlBoxCurrent"), + ("锂电池组(仪表)电流(A):", "lithiumBatteryGroupMeterCurrent"), + ("艏部高压配电箱电流(A):", "bowHighVoltageDistributionBoxCurrent"), + ("艉部FT装置4/5电流(A):", "sternFTDevice45Current"), + ("TYZ预留开关电流(A):", "tyzReservedSwitchCurrent"), + ("艉舵开关1电流(A):", "sternRudderSwitch1Current"), + ("艉舵开关2电流(A):", "sternRudderSwitch2Current"), + ("FB预留开关电流(A):", "fbReservedSwitchCurrent"), + ("备用电流1(A):", "reservedCurrent1"), ("备用电流2(A):", + "reservedCurrent2"), + ("备用电流3(A):", "reservedCurrent3") + ] + + for i, (label, _) in enumerate(current_labels): + ttk.Label(frame, text=label).grid(row=17 + i // 2, + column=(i % 2) * 2, + sticky=tk.W) + label_var = ttk.Label(frame, text="0.0A") + label_var.grid(row=17 + i // 2, + column=(i % 2) * 2 + 1, + sticky=tk.W) + setattr(self, f"high_vol_{current_labels[i][1]}", label_var) + + # 冷却水压力 + ttk.Label(frame, text="冷却水压力(MPa):").grid(row=24, + column=0, + sticky=tk.W) + self.high_vol_cool_water_pressure = ttk.Label(frame, text="0.00KPa") + self.high_vol_cool_water_pressure.grid(row=24, column=1, sticky=tk.W) + + # 冷却水压力 + ttk.Label(frame, text="DC/DC温度:").grid(row=24, column=3, sticky=tk.W) + self.high_vol_dcdc_temp = ttk.Label(frame, text="0.00摄氏度") + self.high_vol_dcdc_temp.grid(row=24, column=4, sticky=tk.W) + + ttk.Label(frame, text="仪表失电信号:").grid(row=25, column=0, sticky=tk.W) + self.high_vol_losspower_insulation = ttk.Label(frame, text="正常") + self.high_vol_losspower_insulation.grid(row=25, column=1, sticky=tk.W) + + ttk.Label(frame, text="应急失电信号").grid(row=25, column=2, sticky=tk.W) + self.high_vol_loss_emerpower_insulation = ttk.Label(frame, text="正常") + self.high_vol_loss_emerpower_insulation.grid(row=25, + column=3, + sticky=tk.W) + + def setup_high_a_vol_ui(self, parent): + """设置高压A母线状态界面""" + frame = ttk.LabelFrame(parent, text="高压A母线状态") + frame.pack(fill=tk.BOTH, expand=True, padx=5, pady=5) + + # 使用网格布局管理器 + frame.grid_columnconfigure(0, weight=1) + frame.grid_columnconfigure(1, weight=1) + frame.grid_columnconfigure(2, weight=1) + + # 电压显示 - 添加详细说明 + ttk.Label(frame, text="汇流排B电压(V):").grid(row=0, column=0, sticky=tk.W) + self.high_a_vol_voltage = ttk.Label(frame, text="0.0 V") + self.high_a_vol_voltage.grid(row=0, column=1, sticky=tk.W) + + # 电流显示 - 统一格式 + ttk.Label(frame, text="汇流排B电流(A):").grid(row=1, column=0, sticky=tk.W) + self.high_a_vol_current = ttk.Label(frame, text="0.0 A") + self.high_a_vol_current.grid(row=1, column=1, sticky=tk.W) + + ttk.Label(frame, text="艏部FT设备123电流(A):").grid(row=2, + column=0, + sticky=tk.W) + self.high_a_vol_bow_ft_current = ttk.Label(frame, text="0.0 A") + self.high_a_vol_bow_ft_current.grid(row=2, column=1, sticky=tk.W) + + ttk.Label(frame, text="启闭机构电流(A):").grid(row=3, column=0, sticky=tk.W) + self.high_a_vol_actuator_current = ttk.Label(frame, text="0.0 A") + self.high_a_vol_actuator_current.grid(row=3, column=1, sticky=tk.W) + + # 补充缺失的电流显示项 + ttk.Label(frame, text="桅杆舵机控制箱电流(A):").grid(row=4, + column=0, + sticky=tk.W) + self.high_a_vol_mast_steering_current = ttk.Label(frame, text="0.0 A") + self.high_a_vol_mast_steering_current.grid(row=4, + column=1, + sticky=tk.W) + + ttk.Label(frame, text="XCZ电流(A):").grid(row=4, column=2, sticky=tk.W) + self.high_a_vol_xcz_current = ttk.Label(frame, text="0.0 A") + self.high_a_vol_xcz_current.grid(row=4, column=3, sticky=tk.W) + + ttk.Label(frame, text="艏舵控制箱电流(A):").grid(row=5, column=0, sticky=tk.W) + self.high_a_vol_bow_rudder_current = ttk.Label(frame, text="0.0 A") + self.high_a_vol_bow_rudder_current.grid(row=5, column=1, sticky=tk.W) + + ttk.Label(frame, text="敞水盖启动电缸电流(A):").grid(row=5, + column=2, + sticky=tk.W) + self.high_a_vol_open_cover_current = ttk.Label(frame, text="0.0 A") + self.high_a_vol_open_cover_current.grid(row=5, column=3, sticky=tk.W) + + # 断路器状态 - 添加详细说明 + ttk.Label(frame, text="高压A母线断路器状态:").grid(row=10, + column=0, + columnspan=4, + sticky=tk.W) + self.high_a_vol_breakers = {} + breaker_names = list( + self.status_data["high_a_vol_bus"]["breakers"].keys()) + + for i, name in enumerate(breaker_names): + ttk.Label(frame, text=f"{name}状态:").grid(row=8 + i // 2, + column=(i % 2) * 2, + sticky=tk.W) + canvas = tk.Canvas(frame, width=20, height=20, bg="white") + canvas.grid(row=8 + i // 2, column=(i % 2) * 2 + 1, sticky=tk.W) + self.high_a_vol_breakers[name] = canvas + + # 报警状态 - 更详细描述 + ttk.Label(frame, text="仪表电源失电信号:").grid(row=11, column=0, sticky=tk.W) + self.high_a_vol_instrument_power_fault = ttk.Label(frame, text="正常") + self.high_a_vol_instrument_power_fault.grid(row=11, + column=1, + sticky=tk.W) + + ttk.Label(frame, text="应急电源失电信号:").grid(row=11, column=2, sticky=tk.W) + self.high_a_vol_emergency_power_fault = ttk.Label(frame, text="正常") + self.high_a_vol_emergency_power_fault.grid(row=11, + column=3, + sticky=tk.W) + + ttk.Label(frame, text="进水报警:").grid(row=12, column=0, sticky=tk.W) + self.high_a_vol_water_alarm = ttk.Label(frame, text="无") + self.high_a_vol_water_alarm.grid(row=12, column=1, sticky=tk.W) + + def process_udp_message(self, data): + """处理接收到的UDP消息""" + try: + msg_id = int.from_bytes(data[2:4], byteorder='little') + print('----------------------------', hex(msg_id)) + if msg_id == 0x0005: # 高压母线状态 + msg = msg_disHighVolBusFbMsg() + if msg.unpack(data): + self.db.insertHighVolBusData(msg) + # self.update_high_vol_ui(bus) + bus = self.status_data["high_vol_bus"] + bus["voltage"]["动力母线电压"] = msg.powerBusVoltage / 10.0 + bus["voltage"]["A母线电压"] = msg.busbarAVoltage / 10.0 + bus["current"]["动力母线电流"] = msg.powerBusCurrent / 10.0 + bus["current"][ + "DC/DC5模块电流"] = msg.dcDc5ModuleCurrent / 10.0 + bus["current"][ + "推进电机控制箱电流"] = msg.propulsionMotorControlBoxCurrent / 10.0 + bus["current"]["A母线电流"] = msg.busbarACurrent / 10.0 + bus["current"][ + "锂电池组仪表电流"] = msg.lithiumBatteryGroupMeterCurrent / 10.0 + bus["current"][ + "艏高压配电盒电流"] = msg.bowHighVoltageDistributionBoxCurrent / 10.0 + bus["current"][ + "艉FT设备45电流"] = msg.sternFTDevice45Current / 10.0 + bus["current"][ + "TYZ备用开关电流"] = msg.tyzReservedSwitchCurrent / 10.0 + bus["current"][ + "FB备用开关电流"] = msg.sternRudderSwitch1Current / 10.0 + bus["current"]["备用电流1"] = msg.reservedCurrent1 / 10.0 + bus["current"][ + "艉舵机开关1电流"] = msg.sternRudderSwitch2Current / 10.0 + bus["current"]["备用电流2"] = msg.reservedCurrent2 / 10.0 + bus["current"][ + "艉舵机开关2电流"] = msg.fbReservedSwitchCurrent / 10.0 + bus["current"]["备用电流3"] = msg.reservedCurrent3 / 10.0 + + # bus["breakers"]["燃料电池断路器"] = 1 if msg.fuelCellCircuitBreaker == 0x55 else 0 + # bus["breakers"]["动力锂电池断路器"] = 1 if msg.powerLithiumBatteryCircuitBreaker == 0x55 else 0 + # bus["breakers"]["推进电机断路器"] = 1 if msg.propulsionMotorCircuitBreaker == 0x55 else 0 + # bus["breakers"]["锂电池组仪表断路器"] = 1 if msg.lithiumBatteryGroupInstrumentCircuitBreaker == 0x55 else 0 + # bus["breakers"]["DC/DC汇流排断路器"] = 1 if msg.dcDc5ModuleCircuitBreaker == 0x55 else 0 + # bus["breakers"]["艏部高压断路器"] = 1 if msg.bowHighVoltageDistributionBoxCircuitBreaker == 0x55 else 0 + # bus["breakers"]["艉FT设备45断路器"] = 1 if msg.sternFTDevice45CircuitBreaker == 0x55 else 0 + # bus["breakers"]["艉舵机开关1断路器"] = 1 if msg.sternRudderSwitch1CircuitBreaker == 0x55 else 0 + # bus["breakers"]["艉舵机开关2断路器"] = 1 if msg.sternRudderSwitch2CircuitBreaker == 0x55 else 0 + # bus["breakers"]["FB备用断路器"] = 1 if msg.fbReservedCircuitBreaker == 0x55 else 0 + # bus["breakers"]["TYZ备用断路器"] = 1 if msg.tyzReservedCircuitBreaker == 0x55 else 0 + # bus["breakers"]["备用断路器"] = 1 if msg.reservedCircuitBreaker == 0x55 else 0 + + bus["breakers"]["燃料电池断路器"] = msg.fuelCellCircuitBreaker + bus["breakers"][ + "动力锂电池断路器"] = msg.powerLithiumBatteryCircuitBreaker + bus["breakers"][ + "推进电机断路器"] = msg.propulsionMotorCircuitBreaker + bus["breakers"][ + "锂电池组仪表断路器"] = msg.lithiumBatteryGroupInstrumentCircuitBreaker + bus["breakers"][ + "DC/DC汇流排断路器"] = msg.dcDc5ModuleCircuitBreaker + bus["breakers"][ + "艏部高压断路器"] = msg.bowHighVoltageDistributionBoxCircuitBreaker + bus["breakers"][ + "艉FT设备45断路器"] = msg.sternFTDevice45CircuitBreaker + bus["breakers"][ + "FB备用断路器"] = msg.sternRudderSwitch1CircuitBreaker + bus["breakers"][ + "艉舵机开关1断路器"] = msg.sternRudderSwitch2CircuitBreaker + bus["breakers"]["艉舵机开关2断路器"] = msg.fbReservedCircuitBreaker + bus["breakers"]["TYZ备用断路器"] = msg.tyzReservedCircuitBreaker + bus["breakers"]["备用断路器"] = msg.reservedCircuitBreaker + + # print('----------------------------',bus["breakers"]) + + bus["faults"]["DC/DC故障1"] = msg.dcDcFaultWord1 + bus["faults"]["DC/DC故障2"] = msg.dcDcFaultWord2 + + if msg.powerBusInsulationStatus == 0x55: + bus["insulation"]["动力母线绝缘状态"] = 0 + else: + bus["insulation"]["动力母线绝缘状态"] = 1 + + if msg.aBusInsulationStatus == 0x55: + bus["insulation"]["A母线绝缘状态"] = 0 + else: + bus["insulation"]["A母线绝缘状态"] = 1 + + # if msg.meterPowerLossSignal == 0x55: + # bus["alarms"]["仪表电源丢失信号"] = 0 + # else: + # bus["alarms"]["仪表电源丢失信号"] = 1 + bus["alarms"]["应急电源丢失信号"] = msg.emergencyPowerLossSignal + bus["alarms"]["仪表电源丢失信号"] = msg.meterPowerLossSignal + # if msg.emergencyPowerLossSignal == 0x55: + # bus["alarms"]["应急电源丢失信号"] = 0 + # else: + # bus["alarms"]["应急电源丢失信号"] = 1 + bus["cool_water_pressure"] = msg.coolWaterPressure / 10.0 + bus["dcdc_temp"] = msg.dcdcTemperature - 40 + + self.status_data["high_vol_bus"] = bus + # 更新UI显示 + # print(self.status_data) + + self.log_message("收到高压母线状态更新") + elif msg_id == 0x0006: # 高压A母线状态 + msg = msg_disHighAVolBusFbMsg() + if msg.unpack(data): + self.db.insertHighAVolBusData(msg) + bus = self.status_data["high_a_vol_bus"] + bus["voltage"]["B母线电压"] = msg.busbarBVoltage / 10.0 + bus["current"]["B母线电流"] = msg.busbarBCurrent / 10.0 + bus["current"][ + "艏FT设备123电流"] = msg.bowFTDevice123Current / 10.0 + bus["current"]["执行机构电流"] = msg.actuatorCurrent / 10.0 + bus["current"][ + "桅舵机控制箱电流"] = msg.mastSteeringGearControlBoxCurrent / 10.0 + bus["current"]["XCZ电流"] = msg.xczCurrent / 10.0 + bus["current"][ + "艏舵控制箱电流"] = msg.bowRudderControlBoxCurrent / 10.0 + bus["current"][ + "开盖启动气缸电流"] = msg.openWaterCoverStartCylinderCurrent / 10.0 + + # bus["breakers"]["艏FT设备123断路器"] = 1 if msg.bowFTDevice123CircuitBreaker == 0x55 else 0 + # bus["breakers"]["启闭机构断路器"] = 1 if msg.actuatorCircuitBreaker == 0x55 else 0 + # bus["breakers"]["桅杆舵机断路器"] = 1 if msg.mastSteeringGearControlBoxCircuitBreaker == 0x55 else 0 + # bus["breakers"]["XCZ断路器"] = 1 if msg.xczCircuitBreaker == 0x55 else 0 + # bus["breakers"]["艏舵控制箱断路器"] = 1 if msg.bowRudderControlBoxCircuitBreaker == 0x55 else 0 + # bus["breakers"]["敞水盖断路器"] = 1 if msg.openWaterCoverStartCylinderCircuitBreaker == 0x55 else 0 + bus["breakers"][ + "艏FT设备123断路器"] = msg.bowFTDevice123CircuitBreaker + bus["breakers"]["启闭机构断路器"] = msg.actuatorCircuitBreaker + bus["breakers"][ + "桅杆舵机断路器"] = msg.mastSteeringGearControlBoxCircuitBreaker + bus["breakers"]["XCZ断路器"] = msg.xczCircuitBreaker + bus["breakers"][ + "艏舵控制箱断路器"] = msg.bowRudderControlBoxCircuitBreaker + bus["breakers"][ + "敞水盖断路器"] = msg.openWaterCoverStartCylinderCircuitBreaker + + bus["alarms"]["仪表电源故障"] = msg.instrumentPowerFailureSignal + bus["alarms"]["应急电源故障"] = msg.emergencyPowerFailureSignal + bus["alarms"]["进水报警"] = msg.waterIngressionAlarm + + self.log_message("收到高压A母线状态更新") + elif msg_id == 0x0007: # 仪表主母线状态 + msg = msg_disLowMainBusFbMsg() + if msg.unpack(data): + self.db.insertLowMainBusData(msg) + bus = self.status_data["low_main_bus"] + bus["voltage"][ + "仪表母线电压"] = msg.instrumentBusbarVoltage / 10.0 + bus["voltage"][ + "应急2母线电压"] = msg.emergency2BusbarVoltage / 10.0 + bus["current"][ + "艏低压配电盒电流"] = msg.bowLowVoltageDistributionBoxCurrent / 10.0 + bus["current"][ + "DC/C1仪表48V电流"] = msg.dcC1InstrumentDC48VCurrent / 10.0 + bus["current"]["备用电流1"] = msg.reservedCurrent1 / 10.0 + bus["current"][ + "应急锂电池组2电流"] = msg.emergencyLithiumBatteryGroup2Current / 10.0 + bus["current"][ + "锂电池组仪表电流"] = msg.lithiumBatteryGroupInstrumentCurrent / 10.0 + bus["current"][ + "单元4仪表48V电流"] = msg.unit4InstrumentDC48VCurrent / 10.0 + bus["current"]["备用电流2"] = msg.reservedCurrent2 / 10.0 + bus["current"][ + "综合能量管理系统应急DC48V电流"] = msg.compositeEnergyManagementSystemEmergencyDC48VCurrent / 10.0 + bus["current"][ + "燃料电池安全系统应急DC48V电流"] = msg.fuelCellSecuritySystemEmergencyDC48VCurrent / 10.0 + bus["current"][ + "PLC控制电源电流"] = msg.plcControlPowerCurrent / 10.0 + + # bus["breakers"]["锂电池组仪表断路器"] = 1 if msg.lithiumBatteryGroupInstrumentCircuitBreaker == 0x55 else 0 + # bus["breakers"]["艏部低压断路器"] = 1 if msg.bowLowVoltageDistributionBoxCircuitBreaker == 0x55 else 0 + # bus["breakers"]["单元4仪表48V断路器"] = 1 if msg.unit4InstrumentDC48VCircuitBreaker == 0x55 else 0 + # bus["breakers"]["DC/C1直流配电板断路器"] = 1 if msg.dcC1DCDistributionPanelCircuitBreaker == 0x55 else 0 + # bus["breakers"]["备用断路器1"] = 1 if msg.reservedCircuitBreaker1 == 0x55 else 0 + # bus["breakers"]["备用断路器2"] = 1 if msg.reservedCircuitBreaker2 == 0x55 else 0 + # bus["breakers"]["应急锂电池组2断路器"] = 1 if msg.emergencyLithiumBatteryGroup2CircuitBreaker == 0x55 else 0 + bus["breakers"][ + "锂电池组仪表断路器"] = msg.lithiumBatteryGroupInstrumentCircuitBreaker + bus["breakers"][ + "艏部低压断路器"] = msg.bowLowVoltageDistributionBoxCircuitBreaker + bus["breakers"][ + "单元4仪表48V断路器"] = msg.unit4InstrumentDC48VCircuitBreaker + bus["breakers"][ + "DC/C1直流配电板断路器"] = msg.dcC1DCDistributionPanelCircuitBreaker + bus["breakers"]["备用断路器1"] = msg.reservedCircuitBreaker1 + bus["breakers"]["备用断路器2"] = msg.reservedCircuitBreaker2 + bus["breakers"][ + "应急锂电池组2断路器"] = msg.emergencyLithiumBatteryGroup2CircuitBreaker + + # 0x55 正常 + # 0xaa 故障 + # if msg.instrumentPowerFailureSignal == 0x55: + # bus["alarms"]["仪表电源故障"] = 0 + # else: + # bus["alarms"]["仪表电源故障"] = 1 + bus["alarms"]["仪表电源故障"] = msg.instrumentPowerFailureSignal + # if msg.emergencyPowerFailureSignal == 0x55: + # bus["alarms"]["应急电源故障"] = 0 + # else: + # bus["alarms"]["应急电源故障"] = 1 + bus["alarms"]["应急电源故障"] = msg.emergencyPowerFailureSignal + # bus["insulation"] = msg.instrumentBusbarInsulationLow + if msg.instrumentBusbarInsulationLow == 0x55: + bus["insulation"] = 0 + else: + bus["insulation"] = 1 + bus["insulation"] = msg.instrumentBusbarInsulationLow + + self.log_message("收到仪表主母线状态更新") + else: + print("仪表主母线状态", "解析失败") + + elif msg_id == 0x0008: # 仪表母线状态 + msg = msg_disLowBusFbMsg() + if msg.unpack(data): + self.db.insertLowBusData(msg) + bus = self.status_data["low_bus"] + bus["voltage"][ + "仪表母线电压"] = msg.instrumentBusbarVoltage / 10.0 + bus["voltage"][ + "应急1母线电压"] = msg.emergency1BusbarVoltage / 10.0 + bus["current"][ + "仪表母线电流"] = msg.instrumentBusbarCurrent / 10.0 + bus["current"]["单元1电流"] = msg.unit1Current / 10.0 + bus["current"]["单元2电流"] = msg.unit2Current / 10.0 + bus["current"]["单元3电流"] = msg.unit3Current / 10.0 + bus["current"]["单元5电流"] = msg.unit5Current / 10.0 + bus["current"]["艏PZ设备电流"] = msg.bowPZDeviceCurrent / 10.0 + bus["current"][ + "应急锂电池组1电流"] = msg.emergencyLithiumBatteryGroup1Current / 10.0 + + # bus["breakers"]["单元1断路器"] = 1 if msg.unit1CircuitBreaker == 0x55 else 0 + # bus["breakers"]["单元2断路器"] = 1 if msg.unit2CircuitBreaker == 0x55 else 0 + # bus["breakers"]["单元3断路器"] = 1 if msg.unit3CircuitBreaker == 0x55 else 0 + # bus["breakers"]["单元5断路器"] = 1 if msg.unit5CircuitBreaker == 0x55 else 0 + # bus["breakers"]["艏PZ设备断路器"] = 1 if msg.bowPZDeviceCircuitBreaker == 0x55 else 0 + # bus["breakers"]["备用断路器1"] = 1 if msg.reservedCircuitBreaker1 == 0x55 else 0 + # bus["breakers"]["备用断路器2"] = 1 if msg.reservedCircuitBreaker2 == 0x55 else 0 + # bus["breakers"]["应急锂电池组1断路器"] = 1 if msg.emergencyLithiumBatteryGroup1CircuitBreaker == 0x55 else 0 + + bus["breakers"]["单元1断路器"] = msg.unit1CircuitBreaker + bus["breakers"]["单元2断路器"] = msg.unit2CircuitBreaker + bus["breakers"]["单元3断路器"] = msg.unit3CircuitBreaker + bus["breakers"]["单元5断路器"] = msg.unit5CircuitBreaker + bus["breakers"]["艏PZ设备断路器"] = msg.bowPZDeviceCircuitBreaker + bus["breakers"]["备用断路器1"] = msg.reservedCircuitBreaker1 + bus["breakers"]["备用断路器2"] = msg.reservedCircuitBreaker2 + bus["breakers"][ + "应急锂电池组1断路器"] = msg.emergencyLithiumBatteryGroup1CircuitBreaker + + bus["alarms"]["仪表电源故障"] = msg.instrumentPowerFailureSignal + bus["alarms"]["应急电源故障"] = msg.emergencyPowerFailureSignal + bus["alarms"]["进水报警"] = msg.waterIngressionAlarm + self.log_message("收到仪表母线状态更新") + else: + print("仪表母线状态", "解析失败") + + else: + self.log_message("消息解析失败") + print('消息处理完成') + + except Exception as e: + self.log_message(f"消息处理错误: {str(e)}") + + def setup_low_main_ui(self, parent): + """设置仪表主母线状态界面""" + frame = ttk.LabelFrame(parent, text="仪表主母线状态") + frame.pack(fill=tk.BOTH, expand=True, padx=2, pady=2) + + # 显式配置4列网格布局 + frame.grid_columnconfigure(0, weight=1) + frame.grid_columnconfigure(1, weight=1) + frame.grid_columnconfigure(2, weight=1) + frame.grid_columnconfigure(3, weight=1) + + # 电压显示 + ttk.Label(frame, text="仪表母线电压(V):").grid(row=0, column=0, sticky=tk.W) + self.low_main_instrument_voltage = ttk.Label(frame, text="0.0") + self.low_main_instrument_voltage.grid(row=0, column=1, sticky=tk.W) + + ttk.Label(frame, text="应急2汇流排电压(V):").grid(row=0, + column=2, + sticky=tk.W) + self.low_main_emergency2_voltage = ttk.Label(frame, text="0.0") + self.low_main_emergency2_voltage.grid(row=0, column=3, sticky=tk.W) + + # 电流显示 + ttk.Label(frame, text="艏部低压配电箱电流(A):").grid(row=1, + column=0, + sticky=tk.W) + self.low_main_bow_current = ttk.Label(frame, text="0.0") + self.low_main_bow_current.grid(row=1, column=1, sticky=tk.W) + + ttk.Label(frame, text="锂电池组(仪表)电流(A):").grid(row=1, + column=2, + sticky=tk.W) + self.low_main_battery_current = ttk.Label(frame, text="0.0") + self.low_main_battery_current.grid(row=1, column=3, sticky=tk.W) + + # 补充其他电流显示项 + ttk.Label(frame, text="DC-C1(直流配电板1)仪表DC48V电流(A):").grid(row=2, + column=0, + sticky=tk.W) + self.low_main_dcc1_current = ttk.Label(frame, text="0.0") + self.low_main_dcc1_current.grid(row=2, column=1, sticky=tk.W) + + ttk.Label(frame, text="应急锂电池组2电流(A):").grid(row=2, + column=2, + sticky=tk.W) + self.low_main_emergency2_current = ttk.Label(frame, text="0.0") + self.low_main_emergency2_current.grid(row=2, column=3, sticky=tk.W) + + ttk.Label(frame, text="单元4仪表48V电流(A):").grid(row=3, + column=0, + sticky=tk.W) + self.low_main_unit4_current = ttk.Label(frame, text="0.0") + self.low_main_unit4_current.grid(row=3, column=1, sticky=tk.W) + + ttk.Label(frame, text="复合能源管控系统应急DC48V电流(A):").grid(row=3, + column=2, + sticky=tk.W) + self.low_main_energy_current = ttk.Label(frame, text="0.0") + self.low_main_energy_current.grid(row=3, column=3, sticky=tk.W) + + ttk.Label(frame, text="燃料电池安保系统应急DC48V电流(A):").grid(row=4, + column=0, + sticky=tk.W) + self.low_main_fuelcell_current = ttk.Label(frame, text="0.0") + self.low_main_fuelcell_current.grid(row=4, column=1, sticky=tk.W) + + ttk.Label(frame, text="PLC控制电源电流(A):").grid(row=4, + column=2, + sticky=tk.W) + self.low_main_plc_current = ttk.Label(frame, text="0.0") + self.low_main_plc_current.grid(row=4, column=3, sticky=tk.W) + + # 断路器状态 + ttk.Label(frame, text="断路器状态:").grid(row=5, + column=0, + columnspan=4, + sticky=tk.W) + self.low_main_breakers = {} + breaker_names = list( + self.status_data["low_main_bus"]["breakers"].keys()) + + # 断路器状态 - 调整为每行3个断路器,从行6开始 + for i, name in enumerate(breaker_names): + row = 6 + i // 3 + col = (i % 3) * 2 + ttk.Label(frame, text=name).grid(row=row, column=col, sticky=tk.W) + canvas = tk.Canvas(frame, width=20, height=20, bg="white") + canvas.grid(row=row, column=col + 1, sticky=tk.W) + self.low_main_breakers[name] = canvas + + # 报警状态 + ttk.Label(frame, text="仪表电源失电信号 :").grid(row=9, column=0, sticky=tk.W) + self.low_main_instrument_fault = ttk.Label(frame, text="无") + self.low_main_instrument_fault.grid(row=9, column=1, sticky=tk.W) + + ttk.Label(frame, text="应急电源失电信号 :").grid(row=9, column=2, sticky=tk.W) + self.low_main_emergency_fault = ttk.Label(frame, text="无") + self.low_main_emergency_fault.grid(row=9, column=3, sticky=tk.W) + + # 绝缘状态 + ttk.Label(frame, text="仪表汇流排绝缘低 :").grid(row=10, column=0, sticky=tk.W) + self.low_main_insulation = ttk.Label(frame, text="正常") + self.low_main_insulation.grid(row=10, column=1, sticky=tk.W) + + # 备用电流 + ttk.Label(frame, text="备用电流1 :").grid(row=11, column=0, sticky=tk.W) + self.low_main_reserved1 = ttk.Label(frame, text="0.0") + self.low_main_reserved1.grid(row=11, column=1, sticky=tk.W) + + ttk.Label(frame, text="备用电流2 :").grid(row=11, column=2, sticky=tk.W) + self.low_main_reserved2 = ttk.Label(frame, text="0.0") + self.low_main_reserved2.grid(row=11, column=3, sticky=tk.W) + + return frame + + def setup_low_bus_ui(self, parent): + """设置仪表母线状态界面""" + frame = ttk.LabelFrame(parent, text="仪表母线状态") + frame.pack(fill=tk.BOTH, expand=True, padx=2, pady=2) + + # 显式配置4列网格布局 + frame.grid_columnconfigure(0, weight=1) + frame.grid_columnconfigure(1, weight=1) + frame.grid_columnconfigure(2, weight=1) + frame.grid_columnconfigure(3, weight=1) + + # 电压显示 + ttk.Label(frame, text="仪表母排电压(V):").grid(row=0, column=0, sticky=tk.W) + self.low_bus_instrument_voltage = ttk.Label(frame, text="0.0") + self.low_bus_instrument_voltage.grid(row=0, column=1, sticky=tk.W) + + ttk.Label(frame, text="应急1母线电压(V):").grid(row=0, column=2, sticky=tk.W) + self.low_bus_emergency1_voltage = ttk.Label(frame, text="0.0") + self.low_bus_emergency1_voltage.grid(row=0, column=3, sticky=tk.W) + + # 电流显示 + ttk.Label(frame, text="单元1电流(A):").grid(row=1, column=0, sticky=tk.W) + self.low_bus_unit1_current = ttk.Label(frame, text="0.0") + self.low_bus_unit1_current.grid(row=1, column=1, sticky=tk.W) + + ttk.Label(frame, text="单元2电流(A):").grid(row=1, column=2, sticky=tk.W) + self.low_bus_unit2_current = ttk.Label(frame, text="0.0") + self.low_bus_unit2_current.grid(row=1, column=3, sticky=tk.W) + + ttk.Label(frame, text="仪表母排电流(A):").grid(row=2, column=0, sticky=tk.W) + self.low_bus_main_current = ttk.Label(frame, text="0.0") + self.low_bus_main_current.grid(row=2, column=1, sticky=tk.W) + + ttk.Label(frame, text="单元3电流(A):").grid(row=2, column=2, sticky=tk.W) + self.low_bus_unit3_current = ttk.Label(frame, text="0.0") + self.low_bus_unit3_current.grid(row=2, column=3, sticky=tk.W) + + ttk.Label(frame, text="单元5电流(A):").grid(row=3, column=0, sticky=tk.W) + self.low_bus_unit5_current = ttk.Label(frame, text="0.0") + self.low_bus_unit5_current.grid(row=3, column=1, sticky=tk.W) + + ttk.Label(frame, text="艏PZ设备电流(A):").grid(row=3, column=2, sticky=tk.W) + self.low_bus_bow_pz_current = ttk.Label(frame, text="0.0") + self.low_bus_bow_pz_current.grid(row=3, column=3, sticky=tk.W) + + ttk.Label(frame, text="应急锂电池组1电流(A):").grid(row=4, + column=0, + sticky=tk.W) + self.low_bus_emergency1_current = ttk.Label(frame, text="0.0") + self.low_bus_emergency1_current.grid(row=4, column=1, sticky=tk.W) + + # 断路器状态 + ttk.Label(frame, text="断路器状态:").grid(row=5, + column=0, + columnspan=4, + sticky=tk.W) + self.low_bus_breakers = {} + breaker_names = list(self.status_data["low_bus"]["breakers"].keys()) + + for i, name in enumerate(breaker_names): + row = 6 + i // 2 + col = (i % 2) * 2 + ttk.Label(frame, text=name).grid(row=row, column=col, sticky=tk.W) + canvas = tk.Canvas(frame, width=20, height=20, bg="white") + canvas.grid(row=row, column=col + 1, sticky=tk.W) + self.low_bus_breakers[name] = canvas + + # 报警状态 + ttk.Label(frame, text="仪表电失电信号 :").grid(row=10, column=0, sticky=tk.W) + self.low_bus_power_fault = ttk.Label(frame, text="无") + self.low_bus_power_fault.grid(row=10, column=1, sticky=tk.W) + + ttk.Label(frame, text="应急电失电信号 :").grid(row=11, column=0, sticky=tk.W) + self.low_bus_emgpower_fault = ttk.Label(frame, text="无") + self.low_bus_emgpower_fault.grid(row=11, column=1, sticky=tk.W) + + ttk.Label(frame, text="浸水报警 :").grid(row=10, column=2, sticky=tk.W) + self.low_bus_water_alarm = ttk.Label(frame, text="无") + self.low_bus_water_alarm.grid(row=10, column=3, sticky=tk.W) + + return frame + + def send_udp_command(self, data, ip, port): + """发送UDP命令""" + try: + # self.sock.sendto(data, (self.udp_ip, self.udp_port + 1)) + self.sock.sendto(data, (ip, port)) + print(f"发送命令到 {ip}:{port} ", data) + except Exception as e: + self.log_message(f"发送命令失败: {str(e)}") + + def update_high_vol_ui(self, status): + """更新高压母线UI显示""" + # 更新电压显示 + self.high_vol_power_voltage.config( + text=f"{status['voltage']['动力母线电压']:.1f} V") + self.high_vol_a_voltage.config( + text=f"{status['voltage']['A母线电压']:.1f} V") + + # # 更新电流显示 + # self.high_vol_power_current.config(text=f"{status['current']['动力母线电流']:.1f}") + # self.high_vol_a_current.config(text=f"{status['current']['A母线电流']:.1f}") + + # 更新所有电流值 + current_vars = [('powerBusCurrent', '动力母线电流'), + ('busbarACurrent', 'A母线电流'), + ('dcDc5ModuleCurrent', 'DC/DC5模块电流'), + ('propulsionMotorControlBoxCurrent', '推进电机控制箱电流'), + ('lithiumBatteryGroupMeterCurrent', '锂电池组仪表电流'), + ('bowHighVoltageDistributionBoxCurrent', '艏高压配电盒电流'), + ('sternFTDevice45Current', '艉FT设备45电流'), + ('tyzReservedSwitchCurrent', 'TYZ备用开关电流'), + ('fbReservedSwitchCurrent', '艉舵机开关2电流'), + ('sternRudderSwitch1Current', 'FB备用开关电流'), + ('sternRudderSwitch2Current', '艉舵机开关1电流'), + ('reservedCurrent1', '备用电流1'), + ('reservedCurrent2', '备用电流2'), + ('reservedCurrent3', '备用电流3')] + + for var_name, data_key in current_vars: + label = getattr(self, f"high_vol_{var_name}") + label.config(text=f"{status['current'][data_key]:.1f} A") + + # 更新断路器状态 + for name, state in status['breakers'].items(): + if name in self.high_vol_breakers: + canvas = self.high_vol_breakers[name] + # color = 'green' if state else 'red' + # print(name, hex(state)) + if state == 0x55: + color = "yellow" + elif state == 0xAA: + color = "black" + elif state == 0x5A: + color = "red" + else: + color = "white" + canvas.delete("all") + canvas.create_oval(2, 2, 18, 18, fill=color, outline="black") + + # 更新DC/DC故障状态 + dcdc_fault1 = status['faults']['DC/DC故障1'] + dcdc_fault2 = status['faults']['DC/DC故障2'] + + for i in range(8): + color1 = 'red' if (dcdc_fault1 & (1 << i)) else 'green' + color2 = 'red' if (dcdc_fault2 & (1 << i)) else 'green' + self.high_vol_dcdc_fault1_bits[i].config(bg=color1) + self.high_vol_dcdc_fault2_bits[i].config(bg=color2) + + # 更新绝缘状态 + insulation_power = status['insulation']['动力母线绝缘状态'] + insulation_a = status['insulation']['A母线绝缘状态'] + + power_text = "故障" if insulation_power else f"正常" + a_text = "故障" if insulation_a else f"正常" + + self.high_vol_power_insulation.config(text=power_text) + self.high_vol_a_insulation.config(text=a_text) + + # 更新冷却水压力 + self.high_vol_cool_water_pressure.config( + text=f"{status['cool_water_pressure']:.1f} Kpa") + + # # 更新温度状态 + self.high_vol_dcdc_temp.config(text=f"{status['dcdc_temp']} 摄氏度") + # "仪表电源丢失信号": 0, + # "应急电源丢失信号": 0 + # 更新失电故障显示 + self.high_vol_losspower_insulation.config( + text="正常" if status['alarms']['仪表电源丢失信号'] == 0x55 else "故障") + self.high_vol_loss_emerpower_insulation.config( + text="正常" if status['alarms']['应急电源丢失信号'] == 0x55 else "故障") + + def update_ui(self): + """更新界面状态""" + # 更新高压母线状态 + high_vol = self.status_data["high_vol_bus"] + self.update_high_vol_ui(high_vol) + # 更新高压A母线状态 + high_a_vol = self.status_data["high_a_vol_bus"] + self.high_a_vol_voltage.config( + text=f"{high_a_vol['voltage']['B母线电压']:.1f} V") + self.high_a_vol_current.config( + text=f"{high_a_vol['current']['B母线电流']:.1f} A") + self.high_a_vol_bow_ft_current.config( + text=f"{high_a_vol['current']['艏FT设备123电流']:.1f} A") + self.high_a_vol_actuator_current.config( + text=f"{high_a_vol['current']['执行机构电流']:.1f} A") + + # 更新新增的电流显示项 + self.high_a_vol_mast_steering_current.config( + text=f"{high_a_vol['current']['桅舵机控制箱电流']:.1f} A") + self.high_a_vol_xcz_current.config( + text=f"{high_a_vol['current']['XCZ电流']:.1f} A") + self.high_a_vol_bow_rudder_current.config( + text=f"{high_a_vol['current']['艏舵控制箱电流']:.1f} A") + self.high_a_vol_open_cover_current.config( + text=f"{high_a_vol['current']['开盖启动气缸电流']:.1f} A") + + for name, canvas in self.high_a_vol_breakers.items(): + state = high_a_vol["breakers"].get(name, 0) + if state == 0x55: + color = "yellow" + elif state == 0xAA: + color = "black" + elif state == 0x5A: + color = "red" + else: + color = "white" + # color = "green" if state else "red" + canvas.create_oval(2, 2, 18, 18, fill=color, outline="black") + + # 更新仪表主母线状态 + low_main = self.status_data["low_main_bus"] + for name, canvas in self.low_main_breakers.items(): + state = low_main["breakers"].get(name, 0) + # color = "green" if state else "red" + if state == 0x55: + color = "yellow" + elif state == 0xAA: + color = "black" + elif state == 0x5A: + color = "red" + else: + color = "white" + canvas.create_oval(2, 2, 18, 18, fill=color, outline="black") + + # 更新仪表母线状态 + low_bus = self.status_data["low_bus"] + for name, canvas in self.low_bus_breakers.items(): + state = low_bus["breakers"].get(name, 0) + # color = "green" if state else "red" + if state == 0x55: + color = "yellow" + elif state == 0xAA: + color = "black" + elif state == 0x5A: + color = "red" + else: + color = "white" + canvas.create_oval(2, 2, 18, 18, fill=color, outline="black") + + self.high_a_vol_instrument_power_fault.config( + text="正常" if high_a_vol["alarms"]["仪表电源故障"] == 0x55 else "故障") + self.high_a_vol_emergency_power_fault.config( + text="正常" if high_a_vol["alarms"]["应急电源故障"] == 0x55 else "故障") + self.high_a_vol_water_alarm.config( + text="正常" if high_a_vol["alarms"]["进水报警"] == 0x55 else "故障") + + # 更新仪表主母线状态 + low_main = self.status_data["low_main_bus"] + self.low_main_instrument_voltage.config( + text=f"{low_main['voltage']['仪表母线电压']:.1f} V") + self.low_main_emergency2_voltage.config( + text=f"{low_main['voltage']['应急2母线电压']:.1f} V") + self.low_main_bow_current.config( + text=f"{low_main['current']['艏低压配电盒电流']:.1f} A") + self.low_main_battery_current.config( + text=f"{low_main['current']['锂电池组仪表电流']:.1f} A") + + # 更新新增的电流显示项 + self.low_main_dcc1_current.config( + text=f"{low_main['current']['DC/C1仪表48V电流']:.1f} A") + self.low_main_emergency2_current.config( + text=f"{low_main['current']['应急锂电池组2电流']:.1f} A") + self.low_main_unit4_current.config( + text=f"{low_main['current']['单元4仪表48V电流']:.1f} A") + self.low_main_energy_current.config( + text=f"{low_main['current']['综合能量管理系统应急DC48V电流']:.1f} A") + self.low_main_fuelcell_current.config( + text=f"{low_main['current']['燃料电池安全系统应急DC48V电流']:.1f} A") + self.low_main_plc_current.config( + text=f"{low_main['current']['PLC控制电源电流']:.1f} A") + # 新增加备用电流 + self.low_main_reserved1.config( + text=f"{low_main['current']['备用电流1']:.1f} A") + self.low_main_reserved2.config( + text=f"{low_main['current']['备用电流2']:.1f} A") + + for name, canvas in self.low_main_breakers.items(): + state = low_main["breakers"].get(name, 0) + # color = "green" if state else "red" + if state == 0x55: + color = "yellow" + elif state == 0xAA: + color = "black" + elif state == 0x5A: + color = "red" + else: + color = "white" + canvas.create_oval(2, 2, 18, 18, fill=color, outline="black") + + self.low_main_instrument_fault.config( + text="正常" if low_main["alarms"]["仪表电源故障"] == 0x55 else "故障") + self.low_main_emergency_fault.config( + text="正常" if low_main["alarms"]["应急电源故障"] == 0x55 else "故障") + self.low_main_insulation.config( + text="正常" if low_main["insulation"] == 0x55 else "故障") + + # 更新仪表母线状态 + low_bus = self.status_data["low_bus"] + self.low_bus_instrument_voltage.config( + text=f"{low_bus['voltage']['仪表母线电压']:.1f} V") + self.low_bus_emergency1_voltage.config( + text=f"{low_bus['voltage']['应急1母线电压']:.1f} V") + self.low_bus_unit1_current.config( + text=f"{low_bus['current']['单元1电流']:.1f} A") + self.low_bus_unit2_current.config( + text=f"{low_bus['current']['单元2电流']:.1f} A") + + # 更新新增的电流显示项 + self.low_bus_main_current.config( + text=f"{low_bus['current']['仪表母线电流']:.1f} A") + self.low_bus_unit3_current.config( + text=f"{low_bus['current']['单元3电流']:.1f} A") + self.low_bus_unit5_current.config( + text=f"{low_bus['current']['单元5电流']:.1f} A") + self.low_bus_bow_pz_current.config( + text=f"{low_bus['current']['艏PZ设备电流']:.1f} A") + self.low_bus_emergency1_current.config( + text=f"{low_bus['current']['应急锂电池组1电流']:.1f} A") + + for name, canvas in self.low_bus_breakers.items(): + state = low_bus["breakers"].get(name, 0) + # color = "green" if state else "red" + if state == 0x55: + color = "yellow" + elif state == 0xAA: + color = "black" + elif state == 0x5A: + color = "red" + else: + color = "white" + canvas.create_oval(2, 2, 18, 18, fill=color, outline="black") + + self.low_bus_power_fault.config( + text="正常" if low_bus["alarms"]["仪表电源故障"] == 0x55 else "故障") + self.low_bus_emgpower_fault.config( + text="正常" if low_bus["alarms"]["应急电源故障"] == 0x55 else "故障") + self.low_bus_water_alarm.config( + text="正常" if low_bus["alarms"]["进水报警"] == 0x55 else "故障") + # print('update_ui') + # 每500ms更新一次 + self.root.after(1000, self.update_ui) + + def log_message(self, message): + """记录日志消息""" + timestamp = time.strftime("%Y-%m-%d %H:%M:%S") + self.log_text.config(state=tk.NORMAL) + self.log_text.insert(tk.END, f"[{timestamp}] {message}\n") + + # 获取当前所有行数 + line_count = int(self.log_text.index('end-1c').split('.')[0]) + # 如果超过50行,删除最旧的行 + if line_count > 50: + self.log_text.delete(1.0, 2.0) + + self.log_text.config(state=tk.DISABLED) + self.log_text.see(tk.END) + + def on_closing(self): + """窗口关闭事件处理""" + self.running = False + self.sock.close() + self.root.destroy() + + +if __name__ == "__main__": + root = tk.Tk() + app = PowerManagerApp(root) + + root.protocol("WM_DELETE_WINDOW", app.on_closing) + print('start') + root.mainloop() + print('end') diff --git a/test/until/DriverTest.cpp b/test/until/DriverTest.cpp index cf330d8..d461672 100644 --- a/test/until/DriverTest.cpp +++ b/test/until/DriverTest.cpp @@ -2,6 +2,13 @@ // DriverTest: Driver 类的设备表生成(覆盖全部 10 个工况)、设备状态读写、 // JSON 序列化/反序列化。 // 不改动生产代码;仅链接 src/pPowerManger/driver.cpp。 +// +// 测试目的: +// 1. 验证每种工况模式下,驱动表生成是否符合预期的设备开关状态 +// 2. 验证设备状态的读写操作(setDeviceState / getDeviceState) +// 3. 验证驱动表的 JSON 序列化/反序列化是否能正确往返 +// 4. 验证 JSON 解析为设备命令的逻辑 +// 5. 验证安全读取无符号整数的边界处理 //======================================================================= #include #include @@ -10,6 +17,7 @@ // ---------------------------------------------------------------------- // 全字段比较宏(62 个设备字段) +// 用于比较两个 DriverTable 结构体的所有字段是否完全相等 // ---------------------------------------------------------------------- #define EXPECT_TABLE_EQ(a, b) do { \ EXPECT_EQ((a).depth1,(b).depth1); EXPECT_EQ((a).depth2,(b).depth2); \