From 002df307d7584db4ccd1b5eae7e847c8ce5d6f5f Mon Sep 17 00:00:00 2001 From: zhaojingkui <1553836110@qq.com> Date: Sun, 6 Apr 2025 21:42:55 +0800 Subject: [PATCH 1/9] =?UTF-8?q?=E4=BD=BF=E7=94=A8tinyfsm?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/pPowerManger/PowerManager.h | 0 src/pPowerManger/PowerManagerFsm.hpp | 53 +++++++++++++--------------- 2 files changed, 24 insertions(+), 29 deletions(-) create mode 100644 src/pPowerManger/PowerManager.h diff --git a/src/pPowerManger/PowerManager.h b/src/pPowerManger/PowerManager.h new file mode 100644 index 0000000..e69de29 diff --git a/src/pPowerManger/PowerManagerFsm.hpp b/src/pPowerManger/PowerManagerFsm.hpp index 5986ee0..024a236 100644 --- a/src/pPowerManger/PowerManagerFsm.hpp +++ b/src/pPowerManger/PowerManagerFsm.hpp @@ -1,15 +1,15 @@ #ifndef POWER_MANAGER_FSM_HPP #define POWER_MANAGER_FSM_HPP +#include "PowerManger.h" #include "tinyfsm.hpp" -// 前向声明 -class PowerManger; + // 定义事件类型 struct InitEvent : tinyfsm::Event { }; struct StandbyEvent : tinyfsm::Event { }; -struct FaultEvent : tinyfsm::Event { +struct FaultEvent : tinyfsm::Event { unsigned int faultCode; FaultEvent(unsigned int code) : faultCode(code) {} }; @@ -17,19 +17,14 @@ struct FaultEvent : tinyfsm::Event { // 定义状态机基类 class PowerManagerFsm : public tinyfsm::Fsm { protected: - static void* pm; + static PowerManger* pm; public: // 初始化状态机 - static void init(void* powerManager) { + static void init(PowerManger* powerManager) { pm = powerManager; } - // 类型安全转换接口 - static PowerManger* getPowerManager() { - return static_cast(pm); - } - // 响应事件默认实现 virtual void react(tinyfsm::Event const &) { } @@ -40,23 +35,23 @@ public: }; // 初始化静态成员 -void* PowerManagerFsm::pm = nullptr; +PowerManger* PowerManagerFsm::pm = nullptr; // 定义状态类 class InitState : public PowerManagerFsm { public: void entry() { - PowerManagerFsm::getPowerManager()->m_pmEvent = "初始化状态"; - PowerManagerFsm::getPowerManager()->printState("InitState", "进入初始化状态"); + PowerManagerFsm::pm->m_pmEvent = "初始化状态"; // 保持正确类名 + PowerManagerFsm::pm->printState("InitState", "进入初始化状态"); } void react(InitEvent const &) { // 1. 检查通信是否正常 - double StartTime = PowerManagerFsm::getPowerManager()->GetAppStartTime(); - while (PowerManagerFsm::getPowerManager()->connectState < 5) { + double StartTime = PowerManagerFsm::pm->GetAppStartTime(); + while (PowerManagerFsm::pm->connectState < 5) { MOOSPause(1000); - PowerManagerFsm::getPowerManager()->updateTime(); - double dft = abs(PowerManagerFsm::getPowerManager()->m_current_time - StartTime); + PowerManagerFsm::pm->updateTime(); + double dft = abs(PowerManagerFsm::pm->m_current_time - StartTime); if(dft > 10) { transit(); PowerManagerFsm::pm->m_faultNum = 1; @@ -67,9 +62,9 @@ public: } // 2. 检查复合管控器是否上报故障 - if(PowerManagerFsm::getPowerManager()->checkError() < 0) { + if(PowerManagerFsm::pm->checkError() < 0) { transit(); - PowerManagerFsm::getPowerManager()->m_faultNum = 2; + PowerManagerFsm::pm->m_faultNum = 2; return; } @@ -78,17 +73,17 @@ public: // 4. 判断关键断路器是否闭合 while (true) { - if(PowerManagerFsm::getPowerManager()->m_currentDisBreakerState.bus3Breaker.unit4InstrumentDC48VCircuitBreaker == 1 || - PowerManagerFsm::getPowerManager()->m_currentDisBreakerState.bus4Breaker.unit5CircuitBreaker == 1 || - PowerManagerFsm::getPowerManager()->m_currentDisBreakerState.bus4Breaker.unit2CircuitBreaker == 1 || - PowerManagerFsm::getPowerManager()->m_currentDisBreakerState.bus4Breaker.unit3CircuitBreaker == 1 || - PowerManagerFsm::getPowerManager()->m_currentDisBreakerState.bus4Breaker.unit1CircuitBreaker == 1) { + if(PowerManagerFsm::pm->m_currentDisBreakerState.bus3Breaker.unit4InstrumentDC48VCircuitBreaker == 1 || + PowerManagerFsm::pm->m_currentDisBreakerState.bus4Breaker.unit5CircuitBreaker == 1 || + PowerManagerFsm::pm->m_currentDisBreakerState.bus4Breaker.unit2CircuitBreaker == 1 || + PowerManagerFsm::pm->m_currentDisBreakerState.bus4Breaker.unit3CircuitBreaker == 1 || + PowerManagerFsm::pm->m_currentDisBreakerState.bus4Breaker.unit1CircuitBreaker == 1) { transit(); return; } - PowerManagerFsm::getPowerManager()->m_pmEvent = "等待关键断路器闭合"; + PowerManagerFsm::pm->m_pmEvent = "等待关键断路器闭合"; MOOSPause(1000); - PowerManagerFsm::getPowerManager()->printState("InitState", PowerManagerFsm::getPowerManager()->m_pmEvent); + PowerManagerFsm::pm->printState("InitState", PowerManagerFsm::pm->m_pmEvent); } } }; @@ -96,8 +91,8 @@ public: class StandbyState : public PowerManagerFsm { public: void entry() { - PowerManagerFsm::getPowerManager()->m_stateData.note = "待机状态"; - PowerManagerFsm::getPowerManager()->printState("StandbyState", "进入待机状态"); + PowerManagerFsm::pm->m_stateData.note = "待机状态"; + PowerManagerFsm::pm->printState("StandbyState", "进入待机状态"); } void react(StandbyEvent const &) { @@ -134,7 +129,7 @@ private: class FaultState : public PowerManagerFsm { public: void entry() { - PowerManagerFsm::getPowerManager()->printState("FaultState", "进入故障状态"); + PowerManagerFsm::pm->printState("FaultState", "进入故障状态"); } void react(FaultEvent const & e) { From ebf1701335911413283b4cb8ff3c262150219d61 Mon Sep 17 00:00:00 2001 From: zhaojingkui <1553836110@qq.com> Date: Sun, 6 Apr 2025 23:51:03 +0800 Subject: [PATCH 2/9] =?UTF-8?q?=E4=BD=BF=E7=94=A8tinyfsm=E4=BC=98=E5=8C=96?= =?UTF-8?q?=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bin/pPowerManger.moos | 5 +- src/pPowerManger/CMakeLists.txt | 2 +- src/pPowerManger/PowerManager.h | 0 src/pPowerManger/PowerManagerFsm.cpp | 110 ++++++++++++++++++++---- src/pPowerManger/PowerManagerFsm.hpp | 122 ++++----------------------- src/pPowerManger/PowerManger.cpp | 57 +++++++------ src/pPowerManger/PowerManger.h | 34 ++++---- src/pPowerManger/fsm.cpp | 103 ---------------------- src/pPowerManger/fsm.h | 46 ---------- 9 files changed, 158 insertions(+), 321 deletions(-) delete mode 100644 src/pPowerManger/PowerManager.h delete mode 100644 src/pPowerManger/fsm.cpp delete mode 100644 src/pPowerManger/fsm.h diff --git a/bin/pPowerManger.moos b/bin/pPowerManger.moos index b68ca3e..3fe4061 100644 --- a/bin/pPowerManger.moos +++ b/bin/pPowerManger.moos @@ -1,8 +1,5 @@ -//------------------------------------------------ -// pPowerManger config block - ProcessConfig = pPowerManger { - AppTick = 5 + AppTick = 4 CommsTick = 4 } \ No newline at end of file diff --git a/src/pPowerManger/CMakeLists.txt b/src/pPowerManger/CMakeLists.txt index 506c265..350888f 100644 --- a/src/pPowerManger/CMakeLists.txt +++ b/src/pPowerManger/CMakeLists.txt @@ -19,13 +19,13 @@ endif (${WIN32}) find_package(SQLite3 REQUIRED) SET(SRC + PowerManagerFsm.cpp PowerManger.cpp PowerManger_Info.cpp udpComm.cpp main.cpp SQLiteDB.cpp driver.cpp - PowerManagerFsm.cpp ) ADD_EXECUTABLE(pPowerManger ${SRC}) diff --git a/src/pPowerManger/PowerManager.h b/src/pPowerManger/PowerManager.h deleted file mode 100644 index e69de29..0000000 diff --git a/src/pPowerManger/PowerManagerFsm.cpp b/src/pPowerManger/PowerManagerFsm.cpp index e351e5f..50cd2d7 100644 --- a/src/pPowerManger/PowerManagerFsm.cpp +++ b/src/pPowerManger/PowerManagerFsm.cpp @@ -1,29 +1,103 @@ #include "PowerManagerFsm.hpp" #include "PowerManger.h" +#include +#include "MOOS/libMOOS/Utils/MOOSUtilityFunctions.h" -// 初始化静态成员 +// 定义静态成员 PowerManger* PowerManagerFsm::pm = nullptr; -// 状态实例化 -InitState initState; -StandbyState standbyState; -FaultState faultState; - -// 状态机初始化 -void PowerManagerFsm::init(PowerManger* powerManager) { - pm = powerManager; - start(); +// InitState实现 +void InitState::entry() { + // PowerManagerFsm::pm->m_pmEvent = "初始化状态"; + PowerManagerFsm::pm->printState("InitState", "进入初始化状态"); } -// 状态转换接口实现 -void PowerManagerFsm::triggerInitEvent() { - dispatch(InitEvent()); +void InitState::react(InitEvent const &) { + // double StartTime = PowerManagerFsm::pm->GetAppStartTime(); + double StartTime = 0; + while (PowerManagerFsm::pm->connectState < 5) { + MOOSPause(1000); + PowerManagerFsm::pm->updateTime(); + double dft = abs(PowerManagerFsm::pm->m_current_time - StartTime); + if(dft > 10) { + transit(); + PowerManagerFsm::pm->m_faultNum = 1; + return; + } + string desp = "等待复合管控消息 : " + to_string(10-dft); + PowerManagerFsm::pm->printState("InitState", desp); + } + + if(PowerManagerFsm::pm->checkError() < 0) { + transit(); + PowerManagerFsm::pm->m_faultNum = 2; + return; + } + + PowerManagerFsm::pm->initControlCmd(); + + while (true) { + if(PowerManagerFsm::pm->m_currentDisBreakerState.bus3Breaker.unit4InstrumentDC48VCircuitBreaker == 1 || + PowerManagerFsm::pm->m_currentDisBreakerState.bus4Breaker.unit5CircuitBreaker == 1 || + PowerManagerFsm::pm->m_currentDisBreakerState.bus4Breaker.unit2CircuitBreaker == 1 || + PowerManagerFsm::pm->m_currentDisBreakerState.bus4Breaker.unit3CircuitBreaker == 1 || + PowerManagerFsm::pm->m_currentDisBreakerState.bus4Breaker.unit1CircuitBreaker == 1) { + transit(); + return; + } + PowerManagerFsm::pm->m_pmEvent = "等待关键断路器闭合"; + MOOSPause(1000); + PowerManagerFsm::pm->printState("InitState", PowerManagerFsm::pm->m_pmEvent); + } } -void PowerManagerFsm::triggerStandbyEvent() { - dispatch(StandbyEvent()); +// StandbyState实现 +void StandbyState::entry() { + PowerManagerFsm::pm->printState("StandbyState", "进入待机状态"); } -void PowerManagerFsm::triggerFaultEvent(unsigned int faultCode) { - dispatch(FaultEvent(faultCode)); -} \ No newline at end of file +void StandbyState::react(StandbyEvent const &) { + while (true) { + if(PowerManagerFsm::pm->checkError() < 0) { + transit(); + return; + } + handlePowerCommands(); + MOOSPause(1000); + } +} + +void StandbyState::handlePowerCommands() { + switch (PowerManagerFsm::pm->m_msCmd.powerCMD) { + case 0: PowerManagerFsm::pm->m_pmEvent = "收到上位机控制指令:关机"; break; + case 1: handlePowerOn(); break; + } +} + +void StandbyState::handlePowerOn() { + PowerManagerFsm::pm->m_pmEvent = "动力电上电"; + PowerManagerFsm::pm->m_CcuColCmd.powerBatCmd = 0x10; + if(PowerManagerFsm::pm->m_pmCurrentState.ccustate.fcuState == 0x04) + PowerManagerFsm::pm->m_CcuColCmd.fcuCmd = 0x02; +} + +// FaultState实现 +void FaultState::entry() { + PowerManagerFsm::pm->printState("FaultState", "进入故障状态"); +} + +void FaultState::react(FaultEvent const & e) { + switch (e.faultCode) { + case 1: + PowerManagerFsm::pm->m_pmEvent = "复合管控连接超时"; + PowerManagerFsm::pm->printState("FaultState", "通信故障"); + break; + case 2: + PowerManagerFsm::pm->m_pmEvent = "能源系统故障"; + PowerManagerFsm::pm->printState("FaultState", "能源故障"); + break; + } +} + +// 设置初始状态 +FSM_INITIAL_STATE(PowerManagerFsm, InitState); \ No newline at end of file diff --git a/src/pPowerManger/PowerManagerFsm.hpp b/src/pPowerManger/PowerManagerFsm.hpp index 024a236..eeeacc7 100644 --- a/src/pPowerManger/PowerManagerFsm.hpp +++ b/src/pPowerManger/PowerManagerFsm.hpp @@ -1,10 +1,10 @@ #ifndef POWER_MANAGER_FSM_HPP #define POWER_MANAGER_FSM_HPP - -#include "PowerManger.h" #include "tinyfsm.hpp" +#include - +// 前向声明 +class PowerManger; // 定义事件类型 struct InitEvent : tinyfsm::Event { }; @@ -15,7 +15,7 @@ struct FaultEvent : tinyfsm::Event { }; // 定义状态机基类 -class PowerManagerFsm : public tinyfsm::Fsm { +class PowerManagerFsm : public tinyfsm::MooreMachine { protected: static PowerManger* pm; @@ -24,129 +24,41 @@ public: static void init(PowerManger* powerManager) { pm = powerManager; } - // 响应事件默认实现 virtual void react(tinyfsm::Event const &) { } + // 状态机生命周期方法 + void entry() {std::cout << "Enter state: " << typeid(*this).name() << std::endl;} // 进入状态 + void exit() {std::cout << "Exit state: " << typeid(*this).name() << std::endl;} // 退出状态 + // 状态转换接口 void triggerInitEvent() { dispatch(InitEvent()); } void triggerStandbyEvent() { dispatch(StandbyEvent()); } void triggerFaultEvent(unsigned int faultCode) { dispatch(FaultEvent(faultCode)); } }; -// 初始化静态成员 -PowerManger* PowerManagerFsm::pm = nullptr; -// 定义状态类 class InitState : public PowerManagerFsm { public: - void entry() { - PowerManagerFsm::pm->m_pmEvent = "初始化状态"; // 保持正确类名 - PowerManagerFsm::pm->printState("InitState", "进入初始化状态"); - } - - void react(InitEvent const &) { - // 1. 检查通信是否正常 - double StartTime = PowerManagerFsm::pm->GetAppStartTime(); - while (PowerManagerFsm::pm->connectState < 5) { - MOOSPause(1000); - PowerManagerFsm::pm->updateTime(); - double dft = abs(PowerManagerFsm::pm->m_current_time - StartTime); - if(dft > 10) { - transit(); - PowerManagerFsm::pm->m_faultNum = 1; - return; - } - string desp = "等待复合管控消息 : " + to_string(10-dft); - PowerManagerFsm::pm->printState("InitState", desp); - } - - // 2. 检查复合管控器是否上报故障 - if(PowerManagerFsm::pm->checkError() < 0) { - transit(); - PowerManagerFsm::pm->m_faultNum = 2; - return; - } - - // 3. 初始化系统为待机状态 - PowerManagerFsm::pm->initControlCmd(); - - // 4. 判断关键断路器是否闭合 - while (true) { - if(PowerManagerFsm::pm->m_currentDisBreakerState.bus3Breaker.unit4InstrumentDC48VCircuitBreaker == 1 || - PowerManagerFsm::pm->m_currentDisBreakerState.bus4Breaker.unit5CircuitBreaker == 1 || - PowerManagerFsm::pm->m_currentDisBreakerState.bus4Breaker.unit2CircuitBreaker == 1 || - PowerManagerFsm::pm->m_currentDisBreakerState.bus4Breaker.unit3CircuitBreaker == 1 || - PowerManagerFsm::pm->m_currentDisBreakerState.bus4Breaker.unit1CircuitBreaker == 1) { - transit(); - return; - } - PowerManagerFsm::pm->m_pmEvent = "等待关键断路器闭合"; - MOOSPause(1000); - PowerManagerFsm::pm->printState("InitState", PowerManagerFsm::pm->m_pmEvent); - } - } + void entry(); + void react(InitEvent const &); }; class StandbyState : public PowerManagerFsm { public: - void entry() { - PowerManagerFsm::pm->m_stateData.note = "待机状态"; - PowerManagerFsm::pm->printState("StandbyState", "进入待机状态"); - } - - void react(StandbyEvent const &) { - while (true) { - // 1. 检查当前是否存在故障 - if(PowerManagerFsm::pm->checkError() < 0) { - transit(); - return; - } - - // 2. 处理上位机控制指令 - handlePowerCommands(); - MOOSPause(1000); - } - } - + void entry(); + void react(StandbyEvent const &); private: - void handlePowerCommands() { - switch (PowerManagerFsm::pm->m_msCmd.powerCMD) { - case 0: PowerManagerFsm::pm->m_pmEvent = "收到上位机控制指令:关机"; break; - case 1: handlePowerOn(); break; - // 其他处理函数省略... - } - } - - void handlePowerOn() { - PowerManagerFsm::pm->m_pmEvent = "动力电上电"; - PowerManagerFsm::pm->m_CcuColCmd.powerBatCmd = 0x10; - if(PowerManagerFsm::pm->m_pmCurrentState.ccustate.fcuState == 0x04) - PowerManagerFsm::pm->m_CcuColCmd.fcuCmd = 0x02; - } + void handlePowerCommands(); + void handlePowerOn(); }; class FaultState : public PowerManagerFsm { public: - void entry() { - PowerManagerFsm::pm->printState("FaultState", "进入故障状态"); - } - - void react(FaultEvent const & e) { - switch (e.faultCode) { - case 1: - PowerManagerFsm::pm->m_pmEvent = "复合管控连接超时"; - PowerManagerFsm::pm->printState("FaultState", "通信故障"); - break; - case 2: - PowerManagerFsm::pm->m_pmEvent = "能源系统故障"; - PowerManagerFsm::pm->printState("FaultState", "能源故障"); - break; - } - } + void entry(); + void react(FaultEvent const &); }; -// 设置初始状态 -FSM_INITIAL_STATE(PowerManagerFsm, InitState); +// FSM_INITIAL_STATE(PowerManagerFsm, InitState) #endif // POWER_MANAGER_FSM_HPP \ No newline at end of file diff --git a/src/pPowerManger/PowerManger.cpp b/src/pPowerManger/PowerManger.cpp index dd617f6..45fcbf1 100644 --- a/src/pPowerManger/PowerManger.cpp +++ b/src/pPowerManger/PowerManger.cpp @@ -72,8 +72,11 @@ PowerManger::PowerManger() m_db->createDriversTables(VAR_TO_STR(m_MSDriverCmd)); // 初始化状态机 + cout << "init fsm" << endl; m_fsm.init(this); PowerManagerFsm::start(); + PowerManagerFsm::dispatch(InitEvent()); + cout << "init fsm ok" << endl; } //--------------------------------------------------------- @@ -188,12 +191,12 @@ bool PowerManger::Iterate() // saveStringToJsonFile(a,"/home/zjk/project/H100/H100PowerManger/data/subDisSysCmd.json"); /////////////////////// //4. 写状态信息到数据库 - m_stateData.state_id = m_pmState.id; - m_stateData.state_name = m_pmState.name; - m_stateData.event = m_pmEvent; - m_stateData.fault_code = m_faultNum; - if(!m_db->insertStateData(m_stateData)) - return false; + // m_stateData.state_id = m_pmState.id; + // m_stateData.state_name = m_pmState.name; + // m_stateData.event = m_pmEvent; + // m_stateData.fault_code = m_faultNum; + // if(!m_db->insertStateData(m_stateData)) + // return false; //AppCastingMOOSApp::PostReport(); //5. 清空UDP消息队列 m_udpComm.clearMsgQueue(); @@ -336,13 +339,13 @@ bool PowerManger::FsmLoop() //状态机循环 while (!m_FsmThread.IsQuitRequested()) { - // 检查故障并触发事件 - if(int error = checkError()) { - triggerFaultEvent(error); - } else { - // 自动状态转换由状态机内部处理 - MOOSPause(1000); - } + // // 检查故障并触发事件 + // if(int error = checkError()) { + // m_fsm.triggerFaultEvent(error); + // } else { + // // 自动状态转换由状态机内部处理 + // MOOSPause(1000); + // } //延时1s usleep(1000000); @@ -598,24 +601,24 @@ int PowerManger::checkError() } -void PowerManger::triggerInitEvent() -{ - PowerManagerFsm::dispatch(InitEvent()); -} +// void PowerManger::triggerInitEvent() +// { +// PowerManagerFsm::dispatch(InitEvent()); +// } -void PowerManger::triggerStandbyEvent() -{ - PowerManagerFsm::dispatch(StandbyEvent()); -} +// void PowerManger::triggerStandbyEvent() +// { +// PowerManagerFsm::dispatch(StandbyEvent()); +// } -void PowerManger::triggerFaultEvent(unsigned int faultCode) -{ - PowerManagerFsm::dispatch(FaultEvent(faultCode)); -} +// void PowerManger::triggerFaultEvent(unsigned int faultCode) +// { +// PowerManagerFsm::dispatch(FaultEvent(faultCode)); +// } void PowerManger::printState(const std::string& stateName, const std::string& desp){ - cout << MOOS::ConsoleColours::Yellow() << "STATE " << st.id << " [" << st.name << "] " << MOOS::ConsoleColours::reset(); - cout << MOOS::ConsoleColours::Blue() << " -> " << MOOS::ConsoleColours::reset(); + cout << MOOS::ConsoleColours::Yellow() << "STATE " << stateName << " " << MOOS::ConsoleColours::reset(); + cout << MOOS::ConsoleColours::Blue() << " -> " << MOOS::ConsoleColours::reset(); // 检查desp是否有“故障” if (desp.find("故障") != string::npos) { cout << MOOS::ConsoleColours::Red() << desp << MOOS::ConsoleColours::reset() << endl; diff --git a/src/pPowerManger/PowerManger.h b/src/pPowerManger/PowerManger.h index 44293ca..3a397bf 100644 --- a/src/pPowerManger/PowerManger.h +++ b/src/pPowerManger/PowerManger.h @@ -20,6 +20,9 @@ #define UNIX #define JSON_USE_EXCEPTION 1 +// 前向声明 +class PowerManagerFsm; + #include #include "MOOS/libMOOS/Thirdparty/AppCasting/AppCastingMOOSApp.h" #include "MOOS/libMOOS/Utils/MOOSThread.h" @@ -75,7 +78,7 @@ class PowerManger : public AppCastingMOOSApp bool buildReport(); void registerVariables(); - protected: + public: void updateTime(){m_current_time = MOOSTime();} bool IsSkewed(double dfTimeNow, double * pdfSkew = NULL); string getTypeName(const string typeName); @@ -96,7 +99,7 @@ class PowerManger : public AppCastingMOOSApp double msg_disHighAVolBusFbMsg_Update_time; double msg_disHighBVolBusFbMsg_Update_time; double msg_disLowBusFbMsg_Update_time; - protected: + public: //===========================交互状态变量================================== Driver m_driver; //设备驱动 pmState m_pmCurrentState; //能源系统的当前状态 @@ -106,7 +109,15 @@ class PowerManger : public AppCastingMOOSApp DriverTable m_MSDriverCmd; DriverTable m_subDisSysCmd; DriverTable m_subDisSysState; - //=========================================================================== + std::string m_pmEvent; // 状态机事件描述 + //=============================运行变量====================================== + long m_lPort; + unsigned int m_nReceiveBufferSizeKB; + unsigned int m_nSendBufferSizeKB; + double m_current_time; + unsigned int m_faultNum; + unsigned int m_ticker; +//=========================================================================== //系统运行状态 unsigned char workCondition; unsigned char currentMod; @@ -141,12 +152,6 @@ class PowerManger : public AppCastingMOOSApp XPCUdpSocket *m_pCcuUdpComm; CMOOSThread m_ListenThread; CMOOSThread m_FsmThread; - long m_lPort; - unsigned int m_nReceiveBufferSizeKB; - unsigned int m_nSendBufferSizeKB; - double m_current_time; - unsigned int m_faultNum; - unsigned int m_ticker; // 状态机实例 PowerManagerFsm m_fsm; @@ -156,15 +161,10 @@ class PowerManger : public AppCastingMOOSApp void printState(const std::string& stateName, const std::string& desp); bool FSM_RUN_IS_OK = true; - // 初始化状态机 - void initFsm() { - m_fsm.init(this); - } - // 状态机事件触发接口 - void triggerInitEvent() { m_fsm.triggerInitEvent(); } - void triggerStandbyEvent() { m_fsm.triggerStandbyEvent(); } - void triggerFaultEvent(unsigned int faultCode) { m_fsm.triggerFaultEvent(faultCode); } + // void triggerInitEvent() { m_fsm.triggerInitEvent(); } + // void triggerStandbyEvent() { m_fsm.triggerStandbyEvent(); } + // void triggerFaultEvent(unsigned int faultCode) { m_fsm.triggerFaultEvent(faultCode); } //================================================================================== int checkError(); bool shutdown(); diff --git a/src/pPowerManger/fsm.cpp b/src/pPowerManger/fsm.cpp deleted file mode 100644 index 871ae17..0000000 --- a/src/pPowerManger/fsm.cpp +++ /dev/null @@ -1,103 +0,0 @@ -#include "fsm.h" -#include - - -FSM::FSM(/* args */) -{ - idStateMap.clear(); - handleMap.clear(); - stateMap.clear(); -}; - -FSM::~FSM() -{ -}; - -int FSM::run(FSM_State &fsm,void* data) -{ - FSM_Handle handle = handleMap[fsm.id]; - return handle(fsm,data); -} -int FSM::RegisterHandleFunction(FSM_State* fsm, FSM_Handle handle) -{ - if(fsm == NULL) - return -1; - if(handleMap.count(fsm->id) > 0) - return -1; - handleMap[fsm->id] = handle; - return 0; -} -int FSM::unRegisterHandleFunction(FSM_State* fsm) -{ - if(fsm == NULL) - return -1; - if(handleMap.count(fsm->id) <= 0) - return -1; - handleMap.erase(fsm->id); - return 0; -} - -int FSM::RegisterState(std::string name, unsigned int id,FSM_State &state) -{ - if(stateMap.count(name) > 0) - return -1; - if(idStateMap.count(id) > 0) - return -1; - state.name = name; - state.id = id; - stateMap[name] = state; - idStateMap[id] = state; - return 0; -} - -unsigned int FSM::getStateId(std::string name) -{ - return stateMap[name].id; -} - -FSM_State FSM::getState(std::string name) -{ - return stateMap[name]; -} - - -int FSM::RegisterEvent(FSM_State* fsm, std::string event, FSM_State *state) -{ - if(fsm == NULL) - return -1; - fsm->event[event] = state; - return 0; -} - -int FSM::unRegisterEvent(FSM_State* fsm, std::string event) -{ - if(fsm == NULL) - return -1; - if(fsm->event.count(event) <= 0) - return -1; - fsm->event.erase(event); - return 0; -} - -int FSM::run(FSM_State *fsm,void* data, std::string event) -{ - if(fsm->event.count(event) <= 0) - { - std::cout << "no event" << std::endl; - return run(*(fsm),data); - } - else - { - int r = run(*(fsm),data); - // fsm = fsm->event[event]; - *fsm = *fsm->event[event]; - // std::cout << "event " << event <name << std::endl; - return r; - } -} - -// int FSM::run(FSM_State *fsm,void* data) -// { -// return run(*fsm,data); -// } \ No newline at end of file diff --git a/src/pPowerManger/fsm.h b/src/pPowerManger/fsm.h deleted file mode 100644 index 9078755..0000000 --- a/src/pPowerManger/fsm.h +++ /dev/null @@ -1,46 +0,0 @@ -#ifndef FSM_H -#define FSM_H - -#include -#include - - -typedef struct FSM_State -{ - std::string name; - unsigned int id; - std::map event; -}FSM_State; - -typedef int (*FSM_Handle)(FSM_State &fsm, void *data); -// typedef int (*FSM_EventHandle)(FSM_State &fsm,std::string event,void *data); - -class FSM -{ -public: - FSM(); - ~FSM(); - std::map handleMap; - std::map stateMap; - std::map idStateMap; - - int run(FSM_State &fsm,void* data); - int run(FSM_State *fsm,void* data, std::string event); - - // 事件处理机制 - int RegisterEvent(FSM_State* fsm, const std::string& event, FSM_State *state); - int unRegisterEvent(FSM_State* fsm, const std::string& event); - - // 状态管理 - int RegisterState(const std::string& name, unsigned int id, FSM_State &state); - FSM_State getState(const std::string& name) const; - unsigned int getStateId(const std::string& name) const; - - // 处理函数管理 - int RegisterHandleFunction(FSM_State* fsm, FSM_Handle handle); - int unRegisterHandleFunction(FSM_State* fsm); - - // 事件触发 - int triggerEvent(FSM_State* currentState, const std::string& event, void* data); -}; -#endif \ No newline at end of file From c47660fcb1b63eb8643fa9c4503a7d0fd0ed087f Mon Sep 17 00:00:00 2001 From: zhaojingkui <1553836110@qq.com> Date: Mon, 7 Apr 2025 11:40:16 +0800 Subject: [PATCH 3/9] =?UTF-8?q?=E4=BD=BF=E7=94=A8tinyFSM=E4=BC=98=E5=8C=96?= =?UTF-8?q?=E4=BA=86=E7=8A=B6=E6=80=81=E6=9C=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- a.puml | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100644 a.puml diff --git a/a.puml b/a.puml new file mode 100644 index 0000000..30a51a3 --- /dev/null +++ b/a.puml @@ -0,0 +1,26 @@ +@startuml PowerManagerFsm状态图 +[*] --> InitState + +state InitState { + [*] --> 等待复合管控消息 + 等待复合管控消息 --> 等待关键断路器闭合: 连接成功 + 等待复合管控消息 --> FaultState: 超时(10秒) + 等待关键断路器闭合 --> StandbyState: 关键断路器闭合 + 等待关键断路器闭合 --> FaultState: 系统错误 +} + +state StandbyState { + [*] --> 待机 + 待机 --> FaultState: 检测到错误 + 待机 --> 处理电源命令: 收到命令 + 处理电源命令 --> 待机: 完成处理 +} + +state FaultState { + [*] --> 故障处理 +} + +InitState --> FaultState : FaultEvent(faultCode=1/2) +StandbyState --> FaultState : FaultEvent(faultCode) +InitState --> StandbyState : StandbyEvent +@enduml \ No newline at end of file From 7ef9ec5ac07c089938d5edc751e75316a539d340 Mon Sep 17 00:00:00 2001 From: zhaojingkui <1553836110@qq.com> Date: Mon, 7 Apr 2025 21:18:02 +0800 Subject: [PATCH 4/9] =?UTF-8?q?=E4=BC=98=E5=8C=96=E7=BB=93=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- a.puml | 26 ++ docs/PowerManager_Optimization_Design.md | 128 +++++++ src/pPowerManger/CMakeLists.txt | 18 +- src/pPowerManger/LowerCommManager.cpp | 219 ++++++++++++ src/pPowerManger/LowerCommManager.h | 69 ++++ src/pPowerManger/PowerManger.cpp | 421 +++++++++++------------ src/pPowerManger/PowerManger.h | 53 +-- src/pPowerManger/UpperCommManager.cpp | 45 +++ src/pPowerManger/UpperCommManager.h | 37 ++ src/pPowerManger/udpComm.cpp | 17 +- 10 files changed, 785 insertions(+), 248 deletions(-) create mode 100644 a.puml create mode 100644 docs/PowerManager_Optimization_Design.md create mode 100644 src/pPowerManger/LowerCommManager.cpp create mode 100644 src/pPowerManger/LowerCommManager.h create mode 100644 src/pPowerManger/UpperCommManager.cpp create mode 100644 src/pPowerManger/UpperCommManager.h diff --git a/a.puml b/a.puml new file mode 100644 index 0000000..30a51a3 --- /dev/null +++ b/a.puml @@ -0,0 +1,26 @@ +@startuml PowerManagerFsm状态图 +[*] --> InitState + +state InitState { + [*] --> 等待复合管控消息 + 等待复合管控消息 --> 等待关键断路器闭合: 连接成功 + 等待复合管控消息 --> FaultState: 超时(10秒) + 等待关键断路器闭合 --> StandbyState: 关键断路器闭合 + 等待关键断路器闭合 --> FaultState: 系统错误 +} + +state StandbyState { + [*] --> 待机 + 待机 --> FaultState: 检测到错误 + 待机 --> 处理电源命令: 收到命令 + 处理电源命令 --> 待机: 完成处理 +} + +state FaultState { + [*] --> 故障处理 +} + +InitState --> FaultState : FaultEvent(faultCode=1/2) +StandbyState --> FaultState : FaultEvent(faultCode) +InitState --> StandbyState : StandbyEvent +@enduml \ No newline at end of file diff --git a/docs/PowerManager_Optimization_Design.md b/docs/PowerManager_Optimization_Design.md new file mode 100644 index 0000000..3089a34 --- /dev/null +++ b/docs/PowerManager_Optimization_Design.md @@ -0,0 +1,128 @@ +# PowerManager系统架构优化设计方案 + +## 1. 总体架构 +```mermaid +classDiagram + class PowerManagerCore { + +startup() + +shutdown() + +getSystemState() + } + + class StateMachineService { + +triggerEvent() + +getCurrentState() + +addStateListener() + } + + class CommunicationMediator { + +registerHandler() + +sendMessage() + +addMessageListener() + } + + PowerManagerCore --> StateMachineService + PowerManagerCore --> CommunicationMediator +``` + +## 2. 状态机重构方案 + +### 2.1 状态设计模式 +```cpp +class IPowerState { +public: + virtual void onEntry(PowerContext&) = 0; + virtual void handleEvent(PowerContext&, const Event&) = 0; + virtual void onExit(PowerContext&) = 0; +}; +``` + +### 2.2 状态转换规则 +```yaml +# states_config.yaml +transitions: + - from: STANDBY + event: START_CMD + to: OPERATING + - from: OPERATING + event: STOP_CMD + to: STANDBY +``` + +## 3. 通信中介者设计 + +### 3.1 核心架构 +```mermaid +sequenceDiagram + participant Upper as 上位机 + participant Mediator as 通信中介者 + participant Lower as 下位机 + + Upper->>Mediator: 控制命令(JSON) + Mediator->>Lower: 设备指令(ProtocolBuffer) + Lower->>Mediator: 状态更新 + Mediator->>Upper: 系统报告 +``` + +### 3.2 关键实现 +```cpp +class CommunicationMediator { + // 线程安全消息队列 + moodycamel::ConcurrentQueue queue; + + // 消息处理线程 + void processMessages() { + while (running) { + Message msg; + if (queue.try_dequeue(msg)) { + handlers[msg.type]->handle(msg); + } + } + } +}; +``` + +## 4. 数据库服务设计 + +### 4.1 日志策略模式 +```cpp +class ILogStrategy { +public: + virtual bool log(const SystemLog& log) = 0; +}; + +class SQLiteLogStrategy : public ILogStrategy { + // SQLite实现... +}; + +class FileLogStrategy : public ILogStrategy { + // 文件系统实现... +}; +``` + +## 5. 实施计划 + +### 5.1 阶段划分 +```mermaid +gantt + title 重构实施甘特图 + section 核心框架 + 接口定义 :2025-04-08, 3d + 基础实现 :2025-04-11, 5d + + section 模块重构 + 状态机 :2025-04-16, 5d + 通信模块 :2025-04-21, 5d + + section 测试验证 + 单元测试 :2025-04-26, 3d + 集成测试 :2025-04-29, 5d +``` + +## 6. 性能指标 + +| 模块 | 当前QPS | 目标QPS | 优化手段 | +|----------------|---------|---------|-----------------------| +| 状态机处理 | 100 | 500 | 无锁状态转换 | +| 消息处理 | 200 | 1000 | 批量处理+线程池 | +| 数据库写入 | 50 | 300 | 异步写入+批量提交 | \ No newline at end of file diff --git a/src/pPowerManger/CMakeLists.txt b/src/pPowerManger/CMakeLists.txt index 350888f..2a1f876 100644 --- a/src/pPowerManger/CMakeLists.txt +++ b/src/pPowerManger/CMakeLists.txt @@ -26,6 +26,7 @@ SET(SRC main.cpp SQLiteDB.cpp driver.cpp + LowerCommManager.cpp ) ADD_EXECUTABLE(pPowerManger ${SRC}) @@ -56,17 +57,18 @@ SET(FSMLIB_SRC SET(DRIVER_SRC driver.cpp) -SET(POWERMANGE_SRC - PowerManger.cpp - PowerManger_Info.cpp - udpComm.cpp - SQLiteDB.cpp - driver.cpp - PowerManagerFsm.cpp) +# SET(POWERMANGE_SRC +# PowerManger.cpp +# PowerManger_Info.cpp +# udpComm.cpp +# SQLiteDB.cpp +# driver.cpp +# PowerManagerFsm.cpp) ADD_LIBRARY(SQLiteDB STATIC ${SQLITEDB_SRC}) ADD_LIBRARY(UDPComm STATIC ${UDPCOMM_SRC}) ADD_LIBRARY(FSMLib STATIC ${FSMLIB_SRC}) ADD_LIBRARY(Driver STATIC ${DRIVER_SRC}) -ADD_LIBRARY(PowerMange STATIC ${POWERMANGE_SRC}) +# ADD_LIBRARY(PowerMange STATIC ${POWERMANGE_SRC}) + diff --git a/src/pPowerManger/LowerCommManager.cpp b/src/pPowerManger/LowerCommManager.cpp new file mode 100644 index 0000000..e32e198 --- /dev/null +++ b/src/pPowerManger/LowerCommManager.cpp @@ -0,0 +1,219 @@ +#include "LowerCommManager.h" +#include "PowerManger.h" +#include "driver.h" +#include "udpComm.h" + +bool _ListenCB(void * pParam) +{ + LowerCommManager* pMe = (LowerCommManager* )pParam; + return pMe->listenThreadFunc(); +} + +LowerCommManager::LowerCommManager(PowerManger* pm, long myPort, long ccuPort, const std::string& cccHost){ + m_pm = pm; + m_udpComm = new udpComm(); + m_port = myPort; + m_udpComm->ccuHost = cccHost; + if(ccuPort < 0 || ccuPort > 65535) { + throw std::invalid_argument("Invalid CCU port: " + std::to_string(ccuPort)); + } + m_udpComm->ccuPort = static_cast(ccuPort); +} + +LowerCommManager::~LowerCommManager(){ + try { + stopListenThread(); + if (m_udpComm) { + delete m_udpComm; + m_udpComm = nullptr; + } + } catch (...) { + cerr << "Error during cleanup" << endl; + } +} +bool LowerCommManager::initUdpComm(){ + //设置UDP监听端口 + XPCUdpSocket* m_udpSocket = new XPCUdpSocket(m_port); + if(m_udpSocket) + { + try + { + m_udpSocket->vBindSocket(); + m_udpComm->ccuHost = m_ccuHost; + m_udpComm->ccuPort = m_ccuPort; + cout<udpScoket = m_udpSocket; + } + catch(const std::exception& e) + { + std::cerr << e.what() << '\n'; + cout<m_CcuColCmd); + // sendDisSysCommand(m_pm->m_targetDisBreakerState); + int msg = 10; + m_udpComm->udpScoket->iSendMessageTo((void*) msg, 6, m_udpComm->ccuPort, "127.0.0.1"); + m_udpComm->clearMsgQueue(); +} + +bool LowerCommManager::sendCcuCommand(const ccuColCmd cmd){ + // m_pm->m_db->insertCcuSysCmd(cmd); + if(!m_udpComm->sendCcuColCmd(cmd)) + cout << "send ccu command failed!" << endl; + return true; +} + +bool LowerCommManager::sendDisSysCommand(const disSysBreakerList& cmd){ + //根据目标状态进行断路器操作 + //a. 高压母线的断路器 + disHighVolBusCmd a; + a.fuelCellCircuitBreaker = getBreakerOption(cmd.bus1Breaker.fuelCellCircuitBreaker); + a.lithiumBatteryGroupInstrumentCircuitBreaker = getBreakerOption(cmd.bus1Breaker.lithiumBatteryGroupInstrumentCircuitBreaker); + a.dcDc5ModuleCircuitBreaker = getBreakerOption(cmd.bus1Breaker.dcDc5ModuleCircuitBreaker); + a.powerLithiumBatteryCircuitBreaker = getBreakerOption(cmd.bus1Breaker.powerLithiumBatteryCircuitBreaker); + a.propulsionMotorCircuitBreaker = getBreakerOption(cmd.bus1Breaker.propulsionMotorCircuitBreaker); + a.bowHighVoltageDistributionBoxCircuitBreaker = getBreakerOption(cmd.bus1Breaker.bowHighVoltageDistributionBoxCircuitBreaker); + a.tyzReservedCircuitBreaker = getBreakerOption(cmd.bus1Breaker.tyzReservedCircuitBreaker); + a.sternFTDevice45CircuitBreaker = getBreakerOption(cmd.bus1Breaker.sternFTDevice45CircuitBreaker); + a.sternRudderSwitch1CircuitBreaker = getBreakerOption(cmd.bus1Breaker.sternRudderSwitch1CircuitBreaker); + a.sternRudderSwitch2CircuitBreaker = getBreakerOption(cmd.bus1Breaker.sternRudderSwitch2CircuitBreaker); + a.reservedCircuitBreaker = getBreakerOption(cmd.bus1Breaker.reservedCircuitBreaker); + a.fbReservedCircuitBreaker = getBreakerOption(cmd.bus1Breaker.fbReservedCircuitBreaker); + m_udpComm->sendDisSysCmd(a); + //b. 高压汇流排A断路器 + disHighAVolBusCmd b; + b.bowFTDevice123CircuitBreaker = getBreakerOption(cmd.bus2Breaker.bowFTDevice123CircuitBreaker); + b.actuatorCircuitBreaker = getBreakerOption(cmd.bus2Breaker.actuatorCircuitBreaker); + b.mastSteeringGearControlBoxCircuitBreaker = getBreakerOption(cmd.bus2Breaker.mastSteeringGearControlBoxCircuitBreaker); + b.xczCircuitBreaker = getBreakerOption(cmd.bus2Breaker.xczCircuitBreaker); + b.bowRudderControlBoxCircuitBreaker = getBreakerOption(cmd.bus2Breaker.bowRudderControlBoxCircuitBreaker); + b.openWaterCoverStartCylinderCircuitBreaker = getBreakerOption(cmd.bus2Breaker.openWaterCoverStartCylinderCircuitBreaker); + m_udpComm->sendDisSysCmd(b); + //c. 高压汇流排B断路器 + disHighBVolBusCmd c; + c.lithiumBatteryGroupInstrumentCircuitBreaker = getBreakerOption(cmd.bus3Breaker.lithiumBatteryGroupInstrumentCircuitBreaker); + c.bowLowVoltageDistributionBoxCircuitBreaker = getBreakerOption(cmd.bus3Breaker.bowLowVoltageDistributionBoxCircuitBreaker); + c.unit4InstrumentDC48VCircuitBreaker = getBreakerOption(cmd.bus3Breaker.unit4InstrumentDC48VCircuitBreaker); + c.dcC1DCDistributionPanelCircuitBreaker = getBreakerOption(cmd.bus3Breaker.dcC1DCDistributionPanelCircuitBreaker); + c.reservedCircuitBreaker1 = getBreakerOption(cmd.bus3Breaker.reservedCircuitBreaker1); + c.reservedCircuitBreaker2 = getBreakerOption(cmd.bus3Breaker.reservedCircuitBreaker2); + c.emergencyLithiumBatteryGroup2CircuitBreaker = getBreakerOption(cmd.bus3Breaker.emergencyLithiumBatteryGroup2CircuitBreaker); + m_udpComm->sendDisSysCmd(c); + //d. 闭合低压汇流排断路器 + disLowBusCmd d; + d.unit1CircuitBreaker = getBreakerOption(cmd.bus4Breaker.unit1CircuitBreaker); + d.unit2CircuitBreaker = getBreakerOption(cmd.bus4Breaker.unit2CircuitBreaker); + d.unit3CircuitBreaker = getBreakerOption(cmd.bus4Breaker.unit3CircuitBreaker); + d.unit5CircuitBreaker = getBreakerOption(cmd.bus4Breaker.unit5CircuitBreaker); + d.bowPZDeviceCircuitBreaker = getBreakerOption(cmd.bus4Breaker.bowPZDeviceCircuitBreaker); + d.reservedCircuitBreaker1 = getBreakerOption(cmd.bus4Breaker.reservedCircuitBreaker1); + d.reservedCircuitBreaker2 = getBreakerOption(cmd.bus4Breaker.reservedCircuitBreaker2); + d.emergencyLithiumBatteryGroup1CircuitBreaker = getBreakerOption(cmd.bus4Breaker.emergencyLithiumBatteryGroup1CircuitBreaker); + m_udpComm->sendDisSysCmd(d); + //将指令写入数据库 + m_pm->m_db->insertDisSysCmd(a); + m_pm->m_db->insertDisSysCmd(b); + m_pm->m_db->insertDisSysCmd(c); + m_pm->m_db->insertDisSysCmd(d); + return true; +} + + +void LowerCommManager::clearMsgQueue(){ + m_udpComm->clearMsgQueue(); +} + +bool LowerCommManager::listenThreadFunc() +{ + cout<udpScoket->iRecieveMessage(Buff, sizeof(Buff)); + cout< 0) + { + try { + if(!m_udpComm->pushMsgToQueue(Buff)) + { + for(int i=0; isError.size(); i++) + { + cout<sError[i] << MOOS::ConsoleColours::reset() << endl; + } + } + } + catch(const std::exception& e) { + cerr << "Error processing message: " << e.what() << endl; + } + } + + // 打印通信错误信息 + if(!m_udpComm->sError.empty()) + { + for(int i=0; isError.size(); i++) + { + cout<sError[i] << MOOS::ConsoleColours::reset() << endl; + } + m_udpComm->sError.clear(); + } + } + catch(const XPCException& e) + { + cerr << "XPCException in listenThreadFunc" << endl; + // 短暂休眠后继续尝试 + MOOSPause(100); + } + catch(const std::exception& e) + { + cerr << "Exception in listenThreadFunc: " << e.what() << endl; + MOOSPause(100); + } + catch(...) + { + cerr << "Unknown exception in listenThreadFunc" << endl; + MOOSPause(100); + } + } + return true; +} + +void LowerCommManager::startListenThread() +{ + if(!m_ListenThread.IsThreadRunning()) + { + m_ListenThread.Initialise(_ListenCB,this); + m_ListenThread.Start(); + std::cout << "LowerCommManager::startListenThread" << std::endl; + } +} + +void LowerCommManager::stopListenThread() +{ + if(m_ListenThread.IsThreadRunning()) + { + m_ListenThread.Stop(); + } +} + +char LowerCommManager::getBreakerOption(char cmd) +{ + if(cmd ==1) + return 0x55; + else if(cmd ==0) + return 0xAA; + else + return 0x00; +} \ No newline at end of file diff --git a/src/pPowerManger/LowerCommManager.h b/src/pPowerManger/LowerCommManager.h new file mode 100644 index 0000000..9d67c5a --- /dev/null +++ b/src/pPowerManger/LowerCommManager.h @@ -0,0 +1,69 @@ +#ifndef LOWER_COMM_MANAGER_H +#define LOWER_COMM_MANAGER_H +#define UNIX + +#include "MOOS/libMOOS/Comms/XPCUdpSocket.h" +#include "MOOS/libMOOS/Utils/MOOSThread.h" +#include "MOOS/libMOOS/Utils/MOOSLock.h" +#include "ccuUdpMsg.h" +#include "pmSysvariable.h" +#include +#include +#include +#include +#include +#include "udpComm.h" + +class PowerManger; // 前向声明 + +class LowerCommManager { +public: + LowerCommManager(PowerManger* pm, long myPort, long ccuPort, const std::string& cccHost); + ~LowerCommManager(); + + //processPeriodicTasks + void processPeriodicTasks(); + //clearMsgQueue + void clearMsgQueue(); + +public: + CMOOSLock m_CommMutex; // 保护UDP通信资源 + + // 初始化UDP通信 + bool initUdpComm(); + + // 更新设备状态 + bool updateDeviceStates(); + + // 发送CCU控制命令 + bool sendCcuCommand(const ccuColCmd cmd); + bool sendDisSysCommand(const disSysBreakerList& cmd); + + // 获取通信状态 + int getConnectionState() const { return m_connectState; } + + // 启动/停止监听线程 + void startListenThread(); + void stopListenThread(); + + //转换函数 + char getBreakerOption(char cmd); + +public: + long m_port; + long m_ccuPort; + std::string m_ccuHost; + std::string m_host; + + PowerManger* m_pm; + udpComm* m_udpComm; + XPCUdpSocket* m_udpSocket; + + CMOOSThread m_ListenThread; + int m_connectState; + + // UDP监听线程函数 + bool listenThreadFunc(); +}; + +#endif // LOWER_COMM_MANAGER_H \ No newline at end of file diff --git a/src/pPowerManger/PowerManger.cpp b/src/pPowerManger/PowerManger.cpp index 45fcbf1..d4f11a9 100644 --- a/src/pPowerManger/PowerManger.cpp +++ b/src/pPowerManger/PowerManger.cpp @@ -14,11 +14,11 @@ using namespace std; -bool _ListenCB(void * pParam) -{ - PowerManger* pMe = (PowerManger* )pParam; - return pMe->ListenLoopUDP(); -} +// bool _ListenCB(void * pParam) +// { +// // PowerManger* pMe = (PowerManger* )pParam; +// // return pMe->ListenLoopUDP(); +// } bool _FsmCB(void * pParam) { @@ -57,7 +57,7 @@ PowerManger::PowerManger() m_MSDriverCmd = {}; m_subDisSysCmd = {}; m_subDisSysState = {}; - //初始化断路器状态 + //初始化控制指令 initControlCmd(); //初始化数据库 @@ -70,6 +70,10 @@ PowerManger::PowerManger() m_db->createDriversTables(VAR_TO_STR(m_subDisSysState)); m_db->createDriversTables(VAR_TO_STR(m_subDisSysCmd)); m_db->createDriversTables(VAR_TO_STR(m_MSDriverCmd)); + + //初始化UDP通信 + m_lowerCommManager = new LowerCommManager(this,IPORT,CCUPORT,CCUHOST); + m_lowerCommManager->initUdpComm(); // 初始化状态机 cout << "init fsm" << endl; @@ -84,6 +88,8 @@ PowerManger::PowerManger() PowerManger::~PowerManger() { + delete m_db; + delete m_lowerCommManager; } //--------------------------------------------------------- @@ -165,20 +171,20 @@ bool PowerManger::Iterate() { AppCastingMOOSApp::Iterate(); //1. 更新当前状态 - updatePmState(); + // updatePmState(); updateConnectState(); //2. 运行状态机 - if (FSM_RUN_IS_OK) - m_FsmThread.Start(); - else - m_FsmThread.Stop(); + // if (FSM_RUN_IS_OK) + // m_FsmThread.Start(); + // else + // m_FsmThread.Stop(); //3. 进行操作 每秒执行一次 if (m_ticker++ % 5 == 0) { //a. 配电系统操作 - disSysOption(); + // disSysOption(); //b. ccu操作 - ccuOption(); + // ccuOption(); //c. 上位机反馈 buildPowerSysReport(); Notify(PM_TO_DB_SUBDISCMD,m_driver.saveDriverTableToJson(&m_subDisSysCmd)); @@ -186,6 +192,7 @@ bool PowerManger::Iterate() //d.保存到数据库 writeDataToDB(); } + m_lowerCommManager->processPeriodicTasks(); /////////////////////// // string a = m_driver.getSubDisCmdJson(&m_subDisSysCmd); // saveStringToJsonFile(a,"/home/zjk/project/H100/H100PowerManger/data/subDisSysCmd.json"); @@ -199,7 +206,7 @@ bool PowerManger::Iterate() // return false; //AppCastingMOOSApp::PostReport(); //5. 清空UDP消息队列 - m_udpComm.clearMsgQueue(); + // m_udpComm.clearMsgQueue(); return(true); } @@ -237,23 +244,7 @@ bool PowerManger::OnStartUp() } registerVariables(); - //启动UDP监听线程 - if(m_pCcuUdpComm = setUdpScoket(IPORT)) - { - cout<startListenThread(); return(true); } @@ -304,35 +295,35 @@ XPCUdpSocket* PowerManger::setUdpScoket(long lPort) return pUdpSocket; } -bool PowerManger::ListenLoopUDP() -{ - unsigned char Buff[MAX_UDP_PKT_SIZE]; - while(!m_ListenThread.IsQuitRequested()) - { - int nRead = m_pCcuUdpComm->iRecieveMessage(Buff,sizeof(Buff)); - cout< 0) - { - if(!m_udpComm.pushMsgToQueue(Buff)) - { - for(int i=0;iiRecieveMessage(Buff,sizeof(Buff)); +// cout< 0) +// { +// if(!m_udpComm.pushMsgToQueue(Buff)) +// { +// for(int i=0;iinsertCcuData(m_CcuCurrentState.data); //写入数据库 - msg_CcuStateFbMsg_Update_time = time; - } - if(!m_udpComm.m_qReceiveDisHighVolBusBuffer.empty()) - { - double time; - m_udpComm.popMsgFormQueue(time,m_disHighVolBusCurrentState); - m_pmCurrentState.bus1State = m_disHighVolBusCurrentState.data; - m_db->insertDisHighVolBusData(m_disHighVolBusCurrentState.data); //写入数据库 - msg_disHighVolBusFbMsg_Update_time = time; +// bool PowerManger::updatePmState() +// { +// //1. 更新下位机状态 +// if(!m_udpComm.m_qReceiveCcuStateBuffer.empty()) +// { +// double time; +// m_udpComm.popMsgFormQueue(time,m_CcuCurrentState); +// m_pmCurrentState.ccustate = m_CcuCurrentState.data; +// m_db->insertCcuData(m_CcuCurrentState.data); //写入数据库 +// msg_CcuStateFbMsg_Update_time = time; +// } +// if(!m_udpComm.m_qReceiveDisHighVolBusBuffer.empty()) +// { +// double time; +// m_udpComm.popMsgFormQueue(time,m_disHighVolBusCurrentState); +// m_pmCurrentState.bus1State = m_disHighVolBusCurrentState.data; +// m_db->insertDisHighVolBusData(m_disHighVolBusCurrentState.data); //写入数据库 +// msg_disHighVolBusFbMsg_Update_time = time; - disBus1Breaker* pdis1=new disBus1Breaker; - (m_pmCurrentState.bus1State.fuelCellCircuitBreaker == BREAK_ON) ? pdis1 -> fuelCellCircuitBreaker = 1 : pdis1 -> fuelCellCircuitBreaker = 0; - (m_pmCurrentState.bus1State.powerLithiumBatteryCircuitBreaker == BREAK_ON) ? pdis1 -> powerLithiumBatteryCircuitBreaker = 1 : pdis1 -> powerLithiumBatteryCircuitBreaker = 0; - (m_pmCurrentState.bus1State.propulsionMotorCircuitBreaker == BREAK_ON) ? pdis1 -> propulsionMotorCircuitBreaker = 1 : pdis1 -> propulsionMotorCircuitBreaker = 0; - (m_pmCurrentState.bus1State.lithiumBatteryGroupInstrumentCircuitBreaker == BREAK_ON) ? pdis1 -> lithiumBatteryGroupInstrumentCircuitBreaker = 1 : pdis1 -> lithiumBatteryGroupInstrumentCircuitBreaker = 0; - (m_pmCurrentState.bus1State.dcDc5ModuleCircuitBreaker == BREAK_ON) ? pdis1 -> dcDc5ModuleCircuitBreaker = 1 : pdis1 -> dcDc5ModuleCircuitBreaker = 0; - (m_pmCurrentState.bus1State.bowHighVoltageDistributionBoxCircuitBreaker == BREAK_ON) ? pdis1 -> bowHighVoltageDistributionBoxCircuitBreaker = 1 : pdis1 -> bowHighVoltageDistributionBoxCircuitBreaker = 0; - (m_pmCurrentState.bus1State.sternFTDevice45CircuitBreaker == BREAK_ON) ? pdis1 -> sternFTDevice45CircuitBreaker = 1 : pdis1 -> sternFTDevice45CircuitBreaker = 0; - (m_pmCurrentState.bus1State.sternRudderSwitch1CircuitBreaker == BREAK_ON) ? pdis1 -> sternRudderSwitch1CircuitBreaker = 1 : pdis1 -> sternRudderSwitch1CircuitBreaker = 0; - (m_pmCurrentState.bus1State.sternRudderSwitch2CircuitBreaker == BREAK_ON) ? pdis1 -> sternRudderSwitch2CircuitBreaker = 1 : pdis1 -> sternRudderSwitch2CircuitBreaker = 0; - (m_pmCurrentState.bus1State.fbReservedCircuitBreaker == BREAK_ON) ? pdis1 -> fbReservedCircuitBreaker = 1 : pdis1 -> fbReservedCircuitBreaker = 0; - (m_pmCurrentState.bus1State.tyzReservedCircuitBreaker == BREAK_ON) ? pdis1 -> tyzReservedCircuitBreaker = 1 : pdis1 -> tyzReservedCircuitBreaker = 0; - (m_pmCurrentState.bus1State.reservedCircuitBreaker == BREAK_ON) ? pdis1 -> reservedCircuitBreaker = 1 : pdis1 -> reservedCircuitBreaker = 0; - pdis1 -> paceholder = 0; - m_currentDisBreakerState.bus1Breaker = *pdis1; - delete pdis1; - } - if(!m_udpComm.m_qReceiveDisHighAVolBusBuffer.empty()) - { - double time; - m_udpComm.popMsgFormQueue(time,m_disHighAVolBusCurrentState); - m_pmCurrentState.bus2State = m_disHighAVolBusCurrentState.data; - m_db->insertDisHighAVolBusData(m_disHighAVolBusCurrentState.data); //写入数据库 - msg_disHighAVolBusFbMsg_Update_time = time; +// disBus1Breaker* pdis1=new disBus1Breaker; +// (m_pmCurrentState.bus1State.fuelCellCircuitBreaker == BREAK_ON) ? pdis1 -> fuelCellCircuitBreaker = 1 : pdis1 -> fuelCellCircuitBreaker = 0; +// (m_pmCurrentState.bus1State.powerLithiumBatteryCircuitBreaker == BREAK_ON) ? pdis1 -> powerLithiumBatteryCircuitBreaker = 1 : pdis1 -> powerLithiumBatteryCircuitBreaker = 0; +// (m_pmCurrentState.bus1State.propulsionMotorCircuitBreaker == BREAK_ON) ? pdis1 -> propulsionMotorCircuitBreaker = 1 : pdis1 -> propulsionMotorCircuitBreaker = 0; +// (m_pmCurrentState.bus1State.lithiumBatteryGroupInstrumentCircuitBreaker == BREAK_ON) ? pdis1 -> lithiumBatteryGroupInstrumentCircuitBreaker = 1 : pdis1 -> lithiumBatteryGroupInstrumentCircuitBreaker = 0; +// (m_pmCurrentState.bus1State.dcDc5ModuleCircuitBreaker == BREAK_ON) ? pdis1 -> dcDc5ModuleCircuitBreaker = 1 : pdis1 -> dcDc5ModuleCircuitBreaker = 0; +// (m_pmCurrentState.bus1State.bowHighVoltageDistributionBoxCircuitBreaker == BREAK_ON) ? pdis1 -> bowHighVoltageDistributionBoxCircuitBreaker = 1 : pdis1 -> bowHighVoltageDistributionBoxCircuitBreaker = 0; +// (m_pmCurrentState.bus1State.sternFTDevice45CircuitBreaker == BREAK_ON) ? pdis1 -> sternFTDevice45CircuitBreaker = 1 : pdis1 -> sternFTDevice45CircuitBreaker = 0; +// (m_pmCurrentState.bus1State.sternRudderSwitch1CircuitBreaker == BREAK_ON) ? pdis1 -> sternRudderSwitch1CircuitBreaker = 1 : pdis1 -> sternRudderSwitch1CircuitBreaker = 0; +// (m_pmCurrentState.bus1State.sternRudderSwitch2CircuitBreaker == BREAK_ON) ? pdis1 -> sternRudderSwitch2CircuitBreaker = 1 : pdis1 -> sternRudderSwitch2CircuitBreaker = 0; +// (m_pmCurrentState.bus1State.fbReservedCircuitBreaker == BREAK_ON) ? pdis1 -> fbReservedCircuitBreaker = 1 : pdis1 -> fbReservedCircuitBreaker = 0; +// (m_pmCurrentState.bus1State.tyzReservedCircuitBreaker == BREAK_ON) ? pdis1 -> tyzReservedCircuitBreaker = 1 : pdis1 -> tyzReservedCircuitBreaker = 0; +// (m_pmCurrentState.bus1State.reservedCircuitBreaker == BREAK_ON) ? pdis1 -> reservedCircuitBreaker = 1 : pdis1 -> reservedCircuitBreaker = 0; +// pdis1 -> paceholder = 0; +// m_currentDisBreakerState.bus1Breaker = *pdis1; +// delete pdis1; +// } +// if(!m_udpComm.m_qReceiveDisHighAVolBusBuffer.empty()) +// { +// double time; +// m_udpComm.popMsgFormQueue(time,m_disHighAVolBusCurrentState); +// m_pmCurrentState.bus2State = m_disHighAVolBusCurrentState.data; +// m_db->insertDisHighAVolBusData(m_disHighAVolBusCurrentState.data); //写入数据库 +// msg_disHighAVolBusFbMsg_Update_time = time; - disBus2Breaker* pdis2=new disBus2Breaker; - (m_pmCurrentState.bus2State.bowFTDevice123CircuitBreaker == BREAK_ON)? pdis2 -> bowFTDevice123CircuitBreaker = 1 : pdis2 -> bowFTDevice123CircuitBreaker = 0; - (m_pmCurrentState.bus2State.actuatorCircuitBreaker == BREAK_ON)? pdis2 -> actuatorCircuitBreaker = 1 : pdis2 -> actuatorCircuitBreaker = 0; - (m_pmCurrentState.bus2State.mastSteeringGearControlBoxCircuitBreaker == BREAK_ON)? pdis2 -> mastSteeringGearControlBoxCircuitBreaker = 1 : pdis2 -> mastSteeringGearControlBoxCircuitBreaker = 0; - (m_pmCurrentState.bus2State.xczCircuitBreaker == BREAK_ON)? pdis2 -> xczCircuitBreaker = 1 : pdis2 -> xczCircuitBreaker = 0; - (m_pmCurrentState.bus2State.bowRudderControlBoxCircuitBreaker == BREAK_ON)? pdis2 -> bowRudderControlBoxCircuitBreaker = 1 : pdis2 -> bowRudderControlBoxCircuitBreaker = 0; - (m_pmCurrentState.bus2State.openWaterCoverStartCylinderCircuitBreaker == BREAK_ON)? pdis2 -> openWaterCoverStartCylinderCircuitBreaker = 1 : pdis2 -> openWaterCoverStartCylinderCircuitBreaker = 0; - pdis2 -> paceholder = 0; - m_currentDisBreakerState.bus2Breaker = *pdis2; - delete pdis2; - } - if(!m_udpComm.m_qReceiveDisHighBVolBusBuffer.empty()) - { - double time; - m_udpComm.popMsgFormQueue(time,m_disHighBVolBusCurrentState); - m_pmCurrentState.bus3State = m_disHighBVolBusCurrentState.data; - m_db->insertDisHighBVolBusData(m_disHighBVolBusCurrentState.data); //写入数据库 - msg_disHighBVolBusFbMsg_Update_time = time; +// disBus2Breaker* pdis2=new disBus2Breaker; +// (m_pmCurrentState.bus2State.bowFTDevice123CircuitBreaker == BREAK_ON)? pdis2 -> bowFTDevice123CircuitBreaker = 1 : pdis2 -> bowFTDevice123CircuitBreaker = 0; +// (m_pmCurrentState.bus2State.actuatorCircuitBreaker == BREAK_ON)? pdis2 -> actuatorCircuitBreaker = 1 : pdis2 -> actuatorCircuitBreaker = 0; +// (m_pmCurrentState.bus2State.mastSteeringGearControlBoxCircuitBreaker == BREAK_ON)? pdis2 -> mastSteeringGearControlBoxCircuitBreaker = 1 : pdis2 -> mastSteeringGearControlBoxCircuitBreaker = 0; +// (m_pmCurrentState.bus2State.xczCircuitBreaker == BREAK_ON)? pdis2 -> xczCircuitBreaker = 1 : pdis2 -> xczCircuitBreaker = 0; +// (m_pmCurrentState.bus2State.bowRudderControlBoxCircuitBreaker == BREAK_ON)? pdis2 -> bowRudderControlBoxCircuitBreaker = 1 : pdis2 -> bowRudderControlBoxCircuitBreaker = 0; +// (m_pmCurrentState.bus2State.openWaterCoverStartCylinderCircuitBreaker == BREAK_ON)? pdis2 -> openWaterCoverStartCylinderCircuitBreaker = 1 : pdis2 -> openWaterCoverStartCylinderCircuitBreaker = 0; +// pdis2 -> paceholder = 0; +// m_currentDisBreakerState.bus2Breaker = *pdis2; +// delete pdis2; +// } +// if(!m_udpComm.m_qReceiveDisHighBVolBusBuffer.empty()) +// { +// double time; +// m_udpComm.popMsgFormQueue(time,m_disHighBVolBusCurrentState); +// m_pmCurrentState.bus3State = m_disHighBVolBusCurrentState.data; +// m_db->insertDisHighBVolBusData(m_disHighBVolBusCurrentState.data); //写入数据库 +// msg_disHighBVolBusFbMsg_Update_time = time; - disBus3Breaker* pdis3=new disBus3Breaker; - (m_pmCurrentState.bus3State.lithiumBatteryGroupInstrumentCircuitBreaker == BREAK_ON)? pdis3 -> lithiumBatteryGroupInstrumentCircuitBreaker = 1 : pdis3 -> lithiumBatteryGroupInstrumentCircuitBreaker = 0; - (m_pmCurrentState.bus3State.bowLowVoltageDistributionBoxCircuitBreaker == BREAK_ON)? pdis3 -> bowLowVoltageDistributionBoxCircuitBreaker = 1 : pdis3 -> bowLowVoltageDistributionBoxCircuitBreaker = 0; - (m_pmCurrentState.bus3State.unit4InstrumentDC48VCircuitBreaker == BREAK_ON)? pdis3 -> unit4InstrumentDC48VCircuitBreaker = 1 : pdis3 -> unit4InstrumentDC48VCircuitBreaker = 0; - (m_pmCurrentState.bus3State.dcC1DCDistributionPanelCircuitBreaker == BREAK_ON)? pdis3 -> dcC1DCDistributionPanelCircuitBreaker = 1 : pdis3 -> dcC1DCDistributionPanelCircuitBreaker = 0; - (m_pmCurrentState.bus3State.reservedCircuitBreaker1 == BREAK_ON)? pdis3 -> reservedCircuitBreaker1 = 1 : pdis3 -> reservedCircuitBreaker1 = 0; - (m_pmCurrentState.bus3State.reservedCircuitBreaker2 == BREAK_ON)? pdis3 -> reservedCircuitBreaker2 = 1 : pdis3 -> reservedCircuitBreaker2 = 0; - (m_pmCurrentState.bus3State.emergencyLithiumBatteryGroup2CircuitBreaker == BREAK_ON)? pdis3 -> emergencyLithiumBatteryGroup2CircuitBreaker = 1 : pdis3 -> emergencyLithiumBatteryGroup2CircuitBreaker = 0; - pdis3->paceholder = 0; - m_currentDisBreakerState.bus3Breaker = *pdis3; - delete pdis3; - } - if(!m_udpComm.m_qReceiveDisLowBusBuffer.empty()) - { - double time; - m_udpComm.popMsgFormQueue(time,m_disLowBusState); - m_pmCurrentState.bus4State = m_disLowBusState.data; - m_db->insertDisLowBusData(m_disLowBusState.data); //写入数据库 - msg_disLowBusFbMsg_Update_time = time; +// disBus3Breaker* pdis3=new disBus3Breaker; +// (m_pmCurrentState.bus3State.lithiumBatteryGroupInstrumentCircuitBreaker == BREAK_ON)? pdis3 -> lithiumBatteryGroupInstrumentCircuitBreaker = 1 : pdis3 -> lithiumBatteryGroupInstrumentCircuitBreaker = 0; +// (m_pmCurrentState.bus3State.bowLowVoltageDistributionBoxCircuitBreaker == BREAK_ON)? pdis3 -> bowLowVoltageDistributionBoxCircuitBreaker = 1 : pdis3 -> bowLowVoltageDistributionBoxCircuitBreaker = 0; +// (m_pmCurrentState.bus3State.unit4InstrumentDC48VCircuitBreaker == BREAK_ON)? pdis3 -> unit4InstrumentDC48VCircuitBreaker = 1 : pdis3 -> unit4InstrumentDC48VCircuitBreaker = 0; +// (m_pmCurrentState.bus3State.dcC1DCDistributionPanelCircuitBreaker == BREAK_ON)? pdis3 -> dcC1DCDistributionPanelCircuitBreaker = 1 : pdis3 -> dcC1DCDistributionPanelCircuitBreaker = 0; +// (m_pmCurrentState.bus3State.reservedCircuitBreaker1 == BREAK_ON)? pdis3 -> reservedCircuitBreaker1 = 1 : pdis3 -> reservedCircuitBreaker1 = 0; +// (m_pmCurrentState.bus3State.reservedCircuitBreaker2 == BREAK_ON)? pdis3 -> reservedCircuitBreaker2 = 1 : pdis3 -> reservedCircuitBreaker2 = 0; +// (m_pmCurrentState.bus3State.emergencyLithiumBatteryGroup2CircuitBreaker == BREAK_ON)? pdis3 -> emergencyLithiumBatteryGroup2CircuitBreaker = 1 : pdis3 -> emergencyLithiumBatteryGroup2CircuitBreaker = 0; +// pdis3->paceholder = 0; +// m_currentDisBreakerState.bus3Breaker = *pdis3; +// delete pdis3; +// } +// if(!m_udpComm.m_qReceiveDisLowBusBuffer.empty()) +// { +// double time; +// m_udpComm.popMsgFormQueue(time,m_disLowBusState); +// m_pmCurrentState.bus4State = m_disLowBusState.data; +// m_db->insertDisLowBusData(m_disLowBusState.data); //写入数据库 +// msg_disLowBusFbMsg_Update_time = time; - disBus4Breaker* pdis4=new disBus4Breaker; - (m_pmCurrentState.bus4State.unit1CircuitBreaker == BREAK_ON)? pdis4 -> unit1CircuitBreaker = 1 : pdis4 -> unit1CircuitBreaker = 0; - (m_pmCurrentState.bus4State.unit2CircuitBreaker == BREAK_ON)? pdis4 -> unit2CircuitBreaker = 1 : pdis4 -> unit2CircuitBreaker = 0; - (m_pmCurrentState.bus4State.unit3CircuitBreaker == BREAK_ON)? pdis4 -> unit3CircuitBreaker = 1 : pdis4 -> unit3CircuitBreaker = 0; - (m_pmCurrentState.bus4State.unit5CircuitBreaker == BREAK_ON)? pdis4 -> unit5CircuitBreaker = 1 : pdis4 -> unit5CircuitBreaker = 0; - (m_pmCurrentState.bus4State.bowPZDeviceCircuitBreaker == BREAK_ON)? pdis4 -> bowPZDeviceCircuitBreaker = 1 : pdis4 -> bowPZDeviceCircuitBreaker = 0; - (m_pmCurrentState.bus4State.reservedCircuitBreaker1 == BREAK_ON)? pdis4 -> reservedCircuitBreaker1 = 1 : pdis4 -> reservedCircuitBreaker1 = 0; - (m_pmCurrentState.bus4State.reservedCircuitBreaker2 == BREAK_ON)? pdis4 -> reservedCircuitBreaker2 = 1 : pdis4 -> reservedCircuitBreaker2 = 0; - (m_pmCurrentState.bus4State.emergencyLithiumBatteryGroup1CircuitBreaker == BREAK_ON)? pdis4 -> emergencyLithiumBatteryGroup1CircuitBreaker = 1 : pdis4 -> emergencyLithiumBatteryGroup1CircuitBreaker = 0; - pdis4 -> paceholder = 0; - m_currentDisBreakerState.bus4Breaker = *pdis4; - delete pdis4; - } - return true; -} +// disBus4Breaker* pdis4=new disBus4Breaker; +// (m_pmCurrentState.bus4State.unit1CircuitBreaker == BREAK_ON)? pdis4 -> unit1CircuitBreaker = 1 : pdis4 -> unit1CircuitBreaker = 0; +// (m_pmCurrentState.bus4State.unit2CircuitBreaker == BREAK_ON)? pdis4 -> unit2CircuitBreaker = 1 : pdis4 -> unit2CircuitBreaker = 0; +// (m_pmCurrentState.bus4State.unit3CircuitBreaker == BREAK_ON)? pdis4 -> unit3CircuitBreaker = 1 : pdis4 -> unit3CircuitBreaker = 0; +// (m_pmCurrentState.bus4State.unit5CircuitBreaker == BREAK_ON)? pdis4 -> unit5CircuitBreaker = 1 : pdis4 -> unit5CircuitBreaker = 0; +// (m_pmCurrentState.bus4State.bowPZDeviceCircuitBreaker == BREAK_ON)? pdis4 -> bowPZDeviceCircuitBreaker = 1 : pdis4 -> bowPZDeviceCircuitBreaker = 0; +// (m_pmCurrentState.bus4State.reservedCircuitBreaker1 == BREAK_ON)? pdis4 -> reservedCircuitBreaker1 = 1 : pdis4 -> reservedCircuitBreaker1 = 0; +// (m_pmCurrentState.bus4State.reservedCircuitBreaker2 == BREAK_ON)? pdis4 -> reservedCircuitBreaker2 = 1 : pdis4 -> reservedCircuitBreaker2 = 0; +// (m_pmCurrentState.bus4State.emergencyLithiumBatteryGroup1CircuitBreaker == BREAK_ON)? pdis4 -> emergencyLithiumBatteryGroup1CircuitBreaker = 1 : pdis4 -> emergencyLithiumBatteryGroup1CircuitBreaker = 0; +// pdis4 -> paceholder = 0; +// m_currentDisBreakerState.bus4Breaker = *pdis4; +// delete pdis4; +// } +// return true; +// } bool PowerManger::IsSkewed(double dfTimeNow, double * pdfSkew) @@ -488,68 +478,68 @@ bool PowerManger::IsSkewed(double dfTimeNow, double * pdfSkew) return (dfSkew > SKEW_TOLERANCE) ? true : false; } -void PowerManger::ccuOption() -{ - m_db->insertCcuSysCmd(m_CcuColCmd); - if(!m_udpComm.sendCcuColCmd(m_CcuColCmd)) - cout << "send ccu col cmd failed!" << endl; -} -void PowerManger::disSysOption() -{ +// void PowerManger::ccuOption() +// { +// m_db->insertCcuSysCmd(m_CcuColCmd); +// if(!m_udpComm.sendCcuColCmd(m_CcuColCmd)) +// cout << "send ccu col cmd failed!" << endl; +// } +// void PowerManger::disSysOption() +// { - //根据目标状态进行断路器操作 - //a. 高压母线的断路器 - disHighVolBusCmd a; - a.fuelCellCircuitBreaker = getBreakerOption(m_targetDisBreakerState.bus1Breaker.fuelCellCircuitBreaker); - a.lithiumBatteryGroupInstrumentCircuitBreaker = getBreakerOption(m_targetDisBreakerState.bus1Breaker.lithiumBatteryGroupInstrumentCircuitBreaker); - a.dcDc5ModuleCircuitBreaker = getBreakerOption(m_targetDisBreakerState.bus1Breaker.dcDc5ModuleCircuitBreaker); - a.powerLithiumBatteryCircuitBreaker = getBreakerOption(m_targetDisBreakerState.bus1Breaker.powerLithiumBatteryCircuitBreaker); - a.propulsionMotorCircuitBreaker = getBreakerOption(m_targetDisBreakerState.bus1Breaker.propulsionMotorCircuitBreaker); - a.bowHighVoltageDistributionBoxCircuitBreaker = getBreakerOption(m_targetDisBreakerState.bus1Breaker.bowHighVoltageDistributionBoxCircuitBreaker); - a.tyzReservedCircuitBreaker = getBreakerOption(m_targetDisBreakerState.bus1Breaker.tyzReservedCircuitBreaker); - a.sternFTDevice45CircuitBreaker = getBreakerOption(m_targetDisBreakerState.bus1Breaker.sternFTDevice45CircuitBreaker); - a.sternRudderSwitch1CircuitBreaker = getBreakerOption(m_targetDisBreakerState.bus1Breaker.sternRudderSwitch1CircuitBreaker); - a.sternRudderSwitch2CircuitBreaker = getBreakerOption(m_targetDisBreakerState.bus1Breaker.sternRudderSwitch2CircuitBreaker); - a.reservedCircuitBreaker = getBreakerOption(m_targetDisBreakerState.bus1Breaker.reservedCircuitBreaker); - a.fbReservedCircuitBreaker = getBreakerOption(m_targetDisBreakerState.bus1Breaker.fbReservedCircuitBreaker); - m_udpComm.sendDisSysCmd(a); -//b. 高压汇流排A断路器 - disHighAVolBusCmd b; - b.bowFTDevice123CircuitBreaker = getBreakerOption(m_targetDisBreakerState.bus2Breaker.bowFTDevice123CircuitBreaker); - b.actuatorCircuitBreaker = getBreakerOption(m_targetDisBreakerState.bus2Breaker.actuatorCircuitBreaker); - b.mastSteeringGearControlBoxCircuitBreaker = getBreakerOption(m_targetDisBreakerState.bus2Breaker.mastSteeringGearControlBoxCircuitBreaker); - b.xczCircuitBreaker = getBreakerOption(m_targetDisBreakerState.bus2Breaker.xczCircuitBreaker); - b.bowRudderControlBoxCircuitBreaker = getBreakerOption(m_targetDisBreakerState.bus2Breaker.bowRudderControlBoxCircuitBreaker); - b.openWaterCoverStartCylinderCircuitBreaker = getBreakerOption(m_targetDisBreakerState.bus2Breaker.openWaterCoverStartCylinderCircuitBreaker); - m_udpComm.sendDisSysCmd(b); -//c. 高压汇流排B断路器 - disHighBVolBusCmd c; - c.lithiumBatteryGroupInstrumentCircuitBreaker = getBreakerOption(m_targetDisBreakerState.bus3Breaker.lithiumBatteryGroupInstrumentCircuitBreaker); - c.bowLowVoltageDistributionBoxCircuitBreaker = getBreakerOption(m_targetDisBreakerState.bus3Breaker.bowLowVoltageDistributionBoxCircuitBreaker); - c.unit4InstrumentDC48VCircuitBreaker = getBreakerOption(m_targetDisBreakerState.bus3Breaker.unit4InstrumentDC48VCircuitBreaker); - c.dcC1DCDistributionPanelCircuitBreaker = getBreakerOption(m_targetDisBreakerState.bus3Breaker.dcC1DCDistributionPanelCircuitBreaker); - c.reservedCircuitBreaker1 = getBreakerOption(m_targetDisBreakerState.bus3Breaker.reservedCircuitBreaker1); - c.reservedCircuitBreaker2 = getBreakerOption(m_targetDisBreakerState.bus3Breaker.reservedCircuitBreaker2); - c.emergencyLithiumBatteryGroup2CircuitBreaker = getBreakerOption(m_targetDisBreakerState.bus3Breaker.emergencyLithiumBatteryGroup2CircuitBreaker); - m_udpComm.sendDisSysCmd(c); -//d. 闭合低压汇流排断路器 - disLowBusCmd d; - d.unit1CircuitBreaker = getBreakerOption(m_targetDisBreakerState.bus4Breaker.unit1CircuitBreaker); - d.unit2CircuitBreaker = getBreakerOption(m_targetDisBreakerState.bus4Breaker.unit2CircuitBreaker); - d.unit3CircuitBreaker = getBreakerOption(m_targetDisBreakerState.bus4Breaker.unit3CircuitBreaker); - d.unit5CircuitBreaker = getBreakerOption(m_targetDisBreakerState.bus4Breaker.unit5CircuitBreaker); - d.bowPZDeviceCircuitBreaker = getBreakerOption(m_targetDisBreakerState.bus4Breaker.bowPZDeviceCircuitBreaker); - d.reservedCircuitBreaker1 = getBreakerOption(m_targetDisBreakerState.bus4Breaker.reservedCircuitBreaker1); - d.reservedCircuitBreaker2 = getBreakerOption(m_targetDisBreakerState.bus4Breaker.reservedCircuitBreaker2); - d.emergencyLithiumBatteryGroup1CircuitBreaker = getBreakerOption(m_targetDisBreakerState.bus4Breaker.emergencyLithiumBatteryGroup1CircuitBreaker); - m_udpComm.sendDisSysCmd(d); - //将指令写入数据库 - m_db->insertDisSysCmd(a); - m_db->insertDisSysCmd(b); - m_db->insertDisSysCmd(c); - m_db->insertDisSysCmd(d); +// //根据目标状态进行断路器操作 +// //a. 高压母线的断路器 +// disHighVolBusCmd a; +// a.fuelCellCircuitBreaker = getBreakerOption(m_targetDisBreakerState.bus1Breaker.fuelCellCircuitBreaker); +// a.lithiumBatteryGroupInstrumentCircuitBreaker = getBreakerOption(m_targetDisBreakerState.bus1Breaker.lithiumBatteryGroupInstrumentCircuitBreaker); +// a.dcDc5ModuleCircuitBreaker = getBreakerOption(m_targetDisBreakerState.bus1Breaker.dcDc5ModuleCircuitBreaker); +// a.powerLithiumBatteryCircuitBreaker = getBreakerOption(m_targetDisBreakerState.bus1Breaker.powerLithiumBatteryCircuitBreaker); +// a.propulsionMotorCircuitBreaker = getBreakerOption(m_targetDisBreakerState.bus1Breaker.propulsionMotorCircuitBreaker); +// a.bowHighVoltageDistributionBoxCircuitBreaker = getBreakerOption(m_targetDisBreakerState.bus1Breaker.bowHighVoltageDistributionBoxCircuitBreaker); +// a.tyzReservedCircuitBreaker = getBreakerOption(m_targetDisBreakerState.bus1Breaker.tyzReservedCircuitBreaker); +// a.sternFTDevice45CircuitBreaker = getBreakerOption(m_targetDisBreakerState.bus1Breaker.sternFTDevice45CircuitBreaker); +// a.sternRudderSwitch1CircuitBreaker = getBreakerOption(m_targetDisBreakerState.bus1Breaker.sternRudderSwitch1CircuitBreaker); +// a.sternRudderSwitch2CircuitBreaker = getBreakerOption(m_targetDisBreakerState.bus1Breaker.sternRudderSwitch2CircuitBreaker); +// a.reservedCircuitBreaker = getBreakerOption(m_targetDisBreakerState.bus1Breaker.reservedCircuitBreaker); +// a.fbReservedCircuitBreaker = getBreakerOption(m_targetDisBreakerState.bus1Breaker.fbReservedCircuitBreaker); +// m_udpComm.sendDisSysCmd(a); +// //b. 高压汇流排A断路器 +// disHighAVolBusCmd b; +// b.bowFTDevice123CircuitBreaker = getBreakerOption(m_targetDisBreakerState.bus2Breaker.bowFTDevice123CircuitBreaker); +// b.actuatorCircuitBreaker = getBreakerOption(m_targetDisBreakerState.bus2Breaker.actuatorCircuitBreaker); +// b.mastSteeringGearControlBoxCircuitBreaker = getBreakerOption(m_targetDisBreakerState.bus2Breaker.mastSteeringGearControlBoxCircuitBreaker); +// b.xczCircuitBreaker = getBreakerOption(m_targetDisBreakerState.bus2Breaker.xczCircuitBreaker); +// b.bowRudderControlBoxCircuitBreaker = getBreakerOption(m_targetDisBreakerState.bus2Breaker.bowRudderControlBoxCircuitBreaker); +// b.openWaterCoverStartCylinderCircuitBreaker = getBreakerOption(m_targetDisBreakerState.bus2Breaker.openWaterCoverStartCylinderCircuitBreaker); +// m_udpComm.sendDisSysCmd(b); +// //c. 高压汇流排B断路器 +// disHighBVolBusCmd c; +// c.lithiumBatteryGroupInstrumentCircuitBreaker = getBreakerOption(m_targetDisBreakerState.bus3Breaker.lithiumBatteryGroupInstrumentCircuitBreaker); +// c.bowLowVoltageDistributionBoxCircuitBreaker = getBreakerOption(m_targetDisBreakerState.bus3Breaker.bowLowVoltageDistributionBoxCircuitBreaker); +// c.unit4InstrumentDC48VCircuitBreaker = getBreakerOption(m_targetDisBreakerState.bus3Breaker.unit4InstrumentDC48VCircuitBreaker); +// c.dcC1DCDistributionPanelCircuitBreaker = getBreakerOption(m_targetDisBreakerState.bus3Breaker.dcC1DCDistributionPanelCircuitBreaker); +// c.reservedCircuitBreaker1 = getBreakerOption(m_targetDisBreakerState.bus3Breaker.reservedCircuitBreaker1); +// c.reservedCircuitBreaker2 = getBreakerOption(m_targetDisBreakerState.bus3Breaker.reservedCircuitBreaker2); +// c.emergencyLithiumBatteryGroup2CircuitBreaker = getBreakerOption(m_targetDisBreakerState.bus3Breaker.emergencyLithiumBatteryGroup2CircuitBreaker); +// m_udpComm.sendDisSysCmd(c); +// //d. 闭合低压汇流排断路器 +// disLowBusCmd d; +// d.unit1CircuitBreaker = getBreakerOption(m_targetDisBreakerState.bus4Breaker.unit1CircuitBreaker); +// d.unit2CircuitBreaker = getBreakerOption(m_targetDisBreakerState.bus4Breaker.unit2CircuitBreaker); +// d.unit3CircuitBreaker = getBreakerOption(m_targetDisBreakerState.bus4Breaker.unit3CircuitBreaker); +// d.unit5CircuitBreaker = getBreakerOption(m_targetDisBreakerState.bus4Breaker.unit5CircuitBreaker); +// d.bowPZDeviceCircuitBreaker = getBreakerOption(m_targetDisBreakerState.bus4Breaker.bowPZDeviceCircuitBreaker); +// d.reservedCircuitBreaker1 = getBreakerOption(m_targetDisBreakerState.bus4Breaker.reservedCircuitBreaker1); +// d.reservedCircuitBreaker2 = getBreakerOption(m_targetDisBreakerState.bus4Breaker.reservedCircuitBreaker2); +// d.emergencyLithiumBatteryGroup1CircuitBreaker = getBreakerOption(m_targetDisBreakerState.bus4Breaker.emergencyLithiumBatteryGroup1CircuitBreaker); +// m_udpComm.sendDisSysCmd(d); +// //将指令写入数据库 +// m_db->insertDisSysCmd(a); +// m_db->insertDisSysCmd(b); +// m_db->insertDisSysCmd(c); +// m_db->insertDisSysCmd(d); -} +// } bool PowerManger::saveStringToJsonFile(const string &strJson, const string &filePath) @@ -568,7 +558,6 @@ bool PowerManger::saveStringToJsonFile(const string &strJson, const string &file bool PowerManger::writeDataToDB() { - // //写入配电系统状态 // if(!m_db->insertDisCcuData(m_pmCurrentState)) // return false; diff --git a/src/pPowerManger/PowerManger.h b/src/pPowerManger/PowerManger.h index 3a397bf..3c90208 100644 --- a/src/pPowerManger/PowerManger.h +++ b/src/pPowerManger/PowerManger.h @@ -36,6 +36,7 @@ class PowerManagerFsm; #include "PowerManagerFsm.hpp" #include "SQLiteDB.h" #include "driver.h" +#include "LowerCommManager.h" #define VAR_TO_STR(var) #var @@ -99,34 +100,44 @@ class PowerManger : public AppCastingMOOSApp double msg_disHighAVolBusFbMsg_Update_time; double msg_disHighBVolBusFbMsg_Update_time; double msg_disLowBusFbMsg_Update_time; + /************************************************************/ + /* |<------------FEEDBACK--------<-- */ + /* | | */ + /* IN-->+-------[STATE CONTROL]---------+--->OUT */ + /* */ + /************************************************************/ public: - //===========================交互状态变量================================== - Driver m_driver; //设备驱动 + //===========================IN============================================ + DriverTable m_MSDriverCmd; + MSControlCmd m_msCmd; + //===========================OUT=========================================== + DriverTable m_subDisSysCmd; + ccuColCmd m_CcuColCmd; + disSysBreakerList m_targetDisBreakerState; + //===========================FEEDBACK====================================== pmState m_pmCurrentState; //能源系统的当前状态 disSysBreakerList m_currentDisBreakerState; //配电断路器状态 - disSysBreakerList m_targetDisBreakerState; DriverTable m_currentDriverState; - DriverTable m_MSDriverCmd; - DriverTable m_subDisSysCmd; DriverTable m_subDisSysState; - std::string m_pmEvent; // 状态机事件描述 - //=============================运行变量====================================== + //===========================STATE========================================= + unsigned char workCondition; + unsigned char currentMod; + unsigned char powerState; + unsigned char falutLevel; + vector faultCode; + unsigned int soc; + unsigned int sustainableTime; + //===========================CONFIG======================================== long m_lPort; unsigned int m_nReceiveBufferSizeKB; unsigned int m_nSendBufferSizeKB; double m_current_time; unsigned int m_faultNum; unsigned int m_ticker; -//=========================================================================== - //系统运行状态 - unsigned char workCondition; - unsigned char currentMod; - unsigned char powerState; - unsigned char falutLevel; - vector faultCode; - unsigned int soc; - unsigned int sustainableTime; - + //===========================交互状态变量================================== + Driver m_driver; //设备驱动 + std::string m_pmEvent; // 状态机事件描述 + //=============================运行变量====================================== // 配电和CCU的反馈状态 msg_CcuStateFbMsg m_CcuCurrentState; msg_disHighVolBusFbMsg m_disHighVolBusCurrentState; @@ -135,7 +146,6 @@ class PowerManger : public AppCastingMOOSApp msg_disLowBusFbMsg m_disLowBusState; //下位机操作函数 - ccuColCmd m_CcuColCmd; void disSysOption(); void ccuOption(); @@ -143,16 +153,15 @@ class PowerManger : public AppCastingMOOSApp void initControlCmd(); //上位机操作函数 - MSControlCmd m_msCmd; + bool buildPowerSysReport(); bool getMsCmdFromJson(MSControlCmd &cmd,const string &strJson); private: - udpComm m_udpComm; - XPCUdpSocket *m_pCcuUdpComm; CMOOSThread m_ListenThread; CMOOSThread m_FsmThread; - + LowerCommManager* m_lowerCommManager; + // 状态机实例 PowerManagerFsm m_fsm; diff --git a/src/pPowerManger/UpperCommManager.cpp b/src/pPowerManger/UpperCommManager.cpp new file mode 100644 index 0000000..c760d54 --- /dev/null +++ b/src/pPowerManger/UpperCommManager.cpp @@ -0,0 +1,45 @@ +#include "UpperCommManager.h" +#include "PowerManger.h" +#include "driver.h" + +UpperCommManager::UpperCommManager(PowerManger* pm) : m_pm(pm) {} + +bool UpperCommManager::processUpperMsg(const string& key, const string& strJson) { + if(key == DB_TO_PM_MSCMD) { + if(m_pm->getMsCmdFromJson(m_pm->m_msCmd, strJson)) { + cout << "get ms cmd:" << strJson << endl; + return true; + } else { + cout << MOOS::ConsoleColours::Red << "get ms cmd error:" << strJson + << MOOS::ConsoleColours::reset << endl; + } + } + else if(key == DB_TO_PM_EQUIPMENTCMD) { + if(m_pm->m_driver.loadDriverTableFromJson(strJson, m_pm->m_subDisSysCmd) < 0) { + cout << MOOS::ConsoleColours::Red << "get sub dis cmd error:" << strJson + << MOOS::ConsoleColours::reset << endl; + } + return true; + } + else if(key == DB_TO_PM_SUBDISSTATE) { + if(m_pm->m_driver.loadDriverTableFromJson(strJson, m_pm->m_subDisSysState) < 0) { + cout << MOOS::ConsoleColours::Red << "get sub dis state error:" << strJson + << MOOS::ConsoleColours::reset << endl; + } + return true; + } + return false; +} + +void UpperCommManager::processPeriodicTasks() { + buildPowerSysReport(); + Notify(PM_TO_DB_SUBDISCMD, + m_pm->m_driver.saveDriverTableToJson(&m_pm->m_subDisSysCmd)); + Notify(PM_TO_DB_EQUIPMENTSTATE, + m_pm->m_driver.saveDriverTableToJson(&m_pm->m_currentDriverState)); +} + +void UpperCommManager::buildPowerSysReport() { + // 原有buildPowerSysReport实现 + // 需要从PowerManger.cpp迁移过来 +} \ No newline at end of file diff --git a/src/pPowerManger/UpperCommManager.h b/src/pPowerManger/UpperCommManager.h new file mode 100644 index 0000000..8af515c --- /dev/null +++ b/src/pPowerManger/UpperCommManager.h @@ -0,0 +1,37 @@ +#ifndef UPPER_COMM_MANAGER_H +#define UPPER_COMM_MANAGER_H + +#include "MOOS/libMOOS/Thirdparty/AppCasting/AppCastingMOOSApp.h" +#include "pmSysvariable.h" +#include "driver.h" +#include "json/json.h" + +class PowerManger; // 前向声明 + +class UpperCommManager { +public: + UpperCommManager(PowerManger* powerManager); + ~UpperCommManager(); + + // 处理上位机消息 + bool processUpperMsg(const std::string& key, const std::string& msg); + + // 生成系统报告 + bool buildSystemReport(); + + // 获取控制命令 + const MSControlCmd& getControlCmd() const { return m_msCmd; } + + // 更新设备命令状态 + void updateEquipmentCmd(const DriverTable& cmd); + +private: + PowerManger* m_powerManager; + MSControlCmd m_msCmd; + Driver m_driver; + + // 从JSON解析控制命令 + bool parseControlCmdFromJson(MSControlCmd &cmd, const std::string &strJson); +}; + +#endif // UPPER_COMM_MANAGER_H \ No newline at end of file diff --git a/src/pPowerManger/udpComm.cpp b/src/pPowerManger/udpComm.cpp index ef9c97e..fdc28e3 100644 --- a/src/pPowerManger/udpComm.cpp +++ b/src/pPowerManger/udpComm.cpp @@ -4,10 +4,17 @@ udpComm::udpComm() { - + udpScoket = nullptr; + ccuHost = ""; + ccuPort = 0; } -udpComm::~udpComm() {} +udpComm::~udpComm() { + if (udpScoket) { + delete udpScoket; + udpScoket = nullptr; + } +} Checksum udpComm::calculateChecksum(const unsigned char* data, int size) @@ -490,6 +497,12 @@ bool udpComm::sendCcuColCmd(const ccuColCmd cmd) msg->checkCode = static_cast(cc & 0xFF); try { + if(udpScoket == nullptr) { + throw std::runtime_error("UDP socket not initialized"); + } + if(ccuHost.empty() || ccuPort <= 0 || ccuPort > 65535) { + throw std::runtime_error("Invalid CCU address: " + ccuHost + ":" + std::to_string(ccuPort)); + } sendMsg(msgBuf,sizeof(msg_CcuColCmdMsg)); } catch(const std::exception& e) From b5a746c2eff836e859db606163e89cd321163c0d Mon Sep 17 00:00:00 2001 From: zhaojingkui <1553836110@qq.com> Date: Mon, 7 Apr 2025 21:45:19 +0800 Subject: [PATCH 5/9] =?UTF-8?q?=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- missions/pPowerManger.moos | 5 +++++ src/pPowerManger/LowerCommManager.cpp | 18 +++++++++--------- src/pPowerManger/PowerManger.cpp | 25 +++++++++++++------------ src/pPowerManger/PowerManger.h | 7 ++++--- 4 files changed, 31 insertions(+), 24 deletions(-) create mode 100644 missions/pPowerManger.moos diff --git a/missions/pPowerManger.moos b/missions/pPowerManger.moos new file mode 100644 index 0000000..3fe4061 --- /dev/null +++ b/missions/pPowerManger.moos @@ -0,0 +1,5 @@ +ProcessConfig = pPowerManger +{ + AppTick = 4 + CommsTick = 4 +} \ No newline at end of file diff --git a/src/pPowerManger/LowerCommManager.cpp b/src/pPowerManger/LowerCommManager.cpp index e32e198..4a69676 100644 --- a/src/pPowerManger/LowerCommManager.cpp +++ b/src/pPowerManger/LowerCommManager.cpp @@ -14,10 +14,10 @@ LowerCommManager::LowerCommManager(PowerManger* pm, long myPort, long ccuPort, c m_udpComm = new udpComm(); m_port = myPort; m_udpComm->ccuHost = cccHost; - if(ccuPort < 0 || ccuPort > 65535) { - throw std::invalid_argument("Invalid CCU port: " + std::to_string(ccuPort)); - } - m_udpComm->ccuPort = static_cast(ccuPort); + m_udpComm->ccuPort = ccuPort; + m_udpComm->udpScoket = new XPCUdpSocket(m_port); + m_udpSocket = new XPCUdpSocket(2000); + } LowerCommManager::~LowerCommManager(){ @@ -33,16 +33,16 @@ LowerCommManager::~LowerCommManager(){ } bool LowerCommManager::initUdpComm(){ //设置UDP监听端口 - XPCUdpSocket* m_udpSocket = new XPCUdpSocket(m_port); - if(m_udpSocket) +// XPCUdpSocket* m_udpSocket = new XPCUdpSocket(m_port); + if(m_udpComm->udpScoket) { try { - m_udpSocket->vBindSocket(); + m_udpComm->udpScoket->vBindSocket(); m_udpComm->ccuHost = m_ccuHost; m_udpComm->ccuPort = m_ccuPort; cout<udpScoket = m_udpSocket; + // m_udpComm->udpScoket = m_udpSocket; } catch(const std::exception& e) { @@ -62,8 +62,8 @@ bool LowerCommManager::initUdpComm(){ void LowerCommManager::processPeriodicTasks() { // sendCcuCommand(m_pm->m_CcuColCmd); // sendDisSysCommand(m_pm->m_targetDisBreakerState); + m_udpSocket->iSendMessageTo((void*) "hello", 5, m_ccuPort, m_ccuHost); int msg = 10; - m_udpComm->udpScoket->iSendMessageTo((void*) msg, 6, m_udpComm->ccuPort, "127.0.0.1"); m_udpComm->clearMsgQueue(); } diff --git a/src/pPowerManger/PowerManger.cpp b/src/pPowerManger/PowerManger.cpp index d4f11a9..7c6ec8a 100644 --- a/src/pPowerManger/PowerManger.cpp +++ b/src/pPowerManger/PowerManger.cpp @@ -73,6 +73,7 @@ PowerManger::PowerManger() //初始化UDP通信 m_lowerCommManager = new LowerCommManager(this,IPORT,CCUPORT,CCUHOST); + m_lowerCommManager->initUdpComm(); // 初始化状态机 @@ -328,19 +329,19 @@ XPCUdpSocket* PowerManger::setUdpScoket(long lPort) bool PowerManger::FsmLoop() { //状态机循环 - while (!m_FsmThread.IsQuitRequested()) - { - // // 检查故障并触发事件 - // if(int error = checkError()) { - // m_fsm.triggerFaultEvent(error); - // } else { - // // 自动状态转换由状态机内部处理 - // MOOSPause(1000); - // } + // while (!m_FsmThread.IsQuitRequested()) + // { + // // // 检查故障并触发事件 + // // if(int error = checkError()) { + // // m_fsm.triggerFaultEvent(error); + // // } else { + // // // 自动状态转换由状态机内部处理 + // // MOOSPause(1000); + // // } - //延时1s - usleep(1000000); - } + // //延时1s + // usleep(1000000); + // } return true; } diff --git a/src/pPowerManger/PowerManger.h b/src/pPowerManger/PowerManger.h index 3c90208..5c148a8 100644 --- a/src/pPowerManger/PowerManger.h +++ b/src/pPowerManger/PowerManger.h @@ -26,7 +26,7 @@ class PowerManagerFsm; #include #include "MOOS/libMOOS/Thirdparty/AppCasting/AppCastingMOOSApp.h" #include "MOOS/libMOOS/Utils/MOOSThread.h" -#include "MOOS/libMOOS/Comms/XPCUdpSocket.h" +// #include "MOOS/libMOOS/Comms/XPCUdpSocket.h" #include "MOOS/libMOOS/Utils/MOOSUtilityFunctions.h" #include "MOOS/libMOOS/Utils/ConsoleColours.h" #include "ccuUdpMsg.h" @@ -158,9 +158,10 @@ class PowerManger : public AppCastingMOOSApp bool getMsCmdFromJson(MSControlCmd &cmd,const string &strJson); private: - CMOOSThread m_ListenThread; - CMOOSThread m_FsmThread; + // CMOOSThread m_ListenThread; + // CMOOSThread m_FsmThread; LowerCommManager* m_lowerCommManager; + XPCUdpSocket* m_udpSocket; // 状态机实例 PowerManagerFsm m_fsm; From 35e5d5230edc4c96c8a56f470de78383f5d6a7a0 Mon Sep 17 00:00:00 2001 From: zhaojingkui <1553836110@qq.com> Date: Mon, 7 Apr 2025 22:16:56 +0800 Subject: [PATCH 6/9] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E4=BA=86udp=E7=9A=84?= =?UTF-8?q?=E9=94=99=E8=AF=AF=E5=8F=91=E9=80=81=E6=95=B0=E6=8D=AE=E5=B0=B1?= =?UTF-8?q?=E6=8A=A5=E9=94=99=E7=9A=84=E6=95=85=E9=9A=9C,=E8=8E=AB?= =?UTF-8?q?=E5=90=8D=E5=85=B6=E5=A6=99=E5=A5=BD=E7=9A=84,=E7=9C=9F?= =?UTF-8?q?=E6=98=AF=E5=A5=87=E6=80=AA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/pPowerManger/LowerCommManager.cpp | 14 ++---- src/pPowerManger/LowerCommManager.h | 3 +- src/pPowerManger/PowerManger.cpp | 72 +-------------------------- src/pPowerManger/udpComm.h | 1 + 4 files changed, 8 insertions(+), 82 deletions(-) diff --git a/src/pPowerManger/LowerCommManager.cpp b/src/pPowerManger/LowerCommManager.cpp index 4a69676..df27731 100644 --- a/src/pPowerManger/LowerCommManager.cpp +++ b/src/pPowerManger/LowerCommManager.cpp @@ -16,8 +16,10 @@ LowerCommManager::LowerCommManager(PowerManger* pm, long myPort, long ccuPort, c m_udpComm->ccuHost = cccHost; m_udpComm->ccuPort = ccuPort; m_udpComm->udpScoket = new XPCUdpSocket(m_port); - m_udpSocket = new XPCUdpSocket(2000); + std::cout << "PORT = " << m_port << std::endl; + std::cout << "CCUHOST = " << m_udpComm->ccuHost << std::endl; + std::cout << "CCUPORT = " << m_udpComm->ccuPort << std::endl; } LowerCommManager::~LowerCommManager(){ @@ -33,16 +35,12 @@ LowerCommManager::~LowerCommManager(){ } bool LowerCommManager::initUdpComm(){ //设置UDP监听端口 -// XPCUdpSocket* m_udpSocket = new XPCUdpSocket(m_port); if(m_udpComm->udpScoket) { try { m_udpComm->udpScoket->vBindSocket(); - m_udpComm->ccuHost = m_ccuHost; - m_udpComm->ccuPort = m_ccuPort; cout<udpScoket = m_udpSocket; } catch(const std::exception& e) { @@ -60,10 +58,8 @@ bool LowerCommManager::initUdpComm(){ return true; } void LowerCommManager::processPeriodicTasks() { - // sendCcuCommand(m_pm->m_CcuColCmd); - // sendDisSysCommand(m_pm->m_targetDisBreakerState); - m_udpSocket->iSendMessageTo((void*) "hello", 5, m_ccuPort, m_ccuHost); - int msg = 10; + sendCcuCommand(m_pm->m_CcuColCmd); + sendDisSysCommand(m_pm->m_targetDisBreakerState); m_udpComm->clearMsgQueue(); } diff --git a/src/pPowerManger/LowerCommManager.h b/src/pPowerManger/LowerCommManager.h index 9d67c5a..496a9bb 100644 --- a/src/pPowerManger/LowerCommManager.h +++ b/src/pPowerManger/LowerCommManager.h @@ -33,7 +33,7 @@ public: bool initUdpComm(); // 更新设备状态 - bool updateDeviceStates(); + bool updatePoweSystemStates(); // 发送CCU控制命令 bool sendCcuCommand(const ccuColCmd cmd); @@ -57,7 +57,6 @@ public: PowerManger* m_pm; udpComm* m_udpComm; - XPCUdpSocket* m_udpSocket; CMOOSThread m_ListenThread; int m_connectState; diff --git a/src/pPowerManger/PowerManger.cpp b/src/pPowerManger/PowerManger.cpp index 7c6ec8a..158b04d 100644 --- a/src/pPowerManger/PowerManger.cpp +++ b/src/pPowerManger/PowerManger.cpp @@ -14,12 +14,6 @@ using namespace std; -// bool _ListenCB(void * pParam) -// { -// // PowerManger* pMe = (PowerManger* )pParam; -// // return pMe->ListenLoopUDP(); -// } - bool _FsmCB(void * pParam) { PowerManger* pMe = (PowerManger* )pParam; @@ -73,7 +67,6 @@ PowerManger::PowerManger() //初始化UDP通信 m_lowerCommManager = new LowerCommManager(this,IPORT,CCUPORT,CCUHOST); - m_lowerCommManager->initUdpComm(); // 初始化状态机 @@ -194,6 +187,7 @@ bool PowerManger::Iterate() writeDataToDB(); } m_lowerCommManager->processPeriodicTasks(); + /////////////////////// // string a = m_driver.getSubDisCmdJson(&m_subDisSysCmd); // saveStringToJsonFile(a,"/home/zjk/project/H100/H100PowerManger/data/subDisSysCmd.json"); @@ -479,70 +473,6 @@ bool PowerManger::IsSkewed(double dfTimeNow, double * pdfSkew) return (dfSkew > SKEW_TOLERANCE) ? true : false; } -// void PowerManger::ccuOption() -// { -// m_db->insertCcuSysCmd(m_CcuColCmd); -// if(!m_udpComm.sendCcuColCmd(m_CcuColCmd)) -// cout << "send ccu col cmd failed!" << endl; -// } -// void PowerManger::disSysOption() -// { - -// //根据目标状态进行断路器操作 -// //a. 高压母线的断路器 -// disHighVolBusCmd a; -// a.fuelCellCircuitBreaker = getBreakerOption(m_targetDisBreakerState.bus1Breaker.fuelCellCircuitBreaker); -// a.lithiumBatteryGroupInstrumentCircuitBreaker = getBreakerOption(m_targetDisBreakerState.bus1Breaker.lithiumBatteryGroupInstrumentCircuitBreaker); -// a.dcDc5ModuleCircuitBreaker = getBreakerOption(m_targetDisBreakerState.bus1Breaker.dcDc5ModuleCircuitBreaker); -// a.powerLithiumBatteryCircuitBreaker = getBreakerOption(m_targetDisBreakerState.bus1Breaker.powerLithiumBatteryCircuitBreaker); -// a.propulsionMotorCircuitBreaker = getBreakerOption(m_targetDisBreakerState.bus1Breaker.propulsionMotorCircuitBreaker); -// a.bowHighVoltageDistributionBoxCircuitBreaker = getBreakerOption(m_targetDisBreakerState.bus1Breaker.bowHighVoltageDistributionBoxCircuitBreaker); -// a.tyzReservedCircuitBreaker = getBreakerOption(m_targetDisBreakerState.bus1Breaker.tyzReservedCircuitBreaker); -// a.sternFTDevice45CircuitBreaker = getBreakerOption(m_targetDisBreakerState.bus1Breaker.sternFTDevice45CircuitBreaker); -// a.sternRudderSwitch1CircuitBreaker = getBreakerOption(m_targetDisBreakerState.bus1Breaker.sternRudderSwitch1CircuitBreaker); -// a.sternRudderSwitch2CircuitBreaker = getBreakerOption(m_targetDisBreakerState.bus1Breaker.sternRudderSwitch2CircuitBreaker); -// a.reservedCircuitBreaker = getBreakerOption(m_targetDisBreakerState.bus1Breaker.reservedCircuitBreaker); -// a.fbReservedCircuitBreaker = getBreakerOption(m_targetDisBreakerState.bus1Breaker.fbReservedCircuitBreaker); -// m_udpComm.sendDisSysCmd(a); -// //b. 高压汇流排A断路器 -// disHighAVolBusCmd b; -// b.bowFTDevice123CircuitBreaker = getBreakerOption(m_targetDisBreakerState.bus2Breaker.bowFTDevice123CircuitBreaker); -// b.actuatorCircuitBreaker = getBreakerOption(m_targetDisBreakerState.bus2Breaker.actuatorCircuitBreaker); -// b.mastSteeringGearControlBoxCircuitBreaker = getBreakerOption(m_targetDisBreakerState.bus2Breaker.mastSteeringGearControlBoxCircuitBreaker); -// b.xczCircuitBreaker = getBreakerOption(m_targetDisBreakerState.bus2Breaker.xczCircuitBreaker); -// b.bowRudderControlBoxCircuitBreaker = getBreakerOption(m_targetDisBreakerState.bus2Breaker.bowRudderControlBoxCircuitBreaker); -// b.openWaterCoverStartCylinderCircuitBreaker = getBreakerOption(m_targetDisBreakerState.bus2Breaker.openWaterCoverStartCylinderCircuitBreaker); -// m_udpComm.sendDisSysCmd(b); -// //c. 高压汇流排B断路器 -// disHighBVolBusCmd c; -// c.lithiumBatteryGroupInstrumentCircuitBreaker = getBreakerOption(m_targetDisBreakerState.bus3Breaker.lithiumBatteryGroupInstrumentCircuitBreaker); -// c.bowLowVoltageDistributionBoxCircuitBreaker = getBreakerOption(m_targetDisBreakerState.bus3Breaker.bowLowVoltageDistributionBoxCircuitBreaker); -// c.unit4InstrumentDC48VCircuitBreaker = getBreakerOption(m_targetDisBreakerState.bus3Breaker.unit4InstrumentDC48VCircuitBreaker); -// c.dcC1DCDistributionPanelCircuitBreaker = getBreakerOption(m_targetDisBreakerState.bus3Breaker.dcC1DCDistributionPanelCircuitBreaker); -// c.reservedCircuitBreaker1 = getBreakerOption(m_targetDisBreakerState.bus3Breaker.reservedCircuitBreaker1); -// c.reservedCircuitBreaker2 = getBreakerOption(m_targetDisBreakerState.bus3Breaker.reservedCircuitBreaker2); -// c.emergencyLithiumBatteryGroup2CircuitBreaker = getBreakerOption(m_targetDisBreakerState.bus3Breaker.emergencyLithiumBatteryGroup2CircuitBreaker); -// m_udpComm.sendDisSysCmd(c); -// //d. 闭合低压汇流排断路器 -// disLowBusCmd d; -// d.unit1CircuitBreaker = getBreakerOption(m_targetDisBreakerState.bus4Breaker.unit1CircuitBreaker); -// d.unit2CircuitBreaker = getBreakerOption(m_targetDisBreakerState.bus4Breaker.unit2CircuitBreaker); -// d.unit3CircuitBreaker = getBreakerOption(m_targetDisBreakerState.bus4Breaker.unit3CircuitBreaker); -// d.unit5CircuitBreaker = getBreakerOption(m_targetDisBreakerState.bus4Breaker.unit5CircuitBreaker); -// d.bowPZDeviceCircuitBreaker = getBreakerOption(m_targetDisBreakerState.bus4Breaker.bowPZDeviceCircuitBreaker); -// d.reservedCircuitBreaker1 = getBreakerOption(m_targetDisBreakerState.bus4Breaker.reservedCircuitBreaker1); -// d.reservedCircuitBreaker2 = getBreakerOption(m_targetDisBreakerState.bus4Breaker.reservedCircuitBreaker2); -// d.emergencyLithiumBatteryGroup1CircuitBreaker = getBreakerOption(m_targetDisBreakerState.bus4Breaker.emergencyLithiumBatteryGroup1CircuitBreaker); -// m_udpComm.sendDisSysCmd(d); -// //将指令写入数据库 -// m_db->insertDisSysCmd(a); -// m_db->insertDisSysCmd(b); -// m_db->insertDisSysCmd(c); -// m_db->insertDisSysCmd(d); - -// } - - bool PowerManger::saveStringToJsonFile(const string &strJson, const string &filePath) { std::ofstream file(filePath, std::ios::trunc); diff --git a/src/pPowerManger/udpComm.h b/src/pPowerManger/udpComm.h index 51750ad..d8778f3 100644 --- a/src/pPowerManger/udpComm.h +++ b/src/pPowerManger/udpComm.h @@ -50,6 +50,7 @@ public: bool sendDisSysCmd(const disHighBVolBusCmd cmd); bool sendDisSysCmd(const disLowBusCmd cmd); bool sendMsg(const unsigned char* msg,unsigned int size){ + // cout << "sendMsgTo" << ccuHost << ":" << ccuPort << endl; udpScoket->iSendMessageTo((void*) msg, size, ccuPort, ccuHost); return true; } From bac5f5291ee68a43eefb731ea34bf3104a25ae74 Mon Sep 17 00:00:00 2001 From: zhaojingkui <1553836110@qq.com> Date: Mon, 7 Apr 2025 23:32:35 +0800 Subject: [PATCH 7/9] =?UTF-8?q?=E4=BC=98=E5=8C=96=E4=BA=86=E4=B8=8A?= =?UTF-8?q?=E4=BD=8D=E6=9C=BA=E7=9A=84=E9=80=9A=E4=BF=A1=E5=87=BD=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- data/msg/uPower_currentState_st.json | 2 +- data/msg/uPower_disSysState_st.json | 6 +- data/msg/uPower_fcsState_st.json | 28 +- data/msg/uPower_liBatState_st.json | 22 +- src/pPowerManger/CMakeLists.txt | 1 + src/pPowerManger/LowerCommManager.cpp | 105 +++++ src/pPowerManger/LowerCommManager.h | 18 +- src/pPowerManger/PowerManger.cpp | 649 +------------------------- src/pPowerManger/PowerManger.h | 38 +- src/pPowerManger/UpperCommManager.cpp | 444 +++++++++++++++++- src/pPowerManger/UpperCommManager.h | 19 +- 11 files changed, 627 insertions(+), 705 deletions(-) diff --git a/data/msg/uPower_currentState_st.json b/data/msg/uPower_currentState_st.json index 41648bf..a8a0701 100644 --- a/data/msg/uPower_currentState_st.json +++ b/data/msg/uPower_currentState_st.json @@ -6,7 +6,7 @@ "HVABbusBVol_uint16": 0, "HVABmastSteGeaCur_uint16": 0, "HVABopenWaterCur_uint16": 0, - "HVABxczCur_uint16": 0, + "HVABxczCur_uint16": 1, "HVBBCCUCur_uint16": 0, "HVBBFCSSecurSysCur_uint16": 0, "HVBBbatInsCur_uint16": 0, diff --git a/data/msg/uPower_disSysState_st.json b/data/msg/uPower_disSysState_st.json index ed8e1bf..90bc4ac 100644 --- a/data/msg/uPower_disSysState_st.json +++ b/data/msg/uPower_disSysState_st.json @@ -1,8 +1,8 @@ { "HVolABusBreaker_unit16": 0, - "HVolBBusBreaker_unit16": 0, - "HVolBusBreaker_uint16": 0, - "LVolBusBreaker_uint16": 0, + "HVolBBusBreaker_unit16": 79, + "HVolBusBreaker_uint16": 58, + "LVolBusBreaker_uint16": 159, "faultCode_array": [ 0 diff --git a/data/msg/uPower_fcsState_st.json b/data/msg/uPower_fcsState_st.json index 31141fb..200368f 100644 --- a/data/msg/uPower_fcsState_st.json +++ b/data/msg/uPower_fcsState_st.json @@ -1,30 +1,30 @@ { - "backpressure1_fp32": 0.0, - "backpressure2_fp32": 0.0, - "ch4oConcent1_fp32": 0.0, - "ch4oConcent2_fp32": 0.0, + "backpressure1_fp32": 5.0, + "backpressure2_fp32": 3.0, + "ch4oConcent1_fp32": 85.0, + "ch4oConcent2_fp32": 48.0, "ch4o_fp32": 0.0, - "excTemp_fp32": 0.0, + "excTemp_fp32": 37.0, "faultCode1_uint16": 0, "faultCode2_uint16": 0, "faultCode3_uint16": 0, "fcuCurIns_fp32": 0.0, "fcuCurPower_fp32": 0.0, - "fcuCur_fp32": 0.0, + "fcuCur_fp32": 6.0, "fcuFaultLeve_uint8": 0, - "fcuOutIns_fp32": 0.0, - "fcuOutPower_fp32": 0.0, + "fcuOutIns_fp32": 76.0, + "fcuOutPower_fp32": 912.0, "fcuState_uint8": 0, "fcuVolIns_fp32": 0.0, "fcuVolPower_fp32": 0.0, - "fcuVol_fp32": 0.0, + "fcuVol_fp32": 236.0, "flameDet_uint8": 0, - "h2Concent1_fp32": 0.0, - "h2Concent2_fp32": 0.0, - "o2Concent1_fp32": 0.0, - "o2Concent2_fp32": 0.0, + "h2Concent1_fp32": 32.0, + "h2Concent2_fp32": 50.0, + "o2Concent1_fp32": 56.0, + "o2Concent2_fp32": 91.0, "o2Level_fp32": 0.0, "o2_fp32": 0.0, - "powLimit_fp32": 0.0, + "powLimit_fp32": 64.0, "powerGen_fp32": 0.0 } \ No newline at end of file diff --git a/data/msg/uPower_liBatState_st.json b/data/msg/uPower_liBatState_st.json index b3e9fd4..a062620 100644 --- a/data/msg/uPower_liBatState_st.json +++ b/data/msg/uPower_liBatState_st.json @@ -2,37 +2,37 @@ "fcuCurToInsLimit1_uint8": 0, "fcuCurToinsLimit2_uint8": 0, "insBatCurElect_uint16": 0, - "insBatLimit_uint16": 0, - "insBatSoc_uint8": 0, - "insBatTotalElect_uint16": 0, + "insBatLimit_uint16": 6, + "insBatSoc_uint8": 9, + "insBatTotalElect_uint16": 667, "insChargeState_uint8": 0, "insCurSocHold1_uint8": 0, "insCurSocHold2_uint8": 0, "insCurSocHold3_uint8": 0, - "insCurrent_uint16": 0, + "insCurrent_uint16": 13, "insLinkVol_uint16": 0, - "insNegRelayState_uint8": 0, + "insNegRelayState_uint8": 1, "insNegRes_uint16": 0, "insPackVol_uint16": 0, "insPosRelayState_uint8": 0, "insPosRes_uint16": 0, "insfaultCode_uint8": 0, "powBatCurElect_uint16": 0, - "powBatSoc_uint8": 0, - "powBatTotalElect_uint16": 0, + "powBatSoc_uint8": 24, + "powBatTotalElect_uint16": 142, "powChargeState_uint8": 0, "powCurSocHold1_uint8": 0, "powCurSocHold2_uint8": 0, "powCurSocHold3_uint8": 0, "powCurToInsLimit1_uint8": 0, "powCurToinsLimit2_uint8": 0, - "powCur_uint16": 0, + "powCur_uint16": 86, "powLinkVol_uint16": 0, - "powNegRelayState_uint8": 0, + "powNegRelayState_uint8": 1, "powNegRes_uint16": 0, - "powPosRelayState_uint8": 0, + "powPosRelayState_uint8": 1, "powPosRes_uint16": 0, - "powerBatLimit_uint16": 0, + "powerBatLimit_uint16": 77, "powerPackVol_uint16": 0, "powfaultCode_uint8": 0 } \ No newline at end of file diff --git a/src/pPowerManger/CMakeLists.txt b/src/pPowerManger/CMakeLists.txt index 2a1f876..067201f 100644 --- a/src/pPowerManger/CMakeLists.txt +++ b/src/pPowerManger/CMakeLists.txt @@ -27,6 +27,7 @@ SET(SRC SQLiteDB.cpp driver.cpp LowerCommManager.cpp + UpperCommManager.cpp ) ADD_EXECUTABLE(pPowerManger ${SRC}) diff --git a/src/pPowerManger/LowerCommManager.cpp b/src/pPowerManger/LowerCommManager.cpp index df27731..8a817eb 100644 --- a/src/pPowerManger/LowerCommManager.cpp +++ b/src/pPowerManger/LowerCommManager.cpp @@ -130,6 +130,105 @@ void LowerCommManager::clearMsgQueue(){ m_udpComm->clearMsgQueue(); } + +bool LowerCommManager::updatePoweSystemStates(){ + // std::cout << "updatePoweSystemStates" << std::endl; + if(!m_udpComm->m_qReceiveCcuStateBuffer.empty()) + { + double time; + m_udpComm->popMsgFormQueue(time,m_CcuCurrentState); + m_pm->m_pmCurrentState.ccustate = m_CcuCurrentState.data; + // m_db->insertCcuData(m_CcuCurrentState.data); //写入数据库 + msg_CcuStateFbMsg_Update_time = time; + } + if(!m_udpComm->m_qReceiveDisHighVolBusBuffer.empty()) + { + double time; + m_udpComm->popMsgFormQueue(time,m_disHighVolBusCurrentState); + m_pm->m_pmCurrentState.bus1State = m_disHighVolBusCurrentState.data; + // m_db->insertDisHighVolBusData(m_disHighVolBusCurrentState.data); //写入数据库 + msg_disHighVolBusFbMsg_Update_time = time; + + disBus1Breaker* pdis1=new disBus1Breaker; + (m_pm->m_pmCurrentState.bus1State.fuelCellCircuitBreaker == BREAK_ON) ? pdis1 -> fuelCellCircuitBreaker = 1 : pdis1 -> fuelCellCircuitBreaker = 0; + (m_pm->m_pmCurrentState.bus1State.powerLithiumBatteryCircuitBreaker == BREAK_ON) ? pdis1 -> powerLithiumBatteryCircuitBreaker = 1 : pdis1 -> powerLithiumBatteryCircuitBreaker = 0; + (m_pm->m_pmCurrentState.bus1State.propulsionMotorCircuitBreaker == BREAK_ON) ? pdis1 -> propulsionMotorCircuitBreaker = 1 : pdis1 -> propulsionMotorCircuitBreaker = 0; + (m_pm->m_pmCurrentState.bus1State.lithiumBatteryGroupInstrumentCircuitBreaker == BREAK_ON) ? pdis1 -> lithiumBatteryGroupInstrumentCircuitBreaker = 1 : pdis1 -> lithiumBatteryGroupInstrumentCircuitBreaker = 0; + (m_pm->m_pmCurrentState.bus1State.dcDc5ModuleCircuitBreaker == BREAK_ON) ? pdis1 -> dcDc5ModuleCircuitBreaker = 1 : pdis1 -> dcDc5ModuleCircuitBreaker = 0; + (m_pm->m_pmCurrentState.bus1State.bowHighVoltageDistributionBoxCircuitBreaker == BREAK_ON) ? pdis1 -> bowHighVoltageDistributionBoxCircuitBreaker = 1 : pdis1 -> bowHighVoltageDistributionBoxCircuitBreaker = 0; + (m_pm->m_pmCurrentState.bus1State.sternFTDevice45CircuitBreaker == BREAK_ON) ? pdis1 -> sternFTDevice45CircuitBreaker = 1 : pdis1 -> sternFTDevice45CircuitBreaker = 0; + (m_pm->m_pmCurrentState.bus1State.sternRudderSwitch1CircuitBreaker == BREAK_ON) ? pdis1 -> sternRudderSwitch1CircuitBreaker = 1 : pdis1 -> sternRudderSwitch1CircuitBreaker = 0; + (m_pm->m_pmCurrentState.bus1State.sternRudderSwitch2CircuitBreaker == BREAK_ON) ? pdis1 -> sternRudderSwitch2CircuitBreaker = 1 : pdis1 -> sternRudderSwitch2CircuitBreaker = 0; + (m_pm->m_pmCurrentState.bus1State.fbReservedCircuitBreaker == BREAK_ON) ? pdis1 -> fbReservedCircuitBreaker = 1 : pdis1 -> fbReservedCircuitBreaker = 0; + (m_pm->m_pmCurrentState.bus1State.tyzReservedCircuitBreaker == BREAK_ON) ? pdis1 -> tyzReservedCircuitBreaker = 1 : pdis1 -> tyzReservedCircuitBreaker = 0; + (m_pm->m_pmCurrentState.bus1State.reservedCircuitBreaker == BREAK_ON) ? pdis1 -> reservedCircuitBreaker = 1 : pdis1 -> reservedCircuitBreaker = 0; + pdis1 -> paceholder = 0; + m_pm->m_currentDisBreakerState.bus1Breaker = *pdis1; + delete pdis1; + } + if(!m_udpComm->m_qReceiveDisHighAVolBusBuffer.empty()) + { + double time; + m_udpComm->popMsgFormQueue(time,m_disHighAVolBusCurrentState); + m_pm->m_pmCurrentState.bus2State = m_disHighAVolBusCurrentState.data; + // m_db->insertDisHighAVolBusData(m_disHighAVolBusCurrentState.data); //写入数据库 + msg_disHighAVolBusFbMsg_Update_time = time; + + disBus2Breaker* pdis2=new disBus2Breaker; + (m_pm->m_pmCurrentState.bus2State.bowFTDevice123CircuitBreaker == BREAK_ON)? pdis2 -> bowFTDevice123CircuitBreaker = 1 : pdis2 -> bowFTDevice123CircuitBreaker = 0; + (m_pm->m_pmCurrentState.bus2State.actuatorCircuitBreaker == BREAK_ON)? pdis2 -> actuatorCircuitBreaker = 1 : pdis2 -> actuatorCircuitBreaker = 0; + (m_pm->m_pmCurrentState.bus2State.mastSteeringGearControlBoxCircuitBreaker == BREAK_ON)? pdis2 -> mastSteeringGearControlBoxCircuitBreaker = 1 : pdis2 -> mastSteeringGearControlBoxCircuitBreaker = 0; + (m_pm->m_pmCurrentState.bus2State.xczCircuitBreaker == BREAK_ON)? pdis2 -> xczCircuitBreaker = 1 : pdis2 -> xczCircuitBreaker = 0; + (m_pm->m_pmCurrentState.bus2State.bowRudderControlBoxCircuitBreaker == BREAK_ON)? pdis2 -> bowRudderControlBoxCircuitBreaker = 1 : pdis2 -> bowRudderControlBoxCircuitBreaker = 0; + (m_pm->m_pmCurrentState.bus2State.openWaterCoverStartCylinderCircuitBreaker == BREAK_ON)? pdis2 -> openWaterCoverStartCylinderCircuitBreaker = 1 : pdis2 -> openWaterCoverStartCylinderCircuitBreaker = 0; + pdis2 -> paceholder = 0; + m_pm->m_currentDisBreakerState.bus2Breaker = *pdis2; + delete pdis2; + } + if(!m_udpComm->m_qReceiveDisHighBVolBusBuffer.empty()) + { + double time; + m_udpComm->popMsgFormQueue(time,m_disHighBVolBusCurrentState); + m_pm->m_pmCurrentState.bus3State = m_disHighBVolBusCurrentState.data; + // m_db->insertDisHighBVolBusData(m_disHighBVolBusCurrentState.data); //写入数据库 + msg_disHighBVolBusFbMsg_Update_time = time; + + disBus3Breaker* pdis3=new disBus3Breaker; + (m_pm->m_pmCurrentState.bus3State.lithiumBatteryGroupInstrumentCircuitBreaker == BREAK_ON)? pdis3 -> lithiumBatteryGroupInstrumentCircuitBreaker = 1 : pdis3 -> lithiumBatteryGroupInstrumentCircuitBreaker = 0; + (m_pm->m_pmCurrentState.bus3State.bowLowVoltageDistributionBoxCircuitBreaker == BREAK_ON)? pdis3 -> bowLowVoltageDistributionBoxCircuitBreaker = 1 : pdis3 -> bowLowVoltageDistributionBoxCircuitBreaker = 0; + (m_pm->m_pmCurrentState.bus3State.unit4InstrumentDC48VCircuitBreaker == BREAK_ON)? pdis3 -> unit4InstrumentDC48VCircuitBreaker = 1 : pdis3 -> unit4InstrumentDC48VCircuitBreaker = 0; + (m_pm->m_pmCurrentState.bus3State.dcC1DCDistributionPanelCircuitBreaker == BREAK_ON)? pdis3 -> dcC1DCDistributionPanelCircuitBreaker = 1 : pdis3 -> dcC1DCDistributionPanelCircuitBreaker = 0; + (m_pm->m_pmCurrentState.bus3State.reservedCircuitBreaker1 == BREAK_ON)? pdis3 -> reservedCircuitBreaker1 = 1 : pdis3 -> reservedCircuitBreaker1 = 0; + (m_pm->m_pmCurrentState.bus3State.reservedCircuitBreaker2 == BREAK_ON)? pdis3 -> reservedCircuitBreaker2 = 1 : pdis3 -> reservedCircuitBreaker2 = 0; + (m_pm->m_pmCurrentState.bus3State.emergencyLithiumBatteryGroup2CircuitBreaker == BREAK_ON)? pdis3 -> emergencyLithiumBatteryGroup2CircuitBreaker = 1 : pdis3 -> emergencyLithiumBatteryGroup2CircuitBreaker = 0; + pdis3->paceholder = 0; + m_pm->m_currentDisBreakerState.bus3Breaker = *pdis3; + delete pdis3; + } + if(!m_udpComm->m_qReceiveDisLowBusBuffer.empty()) + { + double time; + m_udpComm->popMsgFormQueue(time,m_disLowBusState); + m_pm->m_pmCurrentState.bus4State = m_disLowBusState.data; + // m_db->insertDisLowBusData(m_disLowBusState.data); //写入数据库 + msg_disLowBusFbMsg_Update_time = time; + + disBus4Breaker* pdis4=new disBus4Breaker; + (m_pm->m_pmCurrentState.bus4State.unit1CircuitBreaker == BREAK_ON)? pdis4 -> unit1CircuitBreaker = 1 : pdis4 -> unit1CircuitBreaker = 0; + (m_pm->m_pmCurrentState.bus4State.unit2CircuitBreaker == BREAK_ON)? pdis4 -> unit2CircuitBreaker = 1 : pdis4 -> unit2CircuitBreaker = 0; + (m_pm->m_pmCurrentState.bus4State.unit3CircuitBreaker == BREAK_ON)? pdis4 -> unit3CircuitBreaker = 1 : pdis4 -> unit3CircuitBreaker = 0; + (m_pm->m_pmCurrentState.bus4State.unit5CircuitBreaker == BREAK_ON)? pdis4 -> unit5CircuitBreaker = 1 : pdis4 -> unit5CircuitBreaker = 0; + (m_pm->m_pmCurrentState.bus4State.bowPZDeviceCircuitBreaker == BREAK_ON)? pdis4 -> bowPZDeviceCircuitBreaker = 1 : pdis4 -> bowPZDeviceCircuitBreaker = 0; + (m_pm->m_pmCurrentState.bus4State.reservedCircuitBreaker1 == BREAK_ON)? pdis4 -> reservedCircuitBreaker1 = 1 : pdis4 -> reservedCircuitBreaker1 = 0; + (m_pm->m_pmCurrentState.bus4State.reservedCircuitBreaker2 == BREAK_ON)? pdis4 -> reservedCircuitBreaker2 = 1 : pdis4 -> reservedCircuitBreaker2 = 0; + (m_pm->m_pmCurrentState.bus4State.emergencyLithiumBatteryGroup1CircuitBreaker == BREAK_ON)? pdis4 -> emergencyLithiumBatteryGroup1CircuitBreaker = 1 : pdis4 -> emergencyLithiumBatteryGroup1CircuitBreaker = 0; + pdis4 -> paceholder = 0; + m_pm->m_currentDisBreakerState.bus4Breaker = *pdis4; + delete pdis4; + } + return true; +} + bool LowerCommManager::listenThreadFunc() { cout<sError[i] << MOOS::ConsoleColours::reset() << endl; } } + //更新当前状态 + if(!updatePoweSystemStates()) + { + std::cerr << "Error updating power system states" << std::endl; + } } catch(const std::exception& e) { cerr << "Error processing message: " << e.what() << endl; @@ -201,6 +305,7 @@ void LowerCommManager::stopListenThread() if(m_ListenThread.IsThreadRunning()) { m_ListenThread.Stop(); + std::cout << "LowerCommManager::stopListenThread" << std::endl; } } diff --git a/src/pPowerManger/LowerCommManager.h b/src/pPowerManger/LowerCommManager.h index 496a9bb..c3bd91c 100644 --- a/src/pPowerManger/LowerCommManager.h +++ b/src/pPowerManger/LowerCommManager.h @@ -27,10 +27,11 @@ public: void clearMsgQueue(); public: - CMOOSLock m_CommMutex; // 保护UDP通信资源 - // 初始化UDP通信 bool initUdpComm(); + + // TODO:实现连接检查功能 + bool checkConnection(); // 更新设备状态 bool updatePoweSystemStates(); @@ -49,6 +50,19 @@ public: //转换函数 char getBreakerOption(char cmd); + // 配电和CCU的反馈状态 + msg_CcuStateFbMsg m_CcuCurrentState; + msg_disHighVolBusFbMsg m_disHighVolBusCurrentState; + msg_disHighAVolBusFbMsg m_disHighAVolBusCurrentState; + msg_disHighBVolBusFbMsg m_disHighBVolBusCurrentState; + msg_disLowBusFbMsg m_disLowBusState; + // 配电和CCU的反馈状态时间戳 + double msg_CcuStateFbMsg_Update_time; + // double msg_CcuSetParmFbMsg_Update_time; + double msg_disHighVolBusFbMsg_Update_time; + double msg_disHighAVolBusFbMsg_Update_time; + double msg_disHighBVolBusFbMsg_Update_time; + double msg_disLowBusFbMsg_Update_time; public: long m_port; long m_ccuPort; diff --git a/src/pPowerManger/PowerManger.cpp b/src/pPowerManger/PowerManger.cpp index 158b04d..7e651b6 100644 --- a/src/pPowerManger/PowerManger.cpp +++ b/src/pPowerManger/PowerManger.cpp @@ -35,12 +35,12 @@ PowerManger::PowerManger() m_ticker = 0; faultCode.push_back(0); - msg_CcuStateFbMsg_Update_time = 0; - // msg_CcuSetParmFbMsg_Update_time = 0; - msg_disHighVolBusFbMsg_Update_time = 0; - msg_disHighAVolBusFbMsg_Update_time = 0; - msg_disHighBVolBusFbMsg_Update_time = 0; - msg_disLowBusFbMsg_Update_time = 0; + // msg_CcuStateFbMsg_Update_time = 0; + // // msg_CcuSetParmFbMsg_Update_time = 0; + // msg_disHighVolBusFbMsg_Update_time = 0; + // msg_disHighAVolBusFbMsg_Update_time = 0; + // msg_disHighBVolBusFbMsg_Update_time = 0; + // msg_disLowBusFbMsg_Update_time = 0; connectState = 0; @@ -68,6 +68,9 @@ PowerManger::PowerManger() //初始化UDP通信 m_lowerCommManager = new LowerCommManager(this,IPORT,CCUPORT,CCUHOST); m_lowerCommManager->initUdpComm(); + + //初始化上位机通信 + m_upperCommManager = new UpperCommManager(this); // 初始化状态机 cout << "init fsm" << endl; @@ -164,29 +167,16 @@ bool PowerManger::OnConnectToServer() bool PowerManger::Iterate() { AppCastingMOOSApp::Iterate(); - //1. 更新当前状态 - // updatePmState(); - updateConnectState(); - //2. 运行状态机 - // if (FSM_RUN_IS_OK) - // m_FsmThread.Start(); - // else - // m_FsmThread.Stop(); - //3. 进行操作 每秒执行一次 if (m_ticker++ % 5 == 0) { - //a. 配电系统操作 - // disSysOption(); - //b. ccu操作 - // ccuOption(); - //c. 上位机反馈 - buildPowerSysReport(); + m_lowerCommManager->processPeriodicTasks(); + m_upperCommManager->processPeriodicTasks(); + // buildPowerSysReport(); Notify(PM_TO_DB_SUBDISCMD,m_driver.saveDriverTableToJson(&m_subDisSysCmd)); Notify(PM_TO_DB_EQUIPMENTSTATE,m_driver.saveDriverTableToJson(&m_currentDriverState)); //d.保存到数据库 writeDataToDB(); } - m_lowerCommManager->processPeriodicTasks(); /////////////////////// // string a = m_driver.getSubDisCmdJson(&m_subDisSysCmd); @@ -290,35 +280,6 @@ XPCUdpSocket* PowerManger::setUdpScoket(long lPort) return pUdpSocket; } -// bool PowerManger::ListenLoopUDP() -// { -// unsigned char Buff[MAX_UDP_PKT_SIZE]; -// while(!m_ListenThread.IsQuitRequested()) -// { -// int nRead = m_pCcuUdpComm->iRecieveMessage(Buff,sizeof(Buff)); -// cout< 0) -// { -// if(!m_udpComm.pushMsgToQueue(Buff)) -// { -// for(int i=0;iinsertCcuData(m_CcuCurrentState.data); //写入数据库 -// msg_CcuStateFbMsg_Update_time = time; -// } -// if(!m_udpComm.m_qReceiveDisHighVolBusBuffer.empty()) -// { -// double time; -// m_udpComm.popMsgFormQueue(time,m_disHighVolBusCurrentState); -// m_pmCurrentState.bus1State = m_disHighVolBusCurrentState.data; -// m_db->insertDisHighVolBusData(m_disHighVolBusCurrentState.data); //写入数据库 -// msg_disHighVolBusFbMsg_Update_time = time; - -// disBus1Breaker* pdis1=new disBus1Breaker; -// (m_pmCurrentState.bus1State.fuelCellCircuitBreaker == BREAK_ON) ? pdis1 -> fuelCellCircuitBreaker = 1 : pdis1 -> fuelCellCircuitBreaker = 0; -// (m_pmCurrentState.bus1State.powerLithiumBatteryCircuitBreaker == BREAK_ON) ? pdis1 -> powerLithiumBatteryCircuitBreaker = 1 : pdis1 -> powerLithiumBatteryCircuitBreaker = 0; -// (m_pmCurrentState.bus1State.propulsionMotorCircuitBreaker == BREAK_ON) ? pdis1 -> propulsionMotorCircuitBreaker = 1 : pdis1 -> propulsionMotorCircuitBreaker = 0; -// (m_pmCurrentState.bus1State.lithiumBatteryGroupInstrumentCircuitBreaker == BREAK_ON) ? pdis1 -> lithiumBatteryGroupInstrumentCircuitBreaker = 1 : pdis1 -> lithiumBatteryGroupInstrumentCircuitBreaker = 0; -// (m_pmCurrentState.bus1State.dcDc5ModuleCircuitBreaker == BREAK_ON) ? pdis1 -> dcDc5ModuleCircuitBreaker = 1 : pdis1 -> dcDc5ModuleCircuitBreaker = 0; -// (m_pmCurrentState.bus1State.bowHighVoltageDistributionBoxCircuitBreaker == BREAK_ON) ? pdis1 -> bowHighVoltageDistributionBoxCircuitBreaker = 1 : pdis1 -> bowHighVoltageDistributionBoxCircuitBreaker = 0; -// (m_pmCurrentState.bus1State.sternFTDevice45CircuitBreaker == BREAK_ON) ? pdis1 -> sternFTDevice45CircuitBreaker = 1 : pdis1 -> sternFTDevice45CircuitBreaker = 0; -// (m_pmCurrentState.bus1State.sternRudderSwitch1CircuitBreaker == BREAK_ON) ? pdis1 -> sternRudderSwitch1CircuitBreaker = 1 : pdis1 -> sternRudderSwitch1CircuitBreaker = 0; -// (m_pmCurrentState.bus1State.sternRudderSwitch2CircuitBreaker == BREAK_ON) ? pdis1 -> sternRudderSwitch2CircuitBreaker = 1 : pdis1 -> sternRudderSwitch2CircuitBreaker = 0; -// (m_pmCurrentState.bus1State.fbReservedCircuitBreaker == BREAK_ON) ? pdis1 -> fbReservedCircuitBreaker = 1 : pdis1 -> fbReservedCircuitBreaker = 0; -// (m_pmCurrentState.bus1State.tyzReservedCircuitBreaker == BREAK_ON) ? pdis1 -> tyzReservedCircuitBreaker = 1 : pdis1 -> tyzReservedCircuitBreaker = 0; -// (m_pmCurrentState.bus1State.reservedCircuitBreaker == BREAK_ON) ? pdis1 -> reservedCircuitBreaker = 1 : pdis1 -> reservedCircuitBreaker = 0; -// pdis1 -> paceholder = 0; -// m_currentDisBreakerState.bus1Breaker = *pdis1; -// delete pdis1; -// } -// if(!m_udpComm.m_qReceiveDisHighAVolBusBuffer.empty()) -// { -// double time; -// m_udpComm.popMsgFormQueue(time,m_disHighAVolBusCurrentState); -// m_pmCurrentState.bus2State = m_disHighAVolBusCurrentState.data; -// m_db->insertDisHighAVolBusData(m_disHighAVolBusCurrentState.data); //写入数据库 -// msg_disHighAVolBusFbMsg_Update_time = time; - -// disBus2Breaker* pdis2=new disBus2Breaker; -// (m_pmCurrentState.bus2State.bowFTDevice123CircuitBreaker == BREAK_ON)? pdis2 -> bowFTDevice123CircuitBreaker = 1 : pdis2 -> bowFTDevice123CircuitBreaker = 0; -// (m_pmCurrentState.bus2State.actuatorCircuitBreaker == BREAK_ON)? pdis2 -> actuatorCircuitBreaker = 1 : pdis2 -> actuatorCircuitBreaker = 0; -// (m_pmCurrentState.bus2State.mastSteeringGearControlBoxCircuitBreaker == BREAK_ON)? pdis2 -> mastSteeringGearControlBoxCircuitBreaker = 1 : pdis2 -> mastSteeringGearControlBoxCircuitBreaker = 0; -// (m_pmCurrentState.bus2State.xczCircuitBreaker == BREAK_ON)? pdis2 -> xczCircuitBreaker = 1 : pdis2 -> xczCircuitBreaker = 0; -// (m_pmCurrentState.bus2State.bowRudderControlBoxCircuitBreaker == BREAK_ON)? pdis2 -> bowRudderControlBoxCircuitBreaker = 1 : pdis2 -> bowRudderControlBoxCircuitBreaker = 0; -// (m_pmCurrentState.bus2State.openWaterCoverStartCylinderCircuitBreaker == BREAK_ON)? pdis2 -> openWaterCoverStartCylinderCircuitBreaker = 1 : pdis2 -> openWaterCoverStartCylinderCircuitBreaker = 0; -// pdis2 -> paceholder = 0; -// m_currentDisBreakerState.bus2Breaker = *pdis2; -// delete pdis2; -// } -// if(!m_udpComm.m_qReceiveDisHighBVolBusBuffer.empty()) -// { -// double time; -// m_udpComm.popMsgFormQueue(time,m_disHighBVolBusCurrentState); -// m_pmCurrentState.bus3State = m_disHighBVolBusCurrentState.data; -// m_db->insertDisHighBVolBusData(m_disHighBVolBusCurrentState.data); //写入数据库 -// msg_disHighBVolBusFbMsg_Update_time = time; - -// disBus3Breaker* pdis3=new disBus3Breaker; -// (m_pmCurrentState.bus3State.lithiumBatteryGroupInstrumentCircuitBreaker == BREAK_ON)? pdis3 -> lithiumBatteryGroupInstrumentCircuitBreaker = 1 : pdis3 -> lithiumBatteryGroupInstrumentCircuitBreaker = 0; -// (m_pmCurrentState.bus3State.bowLowVoltageDistributionBoxCircuitBreaker == BREAK_ON)? pdis3 -> bowLowVoltageDistributionBoxCircuitBreaker = 1 : pdis3 -> bowLowVoltageDistributionBoxCircuitBreaker = 0; -// (m_pmCurrentState.bus3State.unit4InstrumentDC48VCircuitBreaker == BREAK_ON)? pdis3 -> unit4InstrumentDC48VCircuitBreaker = 1 : pdis3 -> unit4InstrumentDC48VCircuitBreaker = 0; -// (m_pmCurrentState.bus3State.dcC1DCDistributionPanelCircuitBreaker == BREAK_ON)? pdis3 -> dcC1DCDistributionPanelCircuitBreaker = 1 : pdis3 -> dcC1DCDistributionPanelCircuitBreaker = 0; -// (m_pmCurrentState.bus3State.reservedCircuitBreaker1 == BREAK_ON)? pdis3 -> reservedCircuitBreaker1 = 1 : pdis3 -> reservedCircuitBreaker1 = 0; -// (m_pmCurrentState.bus3State.reservedCircuitBreaker2 == BREAK_ON)? pdis3 -> reservedCircuitBreaker2 = 1 : pdis3 -> reservedCircuitBreaker2 = 0; -// (m_pmCurrentState.bus3State.emergencyLithiumBatteryGroup2CircuitBreaker == BREAK_ON)? pdis3 -> emergencyLithiumBatteryGroup2CircuitBreaker = 1 : pdis3 -> emergencyLithiumBatteryGroup2CircuitBreaker = 0; -// pdis3->paceholder = 0; -// m_currentDisBreakerState.bus3Breaker = *pdis3; -// delete pdis3; -// } -// if(!m_udpComm.m_qReceiveDisLowBusBuffer.empty()) -// { -// double time; -// m_udpComm.popMsgFormQueue(time,m_disLowBusState); -// m_pmCurrentState.bus4State = m_disLowBusState.data; -// m_db->insertDisLowBusData(m_disLowBusState.data); //写入数据库 -// msg_disLowBusFbMsg_Update_time = time; - -// disBus4Breaker* pdis4=new disBus4Breaker; -// (m_pmCurrentState.bus4State.unit1CircuitBreaker == BREAK_ON)? pdis4 -> unit1CircuitBreaker = 1 : pdis4 -> unit1CircuitBreaker = 0; -// (m_pmCurrentState.bus4State.unit2CircuitBreaker == BREAK_ON)? pdis4 -> unit2CircuitBreaker = 1 : pdis4 -> unit2CircuitBreaker = 0; -// (m_pmCurrentState.bus4State.unit3CircuitBreaker == BREAK_ON)? pdis4 -> unit3CircuitBreaker = 1 : pdis4 -> unit3CircuitBreaker = 0; -// (m_pmCurrentState.bus4State.unit5CircuitBreaker == BREAK_ON)? pdis4 -> unit5CircuitBreaker = 1 : pdis4 -> unit5CircuitBreaker = 0; -// (m_pmCurrentState.bus4State.bowPZDeviceCircuitBreaker == BREAK_ON)? pdis4 -> bowPZDeviceCircuitBreaker = 1 : pdis4 -> bowPZDeviceCircuitBreaker = 0; -// (m_pmCurrentState.bus4State.reservedCircuitBreaker1 == BREAK_ON)? pdis4 -> reservedCircuitBreaker1 = 1 : pdis4 -> reservedCircuitBreaker1 = 0; -// (m_pmCurrentState.bus4State.reservedCircuitBreaker2 == BREAK_ON)? pdis4 -> reservedCircuitBreaker2 = 1 : pdis4 -> reservedCircuitBreaker2 = 0; -// (m_pmCurrentState.bus4State.emergencyLithiumBatteryGroup1CircuitBreaker == BREAK_ON)? pdis4 -> emergencyLithiumBatteryGroup1CircuitBreaker = 1 : pdis4 -> emergencyLithiumBatteryGroup1CircuitBreaker = 0; -// pdis4 -> paceholder = 0; -// m_currentDisBreakerState.bus4Breaker = *pdis4; -// delete pdis4; -// } -// return true; -// } - - -bool PowerManger::IsSkewed(double dfTimeNow, double * pdfSkew) -{ - double dfSkew = fabs(dfTimeNow - m_current_time); - if(pdfSkew != NULL) - { - *pdfSkew = dfSkew; - } - return (dfSkew > SKEW_TOLERANCE) ? true : false; -} - -bool PowerManger::saveStringToJsonFile(const string &strJson, const string &filePath) -{ - std::ofstream file(filePath, std::ios::trunc); - if (file.is_open()) { - file << strJson; - file.close(); - // std::cout << "字符串已成功保存到文件中。" << std::endl; - return true; - } else { - std::cerr << "无法打开文件!" << std::endl; - return false; - } -} - bool PowerManger::writeDataToDB() { // //写入配电系统状态 @@ -614,17 +427,6 @@ void PowerManger::initControlCmd() } -char PowerManger::getBreakerOption(char cmd) -{ - if(cmd ==1) - return 0x55; - else if(cmd ==0) - return 0xAA; - else - return 0x00; -} - - bool PowerManger::getMsCmdFromJson(MSControlCmd &cmd, const std::string &strJson) { @@ -669,429 +471,4 @@ bool PowerManger::getMsCmdFromJson(MSControlCmd &cmd, const std::string &strJson return false; // 缺少或类型不匹配 } return true; // 成功 -} - -string PowerManger::getTypeName(const string typeName) -{ - // 映射类型名称到指定的字符串 - if (typeName == "i" || typeName == "c") { - return "_int8"; - } else if (typeName == "h" || typeName == "C") { - return "_uint8"; - } else if (typeName == "s" || typeName == "S") { - return "_int16"; - } else if (typeName == "t" || typeName == "T") { - return "_uint16"; - } else if (typeName == "i" || typeName == "I") { - return "_int32"; - } else if (typeName == "j" || typeName == "J") { - return "_uint32"; - } else if (typeName == "x" || typeName == "X") { - return "_int64"; - } else if (typeName == "f" || typeName == "F") { - return "_fp32"; - } else if (typeName == "d" || typeName == "D") { - return "_fp64"; - } else if (typeName == "b" || typeName == "B") { - return "_bool"; - } else if (typeName == "NSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE") { - return "_str"; - } else if (typeName == "St6vector" || typeName == "St5deque" || typeName == "St4list" || typeName == "St4pair") { - return "_array"; - } else { - // 默认情况 - return "_obj"; - } -} - - -bool PowerManger::buildPowerSysReport() -{ - //TODO: 构建能源系统报告 - string suffix; - Json::Value pms; - Json::Value fcs; - Json::Value lbs; - Json::Value dis; - // 构建能源系统报告 - //1.构建系统状态报告 - suffix = getTypeName(typeid(workCondition).name()); - pms[VAR_TO_STR(workCondition)+suffix] = workCondition; - - suffix = getTypeName(typeid(currentMod).name()); - pms[VAR_TO_STR(currentMod)+suffix] = currentMod; - - suffix = getTypeName(typeid(powerState).name()); - pms[VAR_TO_STR(powerState)+suffix] = powerState; - - suffix = getTypeName(typeid(falutLevel).name()); - pms[VAR_TO_STR(falutLevel)+suffix] = falutLevel; - - Json::Value faultCode_array; - for(auto val : faultCode) - { - faultCode_array.append(val); - } - pms[VAR_TO_STR(faultCode_array)] = faultCode_array; - - suffix = getTypeName(typeid(soc).name()); - pms[VAR_TO_STR(soc)+suffix] = soc; - - suffix = getTypeName(typeid(sustainableTime).name()); - pms[VAR_TO_STR(sustainableTime)+suffix] = sustainableTime; - - //2.构建燃料电池状态报告 - suffix = getTypeName(typeid(m_pmCurrentState.ccustate.fcuState).name()); - fcs[VAR_TO_STR(fcuState)+suffix] = m_pmCurrentState.ccustate.fcuState; - - suffix = getTypeName(typeid(m_pmCurrentState.ccustate.fcuFaultLeve).name()); - fcs[VAR_TO_STR(fcuFaultLeve)+suffix] = m_pmCurrentState.ccustate.fcuFaultLeve; - - suffix = getTypeName(typeid(m_pmCurrentState.ccustate.powerLimit).name()); - fcs[VAR_TO_STR(powLimit)+suffix] = m_pmCurrentState.ccustate.powerLimit; - - suffix = getTypeName(typeid(m_pmCurrentState.ccustate.totalPowerGeneration).name()); - fcs[VAR_TO_STR(powerGen)+suffix] = m_pmCurrentState.ccustate.totalPowerGeneration; - - suffix = getTypeName(typeid(m_pmCurrentState.ccustate.ch4o).name()); - fcs[VAR_TO_STR(ch4o)+suffix] = m_pmCurrentState.ccustate.ch4o; - - suffix = getTypeName(typeid(m_pmCurrentState.ccustate.o2).name()); - fcs[VAR_TO_STR(o2)+suffix] = m_pmCurrentState.ccustate.o2; - - suffix = getTypeName(typeid(m_pmCurrentState.ccustate.fcuVoltage).name()); - fcs[VAR_TO_STR(fcuVol)+suffix] = m_pmCurrentState.ccustate.fcuVoltage; - - suffix = getTypeName(typeid(m_pmCurrentState.ccustate.fcuCurrent).name()); - fcs[VAR_TO_STR(fcuCur)+suffix] = m_pmCurrentState.ccustate.fcuCurrent; - - suffix = getTypeName(typeid(m_pmCurrentState.ccustate.o2Level).name()); - fcs[VAR_TO_STR(o2Level)+suffix] = m_pmCurrentState.ccustate.o2Level; - - suffix = getTypeName(typeid(m_pmCurrentState.ccustate.exchangerTemperature).name()); - fcs[VAR_TO_STR(excTemp)+suffix] = m_pmCurrentState.ccustate.exchangerTemperature; - - suffix = getTypeName(typeid(m_pmCurrentState.ccustate.fcuOutPower).name()); - fcs[VAR_TO_STR(fcuOutPower)+suffix] = m_pmCurrentState.ccustate.fcuOutPower; - - suffix = getTypeName(typeid(m_pmCurrentState.ccustate.fcuOutIns).name()); - fcs[VAR_TO_STR(fcuOutIns)+suffix] = m_pmCurrentState.ccustate.fcuOutIns; - - suffix = getTypeName(typeid(m_pmCurrentState.ccustate.fcuVoltageIns).name()); - fcs[VAR_TO_STR(fcuVolIns)+suffix] = m_pmCurrentState.ccustate.fcuVoltageIns; - - suffix = getTypeName(typeid(m_pmCurrentState.ccustate.fcuVoltagePower).name()); - fcs[VAR_TO_STR(fcuVolPower)+suffix] = m_pmCurrentState.ccustate.fcuVoltagePower; - - suffix = getTypeName(typeid(m_pmCurrentState.ccustate.fcuCurrentIns).name()); - fcs[VAR_TO_STR(fcuCurIns)+suffix] = m_pmCurrentState.ccustate.fcuCurrentIns; - - suffix = getTypeName(typeid(m_pmCurrentState.ccustate.fcuCurrentPower).name()); - fcs[VAR_TO_STR(fcuCurPower)+suffix] = m_pmCurrentState.ccustate.fcuCurrentPower; - - suffix = getTypeName(typeid(m_pmCurrentState.ccustate.h2Concentration1).name()); - fcs[VAR_TO_STR(h2Concent1)+suffix] = m_pmCurrentState.ccustate.h2Concentration1; - - suffix = getTypeName(typeid(m_pmCurrentState.ccustate.h2Concentration2).name()); - fcs[VAR_TO_STR(h2Concent2)+suffix] = m_pmCurrentState.ccustate.h2Concentration2; - - suffix = getTypeName(typeid(m_pmCurrentState.ccustate.o2Concentration1).name()); - fcs[VAR_TO_STR(o2Concent1)+suffix] = m_pmCurrentState.ccustate.o2Concentration1; - - suffix = getTypeName(typeid(m_pmCurrentState.ccustate.o2Concentration2).name()); - fcs[VAR_TO_STR(o2Concent2)+suffix] = m_pmCurrentState.ccustate.o2Concentration2; - - suffix = getTypeName(typeid(m_pmCurrentState.ccustate.ch4oConcentration1).name()); - fcs[VAR_TO_STR(ch4oConcent1)+suffix] = m_pmCurrentState.ccustate.ch4oConcentration1; - - suffix = getTypeName(typeid(m_pmCurrentState.ccustate.ch4oConcentration2).name()); - fcs[VAR_TO_STR(ch4oConcent2)+suffix] = m_pmCurrentState.ccustate.ch4oConcentration2; - - suffix = getTypeName(typeid(m_pmCurrentState.ccustate.backpressure1).name()); - fcs[VAR_TO_STR(backpressure1)+suffix] = m_pmCurrentState.ccustate.backpressure1; - - suffix = getTypeName(typeid(m_pmCurrentState.ccustate.backpressure2).name()); - fcs[VAR_TO_STR(backpressure2)+suffix] = m_pmCurrentState.ccustate.backpressure2; - - suffix = getTypeName(typeid(m_pmCurrentState.ccustate.flameDetection).name()); - fcs[VAR_TO_STR(flameDet)+suffix] = m_pmCurrentState.ccustate.flameDetection; - - unsigned short faultCode1; - unsigned short faultCode2; - unsigned short faultCode3; - faultCode1 = (m_pmCurrentState.ccustate.fcuGZ_1H << 8) | m_pmCurrentState.ccustate.fcuGZ_1L; - faultCode2 = (m_pmCurrentState.ccustate.fcuGZ_2H << 8) | m_pmCurrentState.ccustate.fcuGZ_2L; - faultCode3 = (m_pmCurrentState.ccustate.fcuGZ_3H << 8) | m_pmCurrentState.ccustate.fcuGZ_3L; - - suffix = getTypeName(typeid(faultCode1).name()); - fcs[VAR_TO_STR(faultCode1)+suffix] = faultCode1; - suffix = getTypeName(typeid(faultCode2).name()); - fcs[VAR_TO_STR(faultCode2)+suffix] = faultCode2; - suffix = getTypeName(typeid(faultCode3).name()); - fcs[VAR_TO_STR(faultCode3)+suffix] = faultCode3; - - //4.构建动力锂电池状态报告 - suffix = getTypeName(typeid(m_pmCurrentState.ccustate.insPosRelayState).name()); - lbs[VAR_TO_STR(insPosRelayState)+suffix] = m_pmCurrentState.ccustate.insPosRelayState; - - suffix = getTypeName(typeid(m_pmCurrentState.ccustate.insNegRelayState).name()); - lbs[VAR_TO_STR(insNegRelayState)+suffix] = m_pmCurrentState.ccustate.insNegRelayState; - - suffix = getTypeName(typeid(m_pmCurrentState.ccustate.powerPosRelayState).name()); - lbs[VAR_TO_STR(powPosRelayState)+suffix] = m_pmCurrentState.ccustate.powerPosRelayState; - - suffix = getTypeName(typeid(m_pmCurrentState.ccustate.powerNegRelayState).name()); - lbs[VAR_TO_STR(powNegRelayState)+suffix] = m_pmCurrentState.ccustate.powerNegRelayState; - - suffix = getTypeName(typeid(m_pmCurrentState.ccustate.insBatLimit).name()); - lbs[VAR_TO_STR(insBatLimit)+suffix] = m_pmCurrentState.ccustate.insBatLimit; - - suffix = getTypeName(typeid(m_pmCurrentState.ccustate.powerBatLimit).name()); - lbs[VAR_TO_STR(powerBatLimit)+suffix] = m_pmCurrentState.ccustate.powerBatLimit; - - suffix = getTypeName(typeid(m_pmCurrentState.ccustate.insBatSoc).name()); - lbs[VAR_TO_STR(insBatSoc)+suffix] = m_pmCurrentState.ccustate.insBatSoc; - - suffix = getTypeName(typeid(m_pmCurrentState.ccustate.powerBatSoc).name()); - lbs[VAR_TO_STR(powBatSoc)+suffix] = m_pmCurrentState.ccustate.powerBatSoc; - - suffix = getTypeName(typeid(m_pmCurrentState.ccustate.insBatTotalElectricity).name()); - lbs[VAR_TO_STR(insBatTotalElect)+suffix] = m_pmCurrentState.ccustate.insBatTotalElectricity; - - suffix = getTypeName(typeid(m_pmCurrentState.ccustate.powerBatTotalElectricity).name()); - lbs[VAR_TO_STR(powBatTotalElect)+suffix] = m_pmCurrentState.ccustate.powerBatTotalElectricity; - - suffix = getTypeName(typeid(m_pmCurrentState.ccustate.insBatCurrentElectricity).name()); - lbs[VAR_TO_STR(insBatCurElect)+suffix] = m_pmCurrentState.ccustate.insBatCurrentElectricity; - - suffix = getTypeName(typeid(m_pmCurrentState.ccustate.powerBatCurrentElectricity).name()); - lbs[VAR_TO_STR(powBatCurElect)+suffix] = m_pmCurrentState.ccustate.powerBatCurrentElectricity; - - suffix = getTypeName(typeid(m_pmCurrentState.ccustate.insChargeState).name()); - lbs[VAR_TO_STR(insChargeState)+suffix] = m_pmCurrentState.ccustate.insChargeState; - - suffix = getTypeName(typeid(m_pmCurrentState.ccustate.powerChargeState).name()); - lbs[VAR_TO_STR(powChargeState)+suffix] = m_pmCurrentState.ccustate.powerChargeState; - - suffix = getTypeName(typeid(m_pmCurrentState.ccustate.insLinkVoltage).name()); - lbs[VAR_TO_STR(insLinkVol)+suffix] = m_pmCurrentState.ccustate.insLinkVoltage; - - suffix = getTypeName(typeid(m_pmCurrentState.ccustate.insPackVoltage).name()); - lbs[VAR_TO_STR(insPackVol)+suffix] = m_pmCurrentState.ccustate.insPackVoltage; - - suffix = getTypeName(typeid(m_pmCurrentState.ccustate.insCurrent).name()); - lbs[VAR_TO_STR(insCurrent)+suffix] = m_pmCurrentState.ccustate.insCurrent; - - suffix = getTypeName(typeid(m_pmCurrentState.ccustate.insPosInsulationResistance).name()); - lbs[VAR_TO_STR(insPosRes)+suffix] = m_pmCurrentState.ccustate.insPosInsulationResistance; - - suffix = getTypeName(typeid(m_pmCurrentState.ccustate.insNegInsulationResistance).name()); - lbs[VAR_TO_STR(insNegRes)+suffix] = m_pmCurrentState.ccustate.insNegInsulationResistance; - - suffix = getTypeName(typeid(m_pmCurrentState.ccustate.powerLinkVoltage).name()); - lbs[VAR_TO_STR(powLinkVol)+suffix] = m_pmCurrentState.ccustate.powerLinkVoltage; - - suffix = getTypeName(typeid(m_pmCurrentState.ccustate.powerPackVoltage).name()); - lbs[VAR_TO_STR(powerPackVol)+suffix] = m_pmCurrentState.ccustate.powerPackVoltage; - - suffix = getTypeName(typeid(m_pmCurrentState.ccustate.powerCurrent).name()); - lbs[VAR_TO_STR(powCur)+suffix] = m_pmCurrentState.ccustate.powerCurrent; - - suffix = getTypeName(typeid(m_pmCurrentState.ccustate.powerPosInsulationResistance).name()); - lbs[VAR_TO_STR(powPosRes)+suffix] = m_pmCurrentState.ccustate.powerPosInsulationResistance; - - suffix = getTypeName(typeid(m_pmCurrentState.ccustate.powerNegInsulationResistance).name()); - lbs[VAR_TO_STR(powNegRes)+suffix] = m_pmCurrentState.ccustate.powerNegInsulationResistance; - - suffix = getTypeName(typeid(m_pmCurrentState.ccustate.insCurrentSocHold1).name()); - lbs[VAR_TO_STR(insCurSocHold1)+suffix] = m_pmCurrentState.ccustate.insCurrentSocHold1; - - suffix = getTypeName(typeid(m_pmCurrentState.ccustate.insCurrentSocHold2).name()); - lbs[VAR_TO_STR(insCurSocHold2)+suffix] = m_pmCurrentState.ccustate.insCurrentSocHold2; - - suffix = getTypeName(typeid(m_pmCurrentState.ccustate.insCurrentSocHold3).name()); - lbs[VAR_TO_STR(insCurSocHold3)+suffix] = m_pmCurrentState.ccustate.insCurrentSocHold3; - - suffix = getTypeName(typeid(m_pmCurrentState.ccustate.fcuCurrentToInsLimit1).name()); - lbs[VAR_TO_STR(fcuCurToInsLimit1)+suffix] = m_pmCurrentState.ccustate.fcuCurrentToInsLimit1; - - suffix = getTypeName(typeid(m_pmCurrentState.ccustate.fcuCurrentToinsLimit2).name()); - lbs[VAR_TO_STR(fcuCurToinsLimit2)+suffix] = m_pmCurrentState.ccustate.fcuCurrentToinsLimit2; - - suffix = getTypeName(typeid(m_pmCurrentState.ccustate.powerCurrentSocHold1).name()); - lbs[VAR_TO_STR(powCurSocHold1)+suffix] = m_pmCurrentState.ccustate.powerCurrentSocHold1; - - suffix = getTypeName(typeid(m_pmCurrentState.ccustate.powerCurrentSocHold2).name()); - lbs[VAR_TO_STR(powCurSocHold2)+suffix] = m_pmCurrentState.ccustate.powerCurrentSocHold2; - - suffix = getTypeName(typeid(m_pmCurrentState.ccustate.powerCurrentSocHold3).name()); - lbs[VAR_TO_STR(powCurSocHold3)+suffix] = m_pmCurrentState.ccustate.powerCurrentSocHold3; - - suffix = getTypeName(typeid(m_pmCurrentState.ccustate.powerCurrentToInsLimit1).name()); - lbs[VAR_TO_STR(powCurToInsLimit1)+suffix] = m_pmCurrentState.ccustate.powerCurrentToInsLimit1; - - suffix = getTypeName(typeid(m_pmCurrentState.ccustate.powerCurrentToinsLimit2).name()); - lbs[VAR_TO_STR(powCurToinsLimit2)+suffix] = m_pmCurrentState.ccustate.powerCurrentToinsLimit2; - - suffix = getTypeName(typeid(m_pmCurrentState.ccustate.insAlarmIdentificationWord).name()); - lbs[VAR_TO_STR(insfaultCode)+suffix] = m_pmCurrentState.ccustate.insAlarmIdentificationWord; - suffix = getTypeName(typeid(m_pmCurrentState.ccustate.powerAlarmIdentificationWord).name()); - lbs[VAR_TO_STR(powfaultCode)+suffix] = m_pmCurrentState.ccustate.powerAlarmIdentificationWord; - - //5.构建配电系统状态报告 - disBus1Breaker* pdis1=new disBus1Breaker; - disBus2Breaker* pdis2=new disBus2Breaker; - disBus3Breaker* pdis3=new disBus3Breaker; - disBus4Breaker* pdis4=new disBus4Breaker; - - *pdis1 = m_currentDisBreakerState.bus1Breaker; - *pdis2 = m_currentDisBreakerState.bus2Breaker; - *pdis3 = m_currentDisBreakerState.bus3Breaker; - *pdis4 = m_currentDisBreakerState.bus4Breaker; - - dis["HVolBusBreaker_uint16"] = *(unsigned short*)pdis1; - dis["HVolABusBreaker_unit16"] = *(unsigned short*)pdis2; - dis["HVolBBusBreaker_unit16"] = *(unsigned short*)pdis3; - dis["LVolBusBreaker_uint16"] = *(unsigned short*)pdis4; - - //TODO: 构建配电系统故障码 - Json::Value faultCodeDis_array; - for(auto val : faultCode) - { - faultCodeDis_array.append(val); - } - dis[VAR_TO_STR(faultCode_array)] = faultCodeDis_array; - - - Json::Value currentBusState; - suffix = getTypeName(typeid(m_pmCurrentState.bus1State.powerBusVoltage).name()); - currentBusState[VAR_TO_STR(HVBpowerBusVol)+suffix] = m_pmCurrentState.bus1State.powerBusVoltage; - suffix = getTypeName(typeid(m_pmCurrentState.bus1State.dcDc5ModuleCurrent).name()); - currentBusState[VAR_TO_STR(HVBdcDc5Cur)+suffix] = m_pmCurrentState.bus1State.dcDc5ModuleCurrent; - suffix = getTypeName(typeid(m_pmCurrentState.bus1State.powerBusCurrent).name()); - currentBusState[VAR_TO_STR(HVBpowerBusCur)+suffix] = m_pmCurrentState.bus1State.powerBusCurrent; - suffix = getTypeName(typeid(m_pmCurrentState.bus1State.busbarAVoltage).name()); - currentBusState[VAR_TO_STR(HVBbusAVol)+suffix] = m_pmCurrentState.bus1State.busbarAVoltage; - suffix = getTypeName(typeid(m_pmCurrentState.bus1State.propulsionMotorControlBoxCurrent).name()); - currentBusState[VAR_TO_STR(HVBmotorCur)+suffix] = m_pmCurrentState.bus1State.propulsionMotorControlBoxCurrent; - suffix = getTypeName(typeid(m_pmCurrentState.bus1State.busbarACurrent).name()); - currentBusState[VAR_TO_STR(HVBbusACur)+suffix] = m_pmCurrentState.bus1State.busbarACurrent; - suffix = getTypeName(typeid(m_pmCurrentState.bus1State.lithiumBatteryGroupMeterCurrent).name()); - currentBusState[VAR_TO_STR(HVBbatGroupCur)+suffix] = m_pmCurrentState.bus1State.lithiumBatteryGroupMeterCurrent; - suffix = getTypeName(typeid(m_pmCurrentState.bus1State.bowHighVoltageDistributionBoxCurrent).name()); - currentBusState[VAR_TO_STR(HVBbowHVolDisBoxCur)+suffix] = m_pmCurrentState.bus1State.bowHighVoltageDistributionBoxCurrent; - suffix = getTypeName(typeid(m_pmCurrentState.bus1State.sternFTDevice45Current).name()); - currentBusState[VAR_TO_STR(HVBFTDev45Cur)+suffix] = m_pmCurrentState.bus1State.sternFTDevice45Current; - suffix = getTypeName(typeid(m_pmCurrentState.bus1State.tyzReservedSwitchCurrent).name()); - currentBusState[VAR_TO_STR(HVBtyzCur)+suffix] = m_pmCurrentState.bus1State.tyzReservedSwitchCurrent; - suffix = getTypeName(typeid(m_pmCurrentState.bus1State.sternRudderSwitch1Current).name()); - currentBusState[VAR_TO_STR(HVBsternRud1Cur)+suffix] = m_pmCurrentState.bus1State.sternRudderSwitch1Current; - suffix = getTypeName(typeid(m_pmCurrentState.bus1State.reservedCurrent1).name()); - currentBusState[VAR_TO_STR(HVBreservedCur1)+suffix] = m_pmCurrentState.bus1State.reservedCurrent1; - suffix = getTypeName(typeid(m_pmCurrentState.bus1State.sternRudderSwitch2Current).name()); - currentBusState[VAR_TO_STR(HVBsternRud2Cur)+suffix] = m_pmCurrentState.bus1State.sternRudderSwitch2Current; - suffix = getTypeName(typeid(m_pmCurrentState.bus1State.reservedCurrent2).name()); - currentBusState[VAR_TO_STR(HVBreservedCur2)+suffix] = m_pmCurrentState.bus1State.reservedCurrent2; - suffix = getTypeName(typeid(m_pmCurrentState.bus1State.fbReservedSwitchCurrent).name()); - currentBusState[VAR_TO_STR(HVBfbCur)+suffix] = m_pmCurrentState.bus1State.fbReservedSwitchCurrent; - suffix = getTypeName(typeid(m_pmCurrentState.bus1State.reservedCurrent3).name()); - currentBusState[VAR_TO_STR(HVBreservedCur3)+suffix] = m_pmCurrentState.bus1State.reservedCurrent3; - - suffix = getTypeName(typeid(m_pmCurrentState.bus2State.busbarBVoltage).name()); - currentBusState[VAR_TO_STR(HVABbusBVol)+suffix] = m_pmCurrentState.bus2State.busbarBVoltage; - suffix = getTypeName(typeid(m_pmCurrentState.bus2State.busbarBCurrent).name()); - currentBusState[VAR_TO_STR(HVABbusBCur)+suffix] = m_pmCurrentState.bus2State.busbarBCurrent; - suffix = getTypeName(typeid(m_pmCurrentState.bus2State.bowFTDevice123Current).name()); - currentBusState[VAR_TO_STR(HVABFTDev123Cur)+suffix] = m_pmCurrentState.bus2State.bowFTDevice123Current; - suffix = getTypeName(typeid(m_pmCurrentState.bus2State.actuatorCurrent).name()); - currentBusState[VAR_TO_STR(HVABactCur)+suffix] = m_pmCurrentState.bus2State.actuatorCurrent; - suffix = getTypeName(typeid(m_pmCurrentState.bus2State.mastSteeringGearControlBoxCurrent).name()); - currentBusState[VAR_TO_STR(HVABmastSteGeaCur)+suffix] = m_pmCurrentState.bus2State.mastSteeringGearControlBoxCurrent; - suffix = getTypeName(typeid(m_pmCurrentState.bus2State.xczCurrent).name()); - currentBusState[VAR_TO_STR(HVABxczCur)+suffix] = m_pmCurrentState.bus2State.xczCurrent; - suffix = getTypeName(typeid(m_pmCurrentState.bus2State.bowRudderControlBoxCurrent).name()); - currentBusState[VAR_TO_STR(HVABbowRudCur)+suffix] = m_pmCurrentState.bus2State.bowRudderControlBoxCurrent; - suffix = getTypeName(typeid(m_pmCurrentState.bus2State.openWaterCoverStartCylinderCurrent).name()); - currentBusState[VAR_TO_STR(HVABopenWaterCur)+suffix] = m_pmCurrentState.bus2State.openWaterCoverStartCylinderCurrent; - - suffix = getTypeName(typeid(m_pmCurrentState.bus3State.instrumentBusbarVoltage).name()); - currentBusState[VAR_TO_STR(HVBBinsBusVol)+suffix] = m_pmCurrentState.bus3State.instrumentBusbarVoltage; - suffix = getTypeName(typeid(m_pmCurrentState.bus3State.bowLowVoltageDistributionBoxCurrent).name()); - currentBusState[VAR_TO_STR(HVBBbowLowVolDisBoxCur)+suffix] = m_pmCurrentState.bus3State.bowLowVoltageDistributionBoxCurrent; - suffix = getTypeName(typeid(m_pmCurrentState.bus3State.dcC1InstrumentDC48VCurrent).name()); - currentBusState[VAR_TO_STR(HVBBdcC1InsCur)+suffix] = m_pmCurrentState.bus3State.dcC1InstrumentDC48VCurrent; - suffix = getTypeName(typeid(m_pmCurrentState.bus3State.reservedCurrent1).name()); - currentBusState[VAR_TO_STR(HVBBreservedCur1)+suffix] = m_pmCurrentState.bus3State.reservedCurrent1; - suffix = getTypeName(typeid(m_pmCurrentState.bus3State.emergencyLithiumBatteryGroup2Current).name()); - currentBusState[VAR_TO_STR(HVBBemerBatCur)+suffix] = m_pmCurrentState.bus3State.emergencyLithiumBatteryGroup2Current; - suffix = getTypeName(typeid(m_pmCurrentState.bus3State.lithiumBatteryGroupInstrumentCurrent).name()); - currentBusState[VAR_TO_STR(HVBBbatInsCur)+suffix] = m_pmCurrentState.bus3State.lithiumBatteryGroupInstrumentCurrent; - suffix = getTypeName(typeid(m_pmCurrentState.bus3State.unit4InstrumentDC48VCurrent).name()); - currentBusState[VAR_TO_STR(HVBBunit4Cur)+suffix] = m_pmCurrentState.bus3State.unit4InstrumentDC48VCurrent; - suffix = getTypeName(typeid(m_pmCurrentState.bus3State.reservedCurrent2).name()); - currentBusState[VAR_TO_STR(HVBBreservedCur2)+suffix] = m_pmCurrentState.bus3State.reservedCurrent2; - suffix = getTypeName(typeid(m_pmCurrentState.bus3State.emergency2BusbarVoltage).name()); - currentBusState[VAR_TO_STR(HVBBemer2BusVol)+suffix] = m_pmCurrentState.bus3State.emergency2BusbarVoltage; - suffix = getTypeName(typeid(m_pmCurrentState.bus3State.compositeEnergyManagementSystemEmergencyDC48VCurrent).name()); - currentBusState[VAR_TO_STR(HVBBCCUCur)+suffix] = m_pmCurrentState.bus3State.compositeEnergyManagementSystemEmergencyDC48VCurrent; - suffix = getTypeName(typeid(m_pmCurrentState.bus3State.fuelCellSecuritySystemEmergencyDC48VCurrent).name()); - currentBusState[VAR_TO_STR(HVBBFCSSecurSysCur)+suffix] = m_pmCurrentState.bus3State.fuelCellSecuritySystemEmergencyDC48VCurrent; - suffix = getTypeName(typeid(m_pmCurrentState.bus3State.plcControlPowerCurrent).name()); - currentBusState[VAR_TO_STR(HVBBplcCur)+suffix] = m_pmCurrentState.bus3State.plcControlPowerCurrent; - - suffix = getTypeName(typeid(m_pmCurrentState.bus4State.instrumentBusbarVoltage).name()); - currentBusState[VAR_TO_STR(LVBinsBusVol)+suffix] = m_pmCurrentState.bus4State.instrumentBusbarVoltage; - suffix = getTypeName(typeid(m_pmCurrentState.bus4State.instrumentBusbarCurrent).name()); - currentBusState[VAR_TO_STR(LVBBinsBusCur)+suffix] = m_pmCurrentState.bus4State.instrumentBusbarCurrent; - suffix = getTypeName(typeid(m_pmCurrentState.bus4State.unit1Current).name()); - currentBusState[VAR_TO_STR(LVBBunit1Cur)+suffix] = m_pmCurrentState.bus4State.unit1Current; - suffix = getTypeName(typeid(m_pmCurrentState.bus4State.unit2Current).name()); - currentBusState[VAR_TO_STR(LVBBunit2Cur)+suffix] = m_pmCurrentState.bus4State.unit2Current; - suffix = getTypeName(typeid(m_pmCurrentState.bus4State.unit3Current).name()); - currentBusState[VAR_TO_STR(LVBBunit3Cur)+suffix] = m_pmCurrentState.bus4State.unit3Current; - suffix = getTypeName(typeid(m_pmCurrentState.bus4State.unit5Current).name()); - currentBusState[VAR_TO_STR(LVBBunit5Cur)+suffix] = m_pmCurrentState.bus4State.unit5Current; - suffix = getTypeName(typeid(m_pmCurrentState.bus4State.bowPZDeviceCurrent).name()); - currentBusState[VAR_TO_STR(LVBBbowPZDevCur)+suffix] = m_pmCurrentState.bus4State.bowPZDeviceCurrent; - suffix = getTypeName(typeid(m_pmCurrentState.bus4State.emergencyLithiumBatteryGroup1Current).name()); - currentBusState[VAR_TO_STR(LVBBemerBatCur)+suffix] = m_pmCurrentState.bus4State.emergencyLithiumBatteryGroup1Current; - suffix = getTypeName(typeid(m_pmCurrentState.bus4State.emergency1BusbarVoltage).name()); - currentBusState[VAR_TO_STR(LVBBemerBusVol)+suffix] = m_pmCurrentState.bus4State.emergency1BusbarVoltage; - - // dis["currentBusState"] = currentBusState; - - // pms[VAR_TO_STR(fcs_obj)] = fcs; - // pms[VAR_TO_STR(lbs_obj)] = lbs; - // pms[VAR_TO_STR(dis_obj)] = dis; - - Notify(PM_TO_DB_STATE, pms.toStyledString()); - Notify(PM_TO_DB_FCSSTATE, fcs.toStyledString()); - Notify(PM_TO_DB_LIBATSTATE, lbs.toStyledString()); - Notify(PM_TO_DB_DISSTATE, dis.toStyledString()); - Notify(PM_TO_DB_CURRENTSTATE, currentBusState.toStyledString()); - - // 使用StreamWriterBuilder来设置保持插入顺序 - Json::StreamWriterBuilder builder; - builder["indentation"] = " "; // 设置不缩进,保持紧凑格式 - builder["enableYAMLCompatibility"] = true; // 保持插入顺序 - - // 将Json::Value对象转换为字符串 - string pathFile = "/home/zjk/project/H100/H100PowerManger/data/msg/"; - string jsonStr = Json::writeString(builder, pms); - - saveStringToJsonFile(jsonStr, pathFile+PM_TO_DB_STATE+".json"); - - jsonStr = Json::writeString(builder, fcs); - saveStringToJsonFile(jsonStr, pathFile+PM_TO_DB_FCSSTATE+".json"); - - jsonStr = Json::writeString(builder, lbs); - saveStringToJsonFile(jsonStr, pathFile+PM_TO_DB_LIBATSTATE+".json"); - - jsonStr = Json::writeString(builder, dis); - saveStringToJsonFile(jsonStr, pathFile+PM_TO_DB_DISSTATE + ".json"); - - jsonStr = Json::writeString(builder, currentBusState); - saveStringToJsonFile(jsonStr, pathFile+PM_TO_DB_CURRENTSTATE + ".json"); - - return true; -} +} \ No newline at end of file diff --git a/src/pPowerManger/PowerManger.h b/src/pPowerManger/PowerManger.h index 5c148a8..02bd5c0 100644 --- a/src/pPowerManger/PowerManger.h +++ b/src/pPowerManger/PowerManger.h @@ -37,8 +37,8 @@ class PowerManagerFsm; #include "SQLiteDB.h" #include "driver.h" #include "LowerCommManager.h" +#include "UpperCommManager.h" -#define VAR_TO_STR(var) #var #define IPORT 5000 #define CCUPORT 5001 @@ -68,7 +68,6 @@ class PowerManger : public AppCastingMOOSApp PowerManger(); ~PowerManger(); public: - bool ListenLoopUDP(); bool FsmLoop(); protected: // Standard MOOSApp functions to overload @@ -90,16 +89,11 @@ class PowerManger : public AppCastingMOOSApp //通信状态变量及操作函数 XPCUdpSocket* setUdpScoket(long lPort); - bool updatePmState(); - bool updateConnectState(); + // bool updatePmState(); + // bool updateConnectState(); int connectState; - double msg_CcuStateFbMsg_Update_time; - // double msg_CcuSetParmFbMsg_Update_time; - double msg_disHighVolBusFbMsg_Update_time; - double msg_disHighAVolBusFbMsg_Update_time; - double msg_disHighBVolBusFbMsg_Update_time; - double msg_disLowBusFbMsg_Update_time; + /************************************************************/ /* |<------------FEEDBACK--------<-- */ /* | | */ @@ -138,30 +132,18 @@ class PowerManger : public AppCastingMOOSApp Driver m_driver; //设备驱动 std::string m_pmEvent; // 状态机事件描述 //=============================运行变量====================================== - // 配电和CCU的反馈状态 - msg_CcuStateFbMsg m_CcuCurrentState; - msg_disHighVolBusFbMsg m_disHighVolBusCurrentState; - msg_disHighAVolBusFbMsg m_disHighAVolBusCurrentState; - msg_disHighBVolBusFbMsg m_disHighBVolBusCurrentState; - msg_disLowBusFbMsg m_disLowBusState; - - //下位机操作函数 - void disSysOption(); - void ccuOption(); - - char getBreakerOption(char cmd); + // char getBreakerOption(char cmd); void initControlCmd(); //上位机操作函数 - bool buildPowerSysReport(); + // bool buildPowerSysReport(); bool getMsCmdFromJson(MSControlCmd &cmd,const string &strJson); private: - // CMOOSThread m_ListenThread; // CMOOSThread m_FsmThread; LowerCommManager* m_lowerCommManager; - XPCUdpSocket* m_udpSocket; + UpperCommManager* m_upperCommManager; // 状态机实例 PowerManagerFsm m_fsm; @@ -180,8 +162,10 @@ class PowerManger : public AppCastingMOOSApp bool shutdown(); bool powerOn(); bool powerOff(); - - + + bool sendNotification(const std::string& key, const std::string& value) { + return Notify(key, value); + } }; #endif diff --git a/src/pPowerManger/UpperCommManager.cpp b/src/pPowerManger/UpperCommManager.cpp index c760d54..c9a25f4 100644 --- a/src/pPowerManger/UpperCommManager.cpp +++ b/src/pPowerManger/UpperCommManager.cpp @@ -32,14 +32,442 @@ bool UpperCommManager::processUpperMsg(const string& key, const string& strJson) } void UpperCommManager::processPeriodicTasks() { - buildPowerSysReport(); - Notify(PM_TO_DB_SUBDISCMD, - m_pm->m_driver.saveDriverTableToJson(&m_pm->m_subDisSysCmd)); - Notify(PM_TO_DB_EQUIPMENTSTATE, - m_pm->m_driver.saveDriverTableToJson(&m_pm->m_currentDriverState)); + buildSystemReport(); + // m_pm->Notify(PM_TO_DB_SUBDISCMD, m_pm->m_driver.saveDriverTableToJson(&m_pm->m_subDisSysCmd)); + // m_pm->Notify(PM_TO_DB_EQUIPMENTSTATE, m_pm->m_driver.saveDriverTableToJson(&m_pm->m_currentDriverState)); } -void UpperCommManager::buildPowerSysReport() { - // 原有buildPowerSysReport实现 - // 需要从PowerManger.cpp迁移过来 +void UpperCommManager::buildSystemReport() { + //TODO: 构建能源系统报告 + string suffix; + Json::Value pms; + Json::Value fcs; + Json::Value lbs; + Json::Value dis; + // 构建能源系统报告 + //1.构建系统状态报告 + suffix = getTypeName(typeid(m_pm->workCondition).name()); + pms[VAR_TO_STR(workCondition)+suffix] = m_pm->workCondition; + + suffix = getTypeName(typeid(m_pm->currentMod).name()); + pms[VAR_TO_STR(currentMod)+suffix] = m_pm->currentMod; + + suffix = getTypeName(typeid(m_pm->powerState).name()); + pms[VAR_TO_STR(powerState)+suffix] = m_pm->powerState; + + suffix = getTypeName(typeid(m_pm->falutLevel).name()); + pms[VAR_TO_STR(falutLevel)+suffix] = m_pm->falutLevel; + + Json::Value faultCode_array; + for(auto val : m_pm->faultCode) + { + faultCode_array.append(val); + } + pms[VAR_TO_STR(faultCode_array)] = faultCode_array; + + suffix = getTypeName(typeid(m_pm->soc).name()); + pms[VAR_TO_STR(soc)+suffix] = m_pm->soc; + + suffix = getTypeName(typeid(m_pm->sustainableTime).name()); + pms[VAR_TO_STR(sustainableTime)+suffix] = m_pm->sustainableTime; + + //2.构建燃料电池状态报告 + suffix = getTypeName(typeid(m_pm->m_pmCurrentState.ccustate.fcuState).name()); + fcs[VAR_TO_STR(fcuState)+suffix] = m_pm->m_pmCurrentState.ccustate.fcuState; + + suffix = getTypeName(typeid(m_pm->m_pmCurrentState.ccustate.fcuFaultLeve).name()); + fcs[VAR_TO_STR(fcuFaultLeve)+suffix] = m_pm->m_pmCurrentState.ccustate.fcuFaultLeve; + + suffix = getTypeName(typeid(m_pm->m_pmCurrentState.ccustate.powerLimit).name()); + fcs[VAR_TO_STR(powLimit)+suffix] = m_pm->m_pmCurrentState.ccustate.powerLimit; + + suffix = getTypeName(typeid(m_pm->m_pmCurrentState.ccustate.totalPowerGeneration).name()); + fcs[VAR_TO_STR(powerGen)+suffix] = m_pm->m_pmCurrentState.ccustate.totalPowerGeneration; + + suffix = getTypeName(typeid(m_pm->m_pmCurrentState.ccustate.ch4o).name()); + fcs[VAR_TO_STR(ch4o)+suffix] = m_pm->m_pmCurrentState.ccustate.ch4o; + + suffix = getTypeName(typeid(m_pm->m_pmCurrentState.ccustate.o2).name()); + fcs[VAR_TO_STR(o2)+suffix] = m_pm->m_pmCurrentState.ccustate.o2; + + suffix = getTypeName(typeid(m_pm->m_pmCurrentState.ccustate.fcuVoltage).name()); + fcs[VAR_TO_STR(fcuVol)+suffix] = m_pm->m_pmCurrentState.ccustate.fcuVoltage; + + suffix = getTypeName(typeid(m_pm->m_pmCurrentState.ccustate.fcuCurrent).name()); + fcs[VAR_TO_STR(fcuCur)+suffix] = m_pm->m_pmCurrentState.ccustate.fcuCurrent; + + suffix = getTypeName(typeid(m_pm->m_pmCurrentState.ccustate.o2Level).name()); + fcs[VAR_TO_STR(o2Level)+suffix] = m_pm->m_pmCurrentState.ccustate.o2Level; + + suffix = getTypeName(typeid(m_pm->m_pmCurrentState.ccustate.exchangerTemperature).name()); + fcs[VAR_TO_STR(excTemp)+suffix] = m_pm->m_pmCurrentState.ccustate.exchangerTemperature; + + suffix = getTypeName(typeid(m_pm->m_pmCurrentState.ccustate.fcuOutPower).name()); + fcs[VAR_TO_STR(fcuOutPower)+suffix] = m_pm->m_pmCurrentState.ccustate.fcuOutPower; + + suffix = getTypeName(typeid(m_pm->m_pmCurrentState.ccustate.fcuOutIns).name()); + fcs[VAR_TO_STR(fcuOutIns)+suffix] = m_pm->m_pmCurrentState.ccustate.fcuOutIns; + + suffix = getTypeName(typeid(m_pm->m_pmCurrentState.ccustate.fcuVoltageIns).name()); + fcs[VAR_TO_STR(fcuVolIns)+suffix] = m_pm->m_pmCurrentState.ccustate.fcuVoltageIns; + + suffix = getTypeName(typeid(m_pm->m_pmCurrentState.ccustate.fcuVoltagePower).name()); + fcs[VAR_TO_STR(fcuVolPower)+suffix] = m_pm->m_pmCurrentState.ccustate.fcuVoltagePower; + + suffix = getTypeName(typeid(m_pm->m_pmCurrentState.ccustate.fcuCurrentIns).name()); + fcs[VAR_TO_STR(fcuCurIns)+suffix] = m_pm->m_pmCurrentState.ccustate.fcuCurrentIns; + + suffix = getTypeName(typeid(m_pm->m_pmCurrentState.ccustate.fcuCurrentPower).name()); + fcs[VAR_TO_STR(fcuCurPower)+suffix] = m_pm->m_pmCurrentState.ccustate.fcuCurrentPower; + + suffix = getTypeName(typeid(m_pm->m_pmCurrentState.ccustate.h2Concentration1).name()); + fcs[VAR_TO_STR(h2Concent1)+suffix] = m_pm->m_pmCurrentState.ccustate.h2Concentration1; + + suffix = getTypeName(typeid(m_pm->m_pmCurrentState.ccustate.h2Concentration2).name()); + fcs[VAR_TO_STR(h2Concent2)+suffix] = m_pm->m_pmCurrentState.ccustate.h2Concentration2; + + suffix = getTypeName(typeid(m_pm->m_pmCurrentState.ccustate.o2Concentration1).name()); + fcs[VAR_TO_STR(o2Concent1)+suffix] = m_pm->m_pmCurrentState.ccustate.o2Concentration1; + + suffix = getTypeName(typeid(m_pm->m_pmCurrentState.ccustate.o2Concentration2).name()); + fcs[VAR_TO_STR(o2Concent2)+suffix] = m_pm->m_pmCurrentState.ccustate.o2Concentration2; + + suffix = getTypeName(typeid(m_pm->m_pmCurrentState.ccustate.ch4oConcentration1).name()); + fcs[VAR_TO_STR(ch4oConcent1)+suffix] = m_pm->m_pmCurrentState.ccustate.ch4oConcentration1; + + suffix = getTypeName(typeid(m_pm->m_pmCurrentState.ccustate.ch4oConcentration2).name()); + fcs[VAR_TO_STR(ch4oConcent2)+suffix] = m_pm->m_pmCurrentState.ccustate.ch4oConcentration2; + + suffix = getTypeName(typeid(m_pm->m_pmCurrentState.ccustate.backpressure1).name()); + fcs[VAR_TO_STR(backpressure1)+suffix] = m_pm->m_pmCurrentState.ccustate.backpressure1; + + suffix = getTypeName(typeid(m_pm->m_pmCurrentState.ccustate.backpressure2).name()); + fcs[VAR_TO_STR(backpressure2)+suffix] = m_pm->m_pmCurrentState.ccustate.backpressure2; + + suffix = getTypeName(typeid(m_pm->m_pmCurrentState.ccustate.flameDetection).name()); + fcs[VAR_TO_STR(flameDet)+suffix] = m_pm->m_pmCurrentState.ccustate.flameDetection; + + unsigned short faultCode1; + unsigned short faultCode2; + unsigned short faultCode3; + faultCode1 = (m_pm->m_pmCurrentState.ccustate.fcuGZ_1H << 8) | m_pm->m_pmCurrentState.ccustate.fcuGZ_1L; + faultCode2 = (m_pm->m_pmCurrentState.ccustate.fcuGZ_2H << 8) | m_pm->m_pmCurrentState.ccustate.fcuGZ_2L; + faultCode3 = (m_pm->m_pmCurrentState.ccustate.fcuGZ_3H << 8) | m_pm->m_pmCurrentState.ccustate.fcuGZ_3L; + + suffix = getTypeName(typeid(faultCode1).name()); + fcs[VAR_TO_STR(faultCode1)+suffix] = faultCode1; + suffix = getTypeName(typeid(faultCode2).name()); + fcs[VAR_TO_STR(faultCode2)+suffix] = faultCode2; + suffix = getTypeName(typeid(faultCode3).name()); + fcs[VAR_TO_STR(faultCode3)+suffix] = faultCode3; + + //4.构建动力锂电池状态报告 + suffix = getTypeName(typeid(m_pm->m_pmCurrentState.ccustate.insPosRelayState).name()); + lbs[VAR_TO_STR(insPosRelayState)+suffix] = m_pm->m_pmCurrentState.ccustate.insPosRelayState; + + suffix = getTypeName(typeid(m_pm->m_pmCurrentState.ccustate.insNegRelayState).name()); + lbs[VAR_TO_STR(insNegRelayState)+suffix] = m_pm->m_pmCurrentState.ccustate.insNegRelayState; + + suffix = getTypeName(typeid(m_pm->m_pmCurrentState.ccustate.powerPosRelayState).name()); + lbs[VAR_TO_STR(powPosRelayState)+suffix] = m_pm->m_pmCurrentState.ccustate.powerPosRelayState; + + suffix = getTypeName(typeid(m_pm->m_pmCurrentState.ccustate.powerNegRelayState).name()); + lbs[VAR_TO_STR(powNegRelayState)+suffix] = m_pm->m_pmCurrentState.ccustate.powerNegRelayState; + + suffix = getTypeName(typeid(m_pm->m_pmCurrentState.ccustate.insBatLimit).name()); + lbs[VAR_TO_STR(insBatLimit)+suffix] = m_pm->m_pmCurrentState.ccustate.insBatLimit; + + suffix = getTypeName(typeid(m_pm->m_pmCurrentState.ccustate.powerBatLimit).name()); + lbs[VAR_TO_STR(powerBatLimit)+suffix] = m_pm->m_pmCurrentState.ccustate.powerBatLimit; + + suffix = getTypeName(typeid(m_pm->m_pmCurrentState.ccustate.insBatSoc).name()); + lbs[VAR_TO_STR(insBatSoc)+suffix] = m_pm->m_pmCurrentState.ccustate.insBatSoc; + + suffix = getTypeName(typeid(m_pm->m_pmCurrentState.ccustate.powerBatSoc).name()); + lbs[VAR_TO_STR(powBatSoc)+suffix] = m_pm->m_pmCurrentState.ccustate.powerBatSoc; + + suffix = getTypeName(typeid(m_pm->m_pmCurrentState.ccustate.insBatTotalElectricity).name()); + lbs[VAR_TO_STR(insBatTotalElect)+suffix] = m_pm->m_pmCurrentState.ccustate.insBatTotalElectricity; + + suffix = getTypeName(typeid(m_pm->m_pmCurrentState.ccustate.powerBatTotalElectricity).name()); + lbs[VAR_TO_STR(powBatTotalElect)+suffix] = m_pm->m_pmCurrentState.ccustate.powerBatTotalElectricity; + + suffix = getTypeName(typeid(m_pm->m_pmCurrentState.ccustate.insBatCurrentElectricity).name()); + lbs[VAR_TO_STR(insBatCurElect)+suffix] = m_pm->m_pmCurrentState.ccustate.insBatCurrentElectricity; + + suffix = getTypeName(typeid(m_pm->m_pmCurrentState.ccustate.powerBatCurrentElectricity).name()); + lbs[VAR_TO_STR(powBatCurElect)+suffix] = m_pm->m_pmCurrentState.ccustate.powerBatCurrentElectricity; + + suffix = getTypeName(typeid(m_pm->m_pmCurrentState.ccustate.insChargeState).name()); + lbs[VAR_TO_STR(insChargeState)+suffix] = m_pm->m_pmCurrentState.ccustate.insChargeState; + + suffix = getTypeName(typeid(m_pm->m_pmCurrentState.ccustate.powerChargeState).name()); + lbs[VAR_TO_STR(powChargeState)+suffix] = m_pm->m_pmCurrentState.ccustate.powerChargeState; + + suffix = getTypeName(typeid(m_pm->m_pmCurrentState.ccustate.insLinkVoltage).name()); + lbs[VAR_TO_STR(insLinkVol)+suffix] = m_pm->m_pmCurrentState.ccustate.insLinkVoltage; + + suffix = getTypeName(typeid(m_pm->m_pmCurrentState.ccustate.insPackVoltage).name()); + lbs[VAR_TO_STR(insPackVol)+suffix] = m_pm->m_pmCurrentState.ccustate.insPackVoltage; + + suffix = getTypeName(typeid(m_pm->m_pmCurrentState.ccustate.insCurrent).name()); + lbs[VAR_TO_STR(insCurrent)+suffix] = m_pm->m_pmCurrentState.ccustate.insCurrent; + + suffix = getTypeName(typeid(m_pm->m_pmCurrentState.ccustate.insPosInsulationResistance).name()); + lbs[VAR_TO_STR(insPosRes)+suffix] = m_pm->m_pmCurrentState.ccustate.insPosInsulationResistance; + + suffix = getTypeName(typeid(m_pm->m_pmCurrentState.ccustate.insNegInsulationResistance).name()); + lbs[VAR_TO_STR(insNegRes)+suffix] = m_pm->m_pmCurrentState.ccustate.insNegInsulationResistance; + + suffix = getTypeName(typeid(m_pm->m_pmCurrentState.ccustate.powerLinkVoltage).name()); + lbs[VAR_TO_STR(powLinkVol)+suffix] = m_pm->m_pmCurrentState.ccustate.powerLinkVoltage; + + suffix = getTypeName(typeid(m_pm->m_pmCurrentState.ccustate.powerPackVoltage).name()); + lbs[VAR_TO_STR(powerPackVol)+suffix] = m_pm->m_pmCurrentState.ccustate.powerPackVoltage; + + suffix = getTypeName(typeid(m_pm->m_pmCurrentState.ccustate.powerCurrent).name()); + lbs[VAR_TO_STR(powCur)+suffix] = m_pm->m_pmCurrentState.ccustate.powerCurrent; + + suffix = getTypeName(typeid(m_pm->m_pmCurrentState.ccustate.powerPosInsulationResistance).name()); + lbs[VAR_TO_STR(powPosRes)+suffix] = m_pm->m_pmCurrentState.ccustate.powerPosInsulationResistance; + + suffix = getTypeName(typeid(m_pm->m_pmCurrentState.ccustate.powerNegInsulationResistance).name()); + lbs[VAR_TO_STR(powNegRes)+suffix] = m_pm->m_pmCurrentState.ccustate.powerNegInsulationResistance; + + suffix = getTypeName(typeid(m_pm->m_pmCurrentState.ccustate.insCurrentSocHold1).name()); + lbs[VAR_TO_STR(insCurSocHold1)+suffix] = m_pm->m_pmCurrentState.ccustate.insCurrentSocHold1; + + suffix = getTypeName(typeid(m_pm->m_pmCurrentState.ccustate.insCurrentSocHold2).name()); + lbs[VAR_TO_STR(insCurSocHold2)+suffix] = m_pm->m_pmCurrentState.ccustate.insCurrentSocHold2; + + suffix = getTypeName(typeid(m_pm->m_pmCurrentState.ccustate.insCurrentSocHold3).name()); + lbs[VAR_TO_STR(insCurSocHold3)+suffix] = m_pm->m_pmCurrentState.ccustate.insCurrentSocHold3; + + suffix = getTypeName(typeid(m_pm->m_pmCurrentState.ccustate.fcuCurrentToInsLimit1).name()); + lbs[VAR_TO_STR(fcuCurToInsLimit1)+suffix] = m_pm->m_pmCurrentState.ccustate.fcuCurrentToInsLimit1; + + suffix = getTypeName(typeid(m_pm->m_pmCurrentState.ccustate.fcuCurrentToinsLimit2).name()); + lbs[VAR_TO_STR(fcuCurToinsLimit2)+suffix] = m_pm->m_pmCurrentState.ccustate.fcuCurrentToinsLimit2; + + suffix = getTypeName(typeid(m_pm->m_pmCurrentState.ccustate.powerCurrentSocHold1).name()); + lbs[VAR_TO_STR(powCurSocHold1)+suffix] = m_pm->m_pmCurrentState.ccustate.powerCurrentSocHold1; + + suffix = getTypeName(typeid(m_pm->m_pmCurrentState.ccustate.powerCurrentSocHold2).name()); + lbs[VAR_TO_STR(powCurSocHold2)+suffix] = m_pm->m_pmCurrentState.ccustate.powerCurrentSocHold2; + + suffix = getTypeName(typeid(m_pm->m_pmCurrentState.ccustate.powerCurrentSocHold3).name()); + lbs[VAR_TO_STR(powCurSocHold3)+suffix] = m_pm->m_pmCurrentState.ccustate.powerCurrentSocHold3; + + suffix = getTypeName(typeid(m_pm->m_pmCurrentState.ccustate.powerCurrentToInsLimit1).name()); + lbs[VAR_TO_STR(powCurToInsLimit1)+suffix] = m_pm->m_pmCurrentState.ccustate.powerCurrentToInsLimit1; + + suffix = getTypeName(typeid(m_pm->m_pmCurrentState.ccustate.powerCurrentToinsLimit2).name()); + lbs[VAR_TO_STR(powCurToinsLimit2)+suffix] = m_pm->m_pmCurrentState.ccustate.powerCurrentToinsLimit2; + + suffix = getTypeName(typeid(m_pm->m_pmCurrentState.ccustate.insAlarmIdentificationWord).name()); + lbs[VAR_TO_STR(insfaultCode)+suffix] = m_pm->m_pmCurrentState.ccustate.insAlarmIdentificationWord; + suffix = getTypeName(typeid(m_pm->m_pmCurrentState.ccustate.powerAlarmIdentificationWord).name()); + lbs[VAR_TO_STR(powfaultCode)+suffix] = m_pm->m_pmCurrentState.ccustate.powerAlarmIdentificationWord; + + //5.构建配电系统状态报告 + disBus1Breaker* pdis1=new disBus1Breaker; + disBus2Breaker* pdis2=new disBus2Breaker; + disBus3Breaker* pdis3=new disBus3Breaker; + disBus4Breaker* pdis4=new disBus4Breaker; + + *pdis1 = m_pm->m_currentDisBreakerState.bus1Breaker; + *pdis2 = m_pm->m_currentDisBreakerState.bus2Breaker; + *pdis3 = m_pm->m_currentDisBreakerState.bus3Breaker; + *pdis4 = m_pm->m_currentDisBreakerState.bus4Breaker; + + dis["HVolBusBreaker_uint16"] = *(unsigned short*)pdis1; + dis["HVolABusBreaker_unit16"] = *(unsigned short*)pdis2; + dis["HVolBBusBreaker_unit16"] = *(unsigned short*)pdis3; + dis["LVolBusBreaker_uint16"] = *(unsigned short*)pdis4; + + //TODO: 构建配电系统故障码 + Json::Value faultCodeDis_array; + for(auto val : m_pm->faultCode) + { + faultCodeDis_array.append(val); + } + dis[VAR_TO_STR(faultCode_array)] = faultCodeDis_array; + + + Json::Value currentBusState; + suffix = getTypeName(typeid(m_pm->m_pmCurrentState.bus1State.powerBusVoltage).name()); + currentBusState[VAR_TO_STR(HVBpowerBusVol)+suffix] = m_pm->m_pmCurrentState.bus1State.powerBusVoltage; + suffix = getTypeName(typeid(m_pm->m_pmCurrentState.bus1State.dcDc5ModuleCurrent).name()); + currentBusState[VAR_TO_STR(HVBdcDc5Cur)+suffix] = m_pm->m_pmCurrentState.bus1State.dcDc5ModuleCurrent; + suffix = getTypeName(typeid(m_pm->m_pmCurrentState.bus1State.powerBusCurrent).name()); + currentBusState[VAR_TO_STR(HVBpowerBusCur)+suffix] = m_pm->m_pmCurrentState.bus1State.powerBusCurrent; + suffix = getTypeName(typeid(m_pm->m_pmCurrentState.bus1State.busbarAVoltage).name()); + currentBusState[VAR_TO_STR(HVBbusAVol)+suffix] = m_pm->m_pmCurrentState.bus1State.busbarAVoltage; + suffix = getTypeName(typeid(m_pm->m_pmCurrentState.bus1State.propulsionMotorControlBoxCurrent).name()); + currentBusState[VAR_TO_STR(HVBmotorCur)+suffix] = m_pm->m_pmCurrentState.bus1State.propulsionMotorControlBoxCurrent; + suffix = getTypeName(typeid(m_pm->m_pmCurrentState.bus1State.busbarACurrent).name()); + currentBusState[VAR_TO_STR(HVBbusACur)+suffix] = m_pm->m_pmCurrentState.bus1State.busbarACurrent; + suffix = getTypeName(typeid(m_pm->m_pmCurrentState.bus1State.lithiumBatteryGroupMeterCurrent).name()); + currentBusState[VAR_TO_STR(HVBbatGroupCur)+suffix] = m_pm->m_pmCurrentState.bus1State.lithiumBatteryGroupMeterCurrent; + suffix = getTypeName(typeid(m_pm->m_pmCurrentState.bus1State.bowHighVoltageDistributionBoxCurrent).name()); + currentBusState[VAR_TO_STR(HVBbowHVolDisBoxCur)+suffix] = m_pm->m_pmCurrentState.bus1State.bowHighVoltageDistributionBoxCurrent; + suffix = getTypeName(typeid(m_pm->m_pmCurrentState.bus1State.sternFTDevice45Current).name()); + currentBusState[VAR_TO_STR(HVBFTDev45Cur)+suffix] = m_pm->m_pmCurrentState.bus1State.sternFTDevice45Current; + suffix = getTypeName(typeid(m_pm->m_pmCurrentState.bus1State.tyzReservedSwitchCurrent).name()); + currentBusState[VAR_TO_STR(HVBtyzCur)+suffix] = m_pm->m_pmCurrentState.bus1State.tyzReservedSwitchCurrent; + suffix = getTypeName(typeid(m_pm->m_pmCurrentState.bus1State.sternRudderSwitch1Current).name()); + currentBusState[VAR_TO_STR(HVBsternRud1Cur)+suffix] = m_pm->m_pmCurrentState.bus1State.sternRudderSwitch1Current; + suffix = getTypeName(typeid(m_pm->m_pmCurrentState.bus1State.reservedCurrent1).name()); + currentBusState[VAR_TO_STR(HVBreservedCur1)+suffix] = m_pm->m_pmCurrentState.bus1State.reservedCurrent1; + suffix = getTypeName(typeid(m_pm->m_pmCurrentState.bus1State.sternRudderSwitch2Current).name()); + currentBusState[VAR_TO_STR(HVBsternRud2Cur)+suffix] = m_pm->m_pmCurrentState.bus1State.sternRudderSwitch2Current; + suffix = getTypeName(typeid(m_pm->m_pmCurrentState.bus1State.reservedCurrent2).name()); + currentBusState[VAR_TO_STR(HVBreservedCur2)+suffix] = m_pm->m_pmCurrentState.bus1State.reservedCurrent2; + suffix = getTypeName(typeid(m_pm->m_pmCurrentState.bus1State.fbReservedSwitchCurrent).name()); + currentBusState[VAR_TO_STR(HVBfbCur)+suffix] = m_pm->m_pmCurrentState.bus1State.fbReservedSwitchCurrent; + suffix = getTypeName(typeid(m_pm->m_pmCurrentState.bus1State.reservedCurrent3).name()); + currentBusState[VAR_TO_STR(HVBreservedCur3)+suffix] = m_pm->m_pmCurrentState.bus1State.reservedCurrent3; + + suffix = getTypeName(typeid(m_pm->m_pmCurrentState.bus2State.busbarBVoltage).name()); + currentBusState[VAR_TO_STR(HVABbusBVol)+suffix] = m_pm->m_pmCurrentState.bus2State.busbarBVoltage; + suffix = getTypeName(typeid(m_pm->m_pmCurrentState.bus2State.busbarBCurrent).name()); + currentBusState[VAR_TO_STR(HVABbusBCur)+suffix] = m_pm->m_pmCurrentState.bus2State.busbarBCurrent; + suffix = getTypeName(typeid(m_pm->m_pmCurrentState.bus2State.bowFTDevice123Current).name()); + currentBusState[VAR_TO_STR(HVABFTDev123Cur)+suffix] = m_pm->m_pmCurrentState.bus2State.bowFTDevice123Current; + suffix = getTypeName(typeid(m_pm->m_pmCurrentState.bus2State.actuatorCurrent).name()); + currentBusState[VAR_TO_STR(HVABactCur)+suffix] = m_pm->m_pmCurrentState.bus2State.actuatorCurrent; + suffix = getTypeName(typeid(m_pm->m_pmCurrentState.bus2State.mastSteeringGearControlBoxCurrent).name()); + currentBusState[VAR_TO_STR(HVABmastSteGeaCur)+suffix] = m_pm->m_pmCurrentState.bus2State.mastSteeringGearControlBoxCurrent; + suffix = getTypeName(typeid(m_pm->m_pmCurrentState.bus2State.xczCurrent).name()); + currentBusState[VAR_TO_STR(HVABxczCur)+suffix] = m_pm->m_pmCurrentState.bus2State.xczCurrent; + suffix = getTypeName(typeid(m_pm->m_pmCurrentState.bus2State.bowRudderControlBoxCurrent).name()); + currentBusState[VAR_TO_STR(HVABbowRudCur)+suffix] = m_pm->m_pmCurrentState.bus2State.bowRudderControlBoxCurrent; + suffix = getTypeName(typeid(m_pm->m_pmCurrentState.bus2State.openWaterCoverStartCylinderCurrent).name()); + currentBusState[VAR_TO_STR(HVABopenWaterCur)+suffix] = m_pm->m_pmCurrentState.bus2State.openWaterCoverStartCylinderCurrent; + + suffix = getTypeName(typeid(m_pm->m_pmCurrentState.bus3State.instrumentBusbarVoltage).name()); + currentBusState[VAR_TO_STR(HVBBinsBusVol)+suffix] = m_pm->m_pmCurrentState.bus3State.instrumentBusbarVoltage; + suffix = getTypeName(typeid(m_pm->m_pmCurrentState.bus3State.bowLowVoltageDistributionBoxCurrent).name()); + currentBusState[VAR_TO_STR(HVBBbowLowVolDisBoxCur)+suffix] = m_pm->m_pmCurrentState.bus3State.bowLowVoltageDistributionBoxCurrent; + suffix = getTypeName(typeid(m_pm->m_pmCurrentState.bus3State.dcC1InstrumentDC48VCurrent).name()); + currentBusState[VAR_TO_STR(HVBBdcC1InsCur)+suffix] = m_pm->m_pmCurrentState.bus3State.dcC1InstrumentDC48VCurrent; + suffix = getTypeName(typeid(m_pm->m_pmCurrentState.bus3State.reservedCurrent1).name()); + currentBusState[VAR_TO_STR(HVBBreservedCur1)+suffix] = m_pm->m_pmCurrentState.bus3State.reservedCurrent1; + suffix = getTypeName(typeid(m_pm->m_pmCurrentState.bus3State.emergencyLithiumBatteryGroup2Current).name()); + currentBusState[VAR_TO_STR(HVBBemerBatCur)+suffix] = m_pm->m_pmCurrentState.bus3State.emergencyLithiumBatteryGroup2Current; + suffix = getTypeName(typeid(m_pm->m_pmCurrentState.bus3State.lithiumBatteryGroupInstrumentCurrent).name()); + currentBusState[VAR_TO_STR(HVBBbatInsCur)+suffix] = m_pm->m_pmCurrentState.bus3State.lithiumBatteryGroupInstrumentCurrent; + suffix = getTypeName(typeid(m_pm->m_pmCurrentState.bus3State.unit4InstrumentDC48VCurrent).name()); + currentBusState[VAR_TO_STR(HVBBunit4Cur)+suffix] = m_pm->m_pmCurrentState.bus3State.unit4InstrumentDC48VCurrent; + suffix = getTypeName(typeid(m_pm->m_pmCurrentState.bus3State.reservedCurrent2).name()); + currentBusState[VAR_TO_STR(HVBBreservedCur2)+suffix] = m_pm->m_pmCurrentState.bus3State.reservedCurrent2; + suffix = getTypeName(typeid(m_pm->m_pmCurrentState.bus3State.emergency2BusbarVoltage).name()); + currentBusState[VAR_TO_STR(HVBBemer2BusVol)+suffix] = m_pm->m_pmCurrentState.bus3State.emergency2BusbarVoltage; + suffix = getTypeName(typeid(m_pm->m_pmCurrentState.bus3State.compositeEnergyManagementSystemEmergencyDC48VCurrent).name()); + currentBusState[VAR_TO_STR(HVBBCCUCur)+suffix] = m_pm->m_pmCurrentState.bus3State.compositeEnergyManagementSystemEmergencyDC48VCurrent; + suffix = getTypeName(typeid(m_pm->m_pmCurrentState.bus3State.fuelCellSecuritySystemEmergencyDC48VCurrent).name()); + currentBusState[VAR_TO_STR(HVBBFCSSecurSysCur)+suffix] = m_pm->m_pmCurrentState.bus3State.fuelCellSecuritySystemEmergencyDC48VCurrent; + suffix = getTypeName(typeid(m_pm->m_pmCurrentState.bus3State.plcControlPowerCurrent).name()); + currentBusState[VAR_TO_STR(HVBBplcCur)+suffix] = m_pm->m_pmCurrentState.bus3State.plcControlPowerCurrent; + + suffix = getTypeName(typeid(m_pm->m_pmCurrentState.bus4State.instrumentBusbarVoltage).name()); + currentBusState[VAR_TO_STR(LVBinsBusVol)+suffix] = m_pm->m_pmCurrentState.bus4State.instrumentBusbarVoltage; + suffix = getTypeName(typeid(m_pm->m_pmCurrentState.bus4State.instrumentBusbarCurrent).name()); + currentBusState[VAR_TO_STR(LVBBinsBusCur)+suffix] = m_pm->m_pmCurrentState.bus4State.instrumentBusbarCurrent; + suffix = getTypeName(typeid(m_pm->m_pmCurrentState.bus4State.unit1Current).name()); + currentBusState[VAR_TO_STR(LVBBunit1Cur)+suffix] = m_pm->m_pmCurrentState.bus4State.unit1Current; + suffix = getTypeName(typeid(m_pm->m_pmCurrentState.bus4State.unit2Current).name()); + currentBusState[VAR_TO_STR(LVBBunit2Cur)+suffix] = m_pm->m_pmCurrentState.bus4State.unit2Current; + suffix = getTypeName(typeid(m_pm->m_pmCurrentState.bus4State.unit3Current).name()); + currentBusState[VAR_TO_STR(LVBBunit3Cur)+suffix] = m_pm->m_pmCurrentState.bus4State.unit3Current; + suffix = getTypeName(typeid(m_pm->m_pmCurrentState.bus4State.unit5Current).name()); + currentBusState[VAR_TO_STR(LVBBunit5Cur)+suffix] = m_pm->m_pmCurrentState.bus4State.unit5Current; + suffix = getTypeName(typeid(m_pm->m_pmCurrentState.bus4State.bowPZDeviceCurrent).name()); + currentBusState[VAR_TO_STR(LVBBbowPZDevCur)+suffix] = m_pm->m_pmCurrentState.bus4State.bowPZDeviceCurrent; + suffix = getTypeName(typeid(m_pm->m_pmCurrentState.bus4State.emergencyLithiumBatteryGroup1Current).name()); + currentBusState[VAR_TO_STR(LVBBemerBatCur)+suffix] = m_pm->m_pmCurrentState.bus4State.emergencyLithiumBatteryGroup1Current; + suffix = getTypeName(typeid(m_pm->m_pmCurrentState.bus4State.emergency1BusbarVoltage).name()); + currentBusState[VAR_TO_STR(LVBBemerBusVol)+suffix] = m_pm->m_pmCurrentState.bus4State.emergency1BusbarVoltage; + + // dis["currentBusState"] = currentBusState; + + // pms[VAR_TO_STR(fcs_obj)] = fcs; + // pms[VAR_TO_STR(lbs_obj)] = lbs; + // pms[VAR_TO_STR(dis_obj)] = dis; + + m_pm->sendNotification(PM_TO_DB_STATE, pms.toStyledString()); + m_pm->sendNotification(PM_TO_DB_FCSSTATE, fcs.toStyledString()); + m_pm->sendNotification(PM_TO_DB_LIBATSTATE, lbs.toStyledString()); + m_pm->sendNotification(PM_TO_DB_DISSTATE, dis.toStyledString()); + m_pm->sendNotification(PM_TO_DB_CURRENTSTATE, currentBusState.toStyledString()); + + // 使用StreamWriterBuilder来设置保持插入顺序 + Json::StreamWriterBuilder builder; + builder["indentation"] = " "; // 设置不缩进,保持紧凑格式 + builder["enableYAMLCompatibility"] = true; // 保持插入顺序 + + // 将Json::Value对象转换为字符串 + string pathFile = "/home/zjk/project/H100/H100PowerManger/data/msg/"; + string jsonStr = Json::writeString(builder, pms); + + saveStringToJsonFile(jsonStr, pathFile+PM_TO_DB_STATE+".json"); + + jsonStr = Json::writeString(builder, fcs); + saveStringToJsonFile(jsonStr, pathFile+PM_TO_DB_FCSSTATE+".json"); + + jsonStr = Json::writeString(builder, lbs); + saveStringToJsonFile(jsonStr, pathFile+PM_TO_DB_LIBATSTATE+".json"); + + jsonStr = Json::writeString(builder, dis); + saveStringToJsonFile(jsonStr, pathFile+PM_TO_DB_DISSTATE + ".json"); + + jsonStr = Json::writeString(builder, currentBusState); + saveStringToJsonFile(jsonStr, pathFile+PM_TO_DB_CURRENTSTATE + ".json"); + +// return true; +} +bool UpperCommManager::saveStringToJsonFile(const string &strJson, const string &filePath) +{ + std::ofstream file(filePath, std::ios::trunc); + if (file.is_open()) { + file << strJson; + file.close(); + // std::cout << "字符串已成功保存到文件中。" << std::endl; + return true; + } else { + std::cerr << "无法打开文件!" << std::endl; + return false; + } +} +string UpperCommManager::getTypeName(const string typeName) +{ + // 映射类型名称到指定的字符串 + if (typeName == "i" || typeName == "c") { + return "_int8"; + } else if (typeName == "h" || typeName == "C") { + return "_uint8"; + } else if (typeName == "s" || typeName == "S") { + return "_int16"; + } else if (typeName == "t" || typeName == "T") { + return "_uint16"; + } else if (typeName == "i" || typeName == "I") { + return "_int32"; + } else if (typeName == "j" || typeName == "J") { + return "_uint32"; + } else if (typeName == "x" || typeName == "X") { + return "_int64"; + } else if (typeName == "f" || typeName == "F") { + return "_fp32"; + } else if (typeName == "d" || typeName == "D") { + return "_fp64"; + } else if (typeName == "b" || typeName == "B") { + return "_bool"; + } else if (typeName == "NSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE") { + return "_str"; + } else if (typeName == "St6vector" || typeName == "St5deque" || typeName == "St4list" || typeName == "St4pair") { + return "_array"; + } else { + // 默认情况 + return "_obj"; + } } \ No newline at end of file diff --git a/src/pPowerManger/UpperCommManager.h b/src/pPowerManger/UpperCommManager.h index 8af515c..2ffa099 100644 --- a/src/pPowerManger/UpperCommManager.h +++ b/src/pPowerManger/UpperCommManager.h @@ -5,6 +5,11 @@ #include "pmSysvariable.h" #include "driver.h" #include "json/json.h" +#include +#include +#include +using namespace std; +#define VAR_TO_STR(var) #var class PowerManger; // 前向声明 @@ -13,20 +18,28 @@ public: UpperCommManager(PowerManger* powerManager); ~UpperCommManager(); + //周期调用 + void processPeriodicTasks(); + // 处理上位机消息 bool processUpperMsg(const std::string& key, const std::string& msg); // 生成系统报告 - bool buildSystemReport(); + void buildSystemReport(); // 获取控制命令 const MSControlCmd& getControlCmd() const { return m_msCmd; } // 更新设备命令状态 void updateEquipmentCmd(const DriverTable& cmd); - + + // 其他公共函数 + string getTypeName(const string typeName); + bool saveStringToJsonFile(const string &strJson, const string &filePath); + + private: - PowerManger* m_powerManager; + PowerManger* m_pm; MSControlCmd m_msCmd; Driver m_driver; From 785a47ff99e62b557d1469a9ba266c6464df6695 Mon Sep 17 00:00:00 2001 From: zhaojingkui <1553836110@qq.com> Date: Wed, 9 Apr 2025 15:11:31 +0800 Subject: [PATCH 8/9] =?UTF-8?q?=E4=BC=98=E5=8C=96=E9=80=9A=E4=BF=A1?= =?UTF-8?q?=E4=BB=A3=E7=A0=81,=E4=BF=AE=E5=A4=8D=E7=8A=B6=E6=80=81?= =?UTF-8?q?=E6=9C=BA=E7=9A=84bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- data/msg/uPower_currentState_st.json | 2 +- data/msg/uPower_disSysState_st.json | 6 +- data/msg/uPower_fcsState_st.json | 28 ++--- data/msg/uPower_liBatState_st.json | 22 ++-- src/pPowerManger/LowerCommManager.cpp | 6 + src/pPowerManger/PowerManagerFsm.cpp | 7 ++ src/pPowerManger/PowerManagerFsm.hpp | 35 ++++-- src/pPowerManger/PowerManger.cpp | 151 ++++---------------------- src/pPowerManger/PowerManger.h | 53 ++------- src/pPowerManger/UpperCommManager.cpp | 113 ++++++++++++++++--- src/pPowerManger/UpperCommManager.h | 31 +++++- 11 files changed, 219 insertions(+), 235 deletions(-) diff --git a/data/msg/uPower_currentState_st.json b/data/msg/uPower_currentState_st.json index a8a0701..41648bf 100644 --- a/data/msg/uPower_currentState_st.json +++ b/data/msg/uPower_currentState_st.json @@ -6,7 +6,7 @@ "HVABbusBVol_uint16": 0, "HVABmastSteGeaCur_uint16": 0, "HVABopenWaterCur_uint16": 0, - "HVABxczCur_uint16": 1, + "HVABxczCur_uint16": 0, "HVBBCCUCur_uint16": 0, "HVBBFCSSecurSysCur_uint16": 0, "HVBBbatInsCur_uint16": 0, diff --git a/data/msg/uPower_disSysState_st.json b/data/msg/uPower_disSysState_st.json index 90bc4ac..ed8e1bf 100644 --- a/data/msg/uPower_disSysState_st.json +++ b/data/msg/uPower_disSysState_st.json @@ -1,8 +1,8 @@ { "HVolABusBreaker_unit16": 0, - "HVolBBusBreaker_unit16": 79, - "HVolBusBreaker_uint16": 58, - "LVolBusBreaker_uint16": 159, + "HVolBBusBreaker_unit16": 0, + "HVolBusBreaker_uint16": 0, + "LVolBusBreaker_uint16": 0, "faultCode_array": [ 0 diff --git a/data/msg/uPower_fcsState_st.json b/data/msg/uPower_fcsState_st.json index 200368f..31141fb 100644 --- a/data/msg/uPower_fcsState_st.json +++ b/data/msg/uPower_fcsState_st.json @@ -1,30 +1,30 @@ { - "backpressure1_fp32": 5.0, - "backpressure2_fp32": 3.0, - "ch4oConcent1_fp32": 85.0, - "ch4oConcent2_fp32": 48.0, + "backpressure1_fp32": 0.0, + "backpressure2_fp32": 0.0, + "ch4oConcent1_fp32": 0.0, + "ch4oConcent2_fp32": 0.0, "ch4o_fp32": 0.0, - "excTemp_fp32": 37.0, + "excTemp_fp32": 0.0, "faultCode1_uint16": 0, "faultCode2_uint16": 0, "faultCode3_uint16": 0, "fcuCurIns_fp32": 0.0, "fcuCurPower_fp32": 0.0, - "fcuCur_fp32": 6.0, + "fcuCur_fp32": 0.0, "fcuFaultLeve_uint8": 0, - "fcuOutIns_fp32": 76.0, - "fcuOutPower_fp32": 912.0, + "fcuOutIns_fp32": 0.0, + "fcuOutPower_fp32": 0.0, "fcuState_uint8": 0, "fcuVolIns_fp32": 0.0, "fcuVolPower_fp32": 0.0, - "fcuVol_fp32": 236.0, + "fcuVol_fp32": 0.0, "flameDet_uint8": 0, - "h2Concent1_fp32": 32.0, - "h2Concent2_fp32": 50.0, - "o2Concent1_fp32": 56.0, - "o2Concent2_fp32": 91.0, + "h2Concent1_fp32": 0.0, + "h2Concent2_fp32": 0.0, + "o2Concent1_fp32": 0.0, + "o2Concent2_fp32": 0.0, "o2Level_fp32": 0.0, "o2_fp32": 0.0, - "powLimit_fp32": 64.0, + "powLimit_fp32": 0.0, "powerGen_fp32": 0.0 } \ No newline at end of file diff --git a/data/msg/uPower_liBatState_st.json b/data/msg/uPower_liBatState_st.json index a062620..b3e9fd4 100644 --- a/data/msg/uPower_liBatState_st.json +++ b/data/msg/uPower_liBatState_st.json @@ -2,37 +2,37 @@ "fcuCurToInsLimit1_uint8": 0, "fcuCurToinsLimit2_uint8": 0, "insBatCurElect_uint16": 0, - "insBatLimit_uint16": 6, - "insBatSoc_uint8": 9, - "insBatTotalElect_uint16": 667, + "insBatLimit_uint16": 0, + "insBatSoc_uint8": 0, + "insBatTotalElect_uint16": 0, "insChargeState_uint8": 0, "insCurSocHold1_uint8": 0, "insCurSocHold2_uint8": 0, "insCurSocHold3_uint8": 0, - "insCurrent_uint16": 13, + "insCurrent_uint16": 0, "insLinkVol_uint16": 0, - "insNegRelayState_uint8": 1, + "insNegRelayState_uint8": 0, "insNegRes_uint16": 0, "insPackVol_uint16": 0, "insPosRelayState_uint8": 0, "insPosRes_uint16": 0, "insfaultCode_uint8": 0, "powBatCurElect_uint16": 0, - "powBatSoc_uint8": 24, - "powBatTotalElect_uint16": 142, + "powBatSoc_uint8": 0, + "powBatTotalElect_uint16": 0, "powChargeState_uint8": 0, "powCurSocHold1_uint8": 0, "powCurSocHold2_uint8": 0, "powCurSocHold3_uint8": 0, "powCurToInsLimit1_uint8": 0, "powCurToinsLimit2_uint8": 0, - "powCur_uint16": 86, + "powCur_uint16": 0, "powLinkVol_uint16": 0, - "powNegRelayState_uint8": 1, + "powNegRelayState_uint8": 0, "powNegRes_uint16": 0, - "powPosRelayState_uint8": 1, + "powPosRelayState_uint8": 0, "powPosRes_uint16": 0, - "powerBatLimit_uint16": 77, + "powerBatLimit_uint16": 0, "powerPackVol_uint16": 0, "powfaultCode_uint8": 0 } \ No newline at end of file diff --git a/src/pPowerManger/LowerCommManager.cpp b/src/pPowerManger/LowerCommManager.cpp index 8a817eb..2b1f7bd 100644 --- a/src/pPowerManger/LowerCommManager.cpp +++ b/src/pPowerManger/LowerCommManager.cpp @@ -317,4 +317,10 @@ char LowerCommManager::getBreakerOption(char cmd) return 0xAA; else return 0x00; +} + +//TODO:根据心跳检查连接状态 +bool LowerCommManager::checkConnection() +{ + m_pm->connectState =5; } \ No newline at end of file diff --git a/src/pPowerManger/PowerManagerFsm.cpp b/src/pPowerManger/PowerManagerFsm.cpp index 50cd2d7..8849ab9 100644 --- a/src/pPowerManger/PowerManagerFsm.cpp +++ b/src/pPowerManger/PowerManagerFsm.cpp @@ -8,12 +8,15 @@ PowerManger* PowerManagerFsm::pm = nullptr; // InitState实现 void InitState::entry() { + PowerManagerFsm::entry(); + std::cout << "===========================" << std::endl; // PowerManagerFsm::pm->m_pmEvent = "初始化状态"; PowerManagerFsm::pm->printState("InitState", "进入初始化状态"); } void InitState::react(InitEvent const &) { // double StartTime = PowerManagerFsm::pm->GetAppStartTime(); + std::cout << "开始初始化" << std::endl; double StartTime = 0; while (PowerManagerFsm::pm->connectState < 5) { MOOSPause(1000); @@ -49,10 +52,14 @@ void InitState::react(InitEvent const &) { MOOSPause(1000); PowerManagerFsm::pm->printState("InitState", PowerManagerFsm::pm->m_pmEvent); } + std::cout << "InitState: 初始化完成" << std::endl; + //转换到待机状态 + transit(); } // StandbyState实现 void StandbyState::entry() { + PowerManagerFsm::entry(); PowerManagerFsm::pm->printState("StandbyState", "进入待机状态"); } diff --git a/src/pPowerManger/PowerManagerFsm.hpp b/src/pPowerManger/PowerManagerFsm.hpp index eeeacc7..0be6748 100644 --- a/src/pPowerManger/PowerManagerFsm.hpp +++ b/src/pPowerManger/PowerManagerFsm.hpp @@ -6,30 +6,48 @@ // 前向声明 class PowerManger; +enum class PowerSystemState { + INIT, + STANDBY, + FAULT, +}; + // 定义事件类型 +//==================状态切换事件============================= struct InitEvent : tinyfsm::Event { }; struct StandbyEvent : tinyfsm::Event { }; struct FaultEvent : tinyfsm::Event { unsigned int faultCode; FaultEvent(unsigned int code) : faultCode(code) {} }; +//==================状态流程事件============================ +struct MasterCommandEvent : tinyfsm::Event { }; +struct TaskStart : tinyfsm::Event { }; +// struct + // 定义状态机基类 -class PowerManagerFsm : public tinyfsm::MooreMachine { +class PowerManagerFsm : public tinyfsm::Fsm { protected: static PowerManger* pm; - + public: // 初始化状态机 static void init(PowerManger* powerManager) { pm = powerManager; } // 响应事件默认实现 - virtual void react(tinyfsm::Event const &) { } + virtual void react(tinyfsm::Event const &) { std::cout << "[ Reseve Envt ] " << "No Idear" << std::endl; } + virtual void react(InitEvent const &) {}; + virtual void react(StandbyEvent const &) {}; + virtual void react(FaultEvent const &) {}; + virtual void react(MasterCommandEvent const &) {}; + virtual void react(TaskStart const &) {}; // 状态机生命周期方法 - void entry() {std::cout << "Enter state: " << typeid(*this).name() << std::endl;} // 进入状态 - void exit() {std::cout << "Exit state: " << typeid(*this).name() << std::endl;} // 退出状态 + virtual void entry() {std::cout << "[ Enter state ] : " << typeid(*this).name() << std::endl;} // 进入状态 + virtual void exit() {std::cout << "[ Exit state ] : " << typeid(*this).name() << std::endl;} // 退出状态 + // 状态转换接口 void triggerInitEvent() { dispatch(InitEvent()); } @@ -40,14 +58,15 @@ public: class InitState : public PowerManagerFsm { public: - void entry(); + void entry() override; void react(InitEvent const &); }; class StandbyState : public PowerManagerFsm { public: - void entry(); + void entry() override; void react(StandbyEvent const &); + PowerSystemState getCurrentState(); private: void handlePowerCommands(); void handlePowerOn(); @@ -55,7 +74,7 @@ private: class FaultState : public PowerManagerFsm { public: - void entry(); + void entry() override; void react(FaultEvent const &); }; diff --git a/src/pPowerManger/PowerManger.cpp b/src/pPowerManger/PowerManger.cpp index 7e651b6..a78b461 100644 --- a/src/pPowerManger/PowerManger.cpp +++ b/src/pPowerManger/PowerManger.cpp @@ -35,15 +35,6 @@ PowerManger::PowerManger() m_ticker = 0; faultCode.push_back(0); - // msg_CcuStateFbMsg_Update_time = 0; - // // msg_CcuSetParmFbMsg_Update_time = 0; - // msg_disHighVolBusFbMsg_Update_time = 0; - // msg_disHighAVolBusFbMsg_Update_time = 0; - // msg_disHighBVolBusFbMsg_Update_time = 0; - // msg_disLowBusFbMsg_Update_time = 0; - - connectState = 0; - m_pmCurrentState = {}; m_currentDisBreakerState = {}; m_targetDisBreakerState = {}; @@ -65,19 +56,6 @@ PowerManger::PowerManger() m_db->createDriversTables(VAR_TO_STR(m_subDisSysCmd)); m_db->createDriversTables(VAR_TO_STR(m_MSDriverCmd)); - //初始化UDP通信 - m_lowerCommManager = new LowerCommManager(this,IPORT,CCUPORT,CCUHOST); - m_lowerCommManager->initUdpComm(); - - //初始化上位机通信 - m_upperCommManager = new UpperCommManager(this); - - // 初始化状态机 - cout << "init fsm" << endl; - m_fsm.init(this); - PowerManagerFsm::start(); - PowerManagerFsm::dispatch(InitEvent()); - cout << "init fsm ok" << endl; } //--------------------------------------------------------- @@ -103,32 +81,9 @@ bool PowerManger::OnNewMail(MOOSMSG_LIST &NewMail) string key = msg.GetKey(); string strJson = msg.GetString(); //处理上位机发送的控制指令 - if(key == DB_TO_PM_MSCMD) + if(!m_upperCommManager->processUpperMsg(key,strJson)) { - if(getMsCmdFromJson(m_msCmd,strJson)) - { - cout << "get ms cmd:" << strJson << endl; - } - else - { - cout << MOOS::ConsoleColours::Red << "get ms cmd error:" << strJson << MOOS::ConsoleColours::reset << endl; - } - } - //处理设备上电指令 - if (key == DB_TO_PM_EQUIPMENTCMD) - { - if(m_driver.loadDriverTableFromJson(strJson,m_subDisSysCmd) < 0) - { - cout << MOOS::ConsoleColours::Red << "get sub dis cmd error:" << strJson << MOOS::ConsoleColours::reset << endl; - } - } - //处理设备状态反馈 - if(key == DB_TO_PM_SUBDISSTATE) - { - if(m_driver.loadDriverTableFromJson(strJson,m_subDisSysState) < 0) - { - cout << MOOS::ConsoleColours::Red << "get sub dis state error:" << strJson << MOOS::ConsoleColours::reset << endl; - } + cout << "processUpperMsg failed" << endl; } #if 0 // Keep these around just for template @@ -167,13 +122,15 @@ bool PowerManger::OnConnectToServer() bool PowerManger::Iterate() { AppCastingMOOSApp::Iterate(); + // 打印当前状态 + // cout << " Current State : " << (int)PowerManagerFsm::current_state_ptr->getCurrentState(); if (m_ticker++ % 5 == 0) { m_lowerCommManager->processPeriodicTasks(); m_upperCommManager->processPeriodicTasks(); // buildPowerSysReport(); - Notify(PM_TO_DB_SUBDISCMD,m_driver.saveDriverTableToJson(&m_subDisSysCmd)); - Notify(PM_TO_DB_EQUIPMENTSTATE,m_driver.saveDriverTableToJson(&m_currentDriverState)); + //Notify(PM_TO_DB_SUBDISCMD,m_driver.saveDriverTableToJson(&m_subDisSysCmd)); + //Notify(PM_TO_DB_EQUIPMENTSTATE,m_driver.saveDriverTableToJson(&m_currentDriverState)); //d.保存到数据库 writeDataToDB(); } @@ -229,7 +186,19 @@ bool PowerManger::OnStartUp() } registerVariables(); + //初始化UDP通信 + m_lowerCommManager = new LowerCommManager(this,IPORT,CCUPORT,CCUHOST); + m_lowerCommManager->initUdpComm(); m_lowerCommManager->startListenThread(); + + //初始化上位机通信 + m_upperCommManager = new UpperCommManager(this); + + // 初始化状态机 + PowerManagerFsm::init(this); + PowerManagerFsm::start(); + InitEvent initEvent; + PowerManagerFsm::dispatch(initEvent); return(true); } @@ -263,22 +232,6 @@ bool PowerManger::buildReport() return(true); } -//------------------------------------------------------------ -// Procedure: setUdpScoket() -XPCUdpSocket* PowerManger::setUdpScoket(long lPort) -{ - XPCUdpSocket* pUdpSocket = new XPCUdpSocket(lPort); - try - { - pUdpSocket->vBindSocket(); - } - catch(const std::exception& e) - { - std::cerr << e.what() << '\n'; - return NULL; - } - return pUdpSocket; -} bool PowerManger::FsmLoop() @@ -302,9 +255,6 @@ bool PowerManger::FsmLoop() bool PowerManger::writeDataToDB() { - // //写入配电系统状态 - // if(!m_db->insertDisCcuData(m_pmCurrentState)) - // return false; //写入设备状态 if(!m_db->insertDriverTables(m_currentDriverState,VAR_TO_STR(m_currentDriverState))) return false; @@ -333,22 +283,6 @@ int PowerManger::checkError() //2.检查断路器状态 } - -// void PowerManger::triggerInitEvent() -// { -// PowerManagerFsm::dispatch(InitEvent()); -// } - -// void PowerManger::triggerStandbyEvent() -// { -// PowerManagerFsm::dispatch(StandbyEvent()); -// } - -// void PowerManger::triggerFaultEvent(unsigned int faultCode) -// { -// PowerManagerFsm::dispatch(FaultEvent(faultCode)); -// } - void PowerManger::printState(const std::string& stateName, const std::string& desp){ cout << MOOS::ConsoleColours::Yellow() << "STATE " << stateName << " " << MOOS::ConsoleColours::reset(); cout << MOOS::ConsoleColours::Blue() << " -> " << MOOS::ConsoleColours::reset(); @@ -361,7 +295,6 @@ void PowerManger::printState(const std::string& stateName, const std::string& de } - //==============================系统操作函数==================== bool PowerManger::shutdown() { @@ -425,50 +358,4 @@ void PowerManger::initControlCmd() m_msCmd.workCMD = 99; //================初始化设备驱动指令======================== -} - - -bool PowerManger::getMsCmdFromJson(MSControlCmd &cmd, const std::string &strJson) -{ - Json::CharReaderBuilder builder; - Json::Value root; - std::string errs; - - // 解析JSON字符串 - std::istringstream s(strJson); - if (!Json::parseFromStream(builder, s, &root, &errs)) - { - std::cerr << "JSON解析失败: " << errs << std::endl; - return false; // 解析失败 - } - if (root.isMember("powerCMD") && root["powerCMD"].isUInt()) - { - cmd.powerCMD = root["powerCMD"].asUInt(); - } - else - { - std::cerr << "缺少或类型不匹配: powerCMD" << std::endl; - return false; // 缺少或类型不匹配 - } - - if (root.isMember("modCMD") && root["modCMD"].isUInt()) - { - cmd.modCMD = root["modCMD"].asUInt(); - } - else - { - std::cerr << "缺少或类型不匹配: modCMD" << std::endl; - return false; // 缺少或类型不匹配 - } - - if (root.isMember("workCMD") && root["workCMD"].isUInt()) - { - cmd.workCMD = root["workCMD"].asUInt(); - } - else - { - std::cerr << "缺少或类型不匹配: workCMD" << std::endl; - return false; // 缺少或类型不匹配 - } - return true; // 成功 -} \ No newline at end of file +} \ No newline at end of file diff --git a/src/pPowerManger/PowerManger.h b/src/pPowerManger/PowerManger.h index 02bd5c0..f5c754c 100644 --- a/src/pPowerManger/PowerManger.h +++ b/src/pPowerManger/PowerManger.h @@ -20,9 +20,6 @@ #define UNIX #define JSON_USE_EXCEPTION 1 -// 前向声明 -class PowerManagerFsm; - #include #include "MOOS/libMOOS/Thirdparty/AppCasting/AppCastingMOOSApp.h" #include "MOOS/libMOOS/Utils/MOOSThread.h" @@ -46,22 +43,6 @@ class PowerManagerFsm; #define MAX_UDP_PKT_SIZE 65535 #define SKEW_TOLERANCE 5 -//能源管理反馈的消息 -#define PM_TO_DB_STATE "uPower_pmState_st" -#define PM_TO_DB_CURRENTSTATE "uPower_currentState_st" -#define PM_TO_DB_DISSTATE "uPower_disSysState_st" -#define PM_TO_DB_LIBATSTATE "uPower_liBatState_st" -#define PM_TO_DB_FCSSTATE "uPower_fcsState_st" - -#define PM_TO_DB_SUBDISCMD "uPower_secdistState_cmd" -#define PM_TO_DB_EQUIPMENTSTATE "uPower_equState_fb" - -//控制消息 -//TODO:实现上位机交互控制功能 -#define DB_TO_PM_MSCMD "uPower_sysState_cmd" -#define DB_TO_PM_EQUIPMENTCMD "uPower_equState_cmd" -#define DB_TO_PM_SUBDISSTATE "uDevice_secdistState_st" - class PowerManger : public AppCastingMOOSApp { public: @@ -80,20 +61,10 @@ class PowerManger : public AppCastingMOOSApp public: void updateTime(){m_current_time = MOOSTime();} - bool IsSkewed(double dfTimeNow, double * pdfSkew = NULL); - string getTypeName(const string typeName); - bool inline saveStringToJsonFile(const string &strJson, const string &strFileName); //数据库 SQLiteDB* m_db; bool writeDataToDB(); - //通信状态变量及操作函数 - XPCUdpSocket* setUdpScoket(long lPort); - // bool updatePmState(); - // bool updateConnectState(); - - int connectState; - /************************************************************/ /* |<------------FEEDBACK--------<-- */ /* | | */ @@ -113,6 +84,9 @@ class PowerManger : public AppCastingMOOSApp disSysBreakerList m_currentDisBreakerState; //配电断路器状态 DriverTable m_currentDriverState; DriverTable m_subDisSysState; + + int m_depth; + int m_missionCode; //===========================STATE========================================= unsigned char workCondition; unsigned char currentMod; @@ -121,24 +95,19 @@ class PowerManger : public AppCastingMOOSApp vector faultCode; unsigned int soc; unsigned int sustainableTime; + unsigned int m_faultNum; + Driver m_driver; //设备表处理 + std::string m_pmEvent; // 状态机事件描述 //===========================CONFIG======================================== long m_lPort; unsigned int m_nReceiveBufferSizeKB; unsigned int m_nSendBufferSizeKB; - double m_current_time; - unsigned int m_faultNum; + double m_current_time; unsigned int m_ticker; - //===========================交互状态变量================================== - Driver m_driver; //设备驱动 - std::string m_pmEvent; // 状态机事件描述 - //=============================运行变量====================================== - // char getBreakerOption(char cmd); - void initControlCmd(); - - //上位机操作函数 - - // bool buildPowerSysReport(); - bool getMsCmdFromJson(MSControlCmd &cmd,const string &strJson); + int connectState; + + //=============================过程函数====================================== + void initControlCmd(); private: // CMOOSThread m_FsmThread; diff --git a/src/pPowerManger/UpperCommManager.cpp b/src/pPowerManger/UpperCommManager.cpp index c9a25f4..7497913 100644 --- a/src/pPowerManger/UpperCommManager.cpp +++ b/src/pPowerManger/UpperCommManager.cpp @@ -6,39 +6,116 @@ UpperCommManager::UpperCommManager(PowerManger* pm) : m_pm(pm) {} bool UpperCommManager::processUpperMsg(const string& key, const string& strJson) { if(key == DB_TO_PM_MSCMD) { - if(m_pm->getMsCmdFromJson(m_pm->m_msCmd, strJson)) { - cout << "get ms cmd:" << strJson << endl; - return true; - } else { - cout << MOOS::ConsoleColours::Red << "get ms cmd error:" << strJson - << MOOS::ConsoleColours::reset << endl; - } + m_pm->m_msCmd = getMasterControlCmd(key, strJson); + return true; } else if(key == DB_TO_PM_EQUIPMENTCMD) { - if(m_pm->m_driver.loadDriverTableFromJson(strJson, m_pm->m_subDisSysCmd) < 0) { - cout << MOOS::ConsoleColours::Red << "get sub dis cmd error:" << strJson - << MOOS::ConsoleColours::reset << endl; - } + m_pm->m_MSDriverCmd = getEquipmentCmd(key, strJson); return true; } else if(key == DB_TO_PM_SUBDISSTATE) { - if(m_pm->m_driver.loadDriverTableFromJson(strJson, m_pm->m_subDisSysState) < 0) { - cout << MOOS::ConsoleColours::Red << "get sub dis state error:" << strJson - << MOOS::ConsoleColours::reset << endl; - } + m_pm->m_subDisSysState = getSubDisState(key, strJson); return true; } + std::cout << "Unknown key: " << key << std::endl; return false; } +const MSControlCmd UpperCommManager::getMasterControlCmd(const std::string& key, const std::string& msg) +{ + MSControlCmd cmd; + if (parseControlCmdFromJson(cmd, msg)) { + return cmd; + } + else + { + cout << MOOS::ConsoleColours::Red << "parse control cmd error:" << msg + << MOOS::ConsoleColours::reset << endl; + } +} + +const DriverTable UpperCommManager::getEquipmentCmd(const std::string& key, const std::string& msg) +{ + DriverTable cmd; + if (m_pm->m_driver.loadDriverTableFromJson(msg, cmd) < 0) { + cout << MOOS::ConsoleColours::Red << "get equipment cmd error:" << msg + << MOOS::ConsoleColours::reset << endl; + } + return cmd; +} + +const DriverTable UpperCommManager::getSubDisState(const std::string& key, const std::string& msg) +{ + DriverTable state; + if (m_pm->m_driver.loadDriverTableFromJson(msg, state) < 0) { + cout << MOOS::ConsoleColours::Red << "get sub dis state error:" << msg + << MOOS::ConsoleColours::reset << endl; + } +} + +const std::string UpperCommManager::getCurrentEquState(DriverTable& driver) +{ + return m_pm->m_driver.saveDriverTableToJson(&driver); +} + +const std::string UpperCommManager::getSubDisCmd(DriverTable& driver) +{ + return m_pm->m_driver.saveDriverTableToJson(&driver); +} + void UpperCommManager::processPeriodicTasks() { buildSystemReport(); - // m_pm->Notify(PM_TO_DB_SUBDISCMD, m_pm->m_driver.saveDriverTableToJson(&m_pm->m_subDisSysCmd)); - // m_pm->Notify(PM_TO_DB_EQUIPMENTSTATE, m_pm->m_driver.saveDriverTableToJson(&m_pm->m_currentDriverState)); + std::string strJson; + strJson = getCurrentEquState(m_pm->m_currentDriverState); + m_pm->sendNotification(PM_TO_DB_EQUIPMENTSTATE, strJson); + strJson = getSubDisCmd(m_pm->m_subDisSysCmd); + m_pm->sendNotification(PM_TO_DB_SUBDISCMD, strJson); } +bool UpperCommManager::parseControlCmdFromJson(MSControlCmd &cmd, const std::string &strJson) +{ + Json::CharReaderBuilder builder; + Json::Value root; + std::string errs; + // 解析JSON字符串 + std::istringstream s(strJson); + if (!Json::parseFromStream(builder, s, &root, &errs)) + { + std::cerr << "JSON解析失败: " << errs << std::endl; + return false; // 解析失败 + } + if (root.isMember("powerCMD") && root["powerCMD"].isUInt()) + { + cmd.powerCMD = root["powerCMD"].asUInt(); + } + else + { + std::cerr << "缺少或类型不匹配: powerCMD" << std::endl; + return false; // 缺少或类型不匹配 + } + + if (root.isMember("modCMD") && root["modCMD"].isUInt()) + { + cmd.modCMD = root["modCMD"].asUInt(); + } + else + { + std::cerr << "缺少或类型不匹配: modCMD" << std::endl; + return false; // 缺少或类型不匹配 + } + + if (root.isMember("workCMD") && root["workCMD"].isUInt()) + { + cmd.workCMD = root["workCMD"].asUInt(); + } + else + { + std::cerr << "缺少或类型不匹配: workCMD" << std::endl; + return false; // 缺少或类型不匹配 + } + return true; // 成功 +} void UpperCommManager::buildSystemReport() { - //TODO: 构建能源系统报告 string suffix; Json::Value pms; Json::Value fcs; diff --git a/src/pPowerManger/UpperCommManager.h b/src/pPowerManger/UpperCommManager.h index 2ffa099..3ab3bcb 100644 --- a/src/pPowerManger/UpperCommManager.h +++ b/src/pPowerManger/UpperCommManager.h @@ -10,6 +10,24 @@ #include using namespace std; #define VAR_TO_STR(var) #var +//能源管理反馈的消息 +#define PM_TO_DB_STATE "uPower_pmState_st" +#define PM_TO_DB_CURRENTSTATE "uPower_currentState_st" +#define PM_TO_DB_DISSTATE "uPower_disSysState_st" +#define PM_TO_DB_LIBATSTATE "uPower_liBatState_st" +#define PM_TO_DB_FCSSTATE "uPower_fcsState_st" + +#define PM_TO_DB_SUBDISCMD "uPower_secdistState_cmd" +#define PM_TO_DB_EQUIPMENTSTATE "uPower_equState_fb" + +//控制消息 +#define DB_TO_PM_MSCMD "uPower_sysState_cmd" +#define DB_TO_PM_EQUIPMENTCMD "uPower_equState_cmd" +#define DB_TO_PM_SUBDISSTATE "uDevice_secdistState_st" + +//决策消息 +#define DB_TO_PM_DEEPTH "uPower_depth_fb" +#define DB_TO_PM_MISSION "uPlan_taskStart_cmd" class PowerManger; // 前向声明 @@ -27,17 +45,18 @@ public: // 生成系统报告 void buildSystemReport(); - // 获取控制命令 - const MSControlCmd& getControlCmd() const { return m_msCmd; } - - // 更新设备命令状态 - void updateEquipmentCmd(const DriverTable& cmd); + // 消息处理函数 + const MSControlCmd getMasterControlCmd(const std::string& key, const std::string& msg); + const DriverTable getEquipmentCmd(const std::string& key, const std::string& msg); + const DriverTable getSubDisState(const std::string& key, const std::string& msg); + + const std::string getCurrentEquState(DriverTable& driver); + const std::string getSubDisCmd(DriverTable& driver); // 其他公共函数 string getTypeName(const string typeName); bool saveStringToJsonFile(const string &strJson, const string &filePath); - private: PowerManger* m_pm; MSControlCmd m_msCmd; From b653f17b03eacc9c7a896e8fb70914e70ffd649b Mon Sep 17 00:00:00 2001 From: zhaojingkui <1553836110@qq.com> Date: Wed, 9 Apr 2025 23:28:05 +0800 Subject: [PATCH 9/9] =?UTF-8?q?=E5=AE=8C=E5=96=84=E5=BE=85=E6=9C=BA?= =?UTF-8?q?=E5=B7=A5=E5=86=B5=E5=8F=8A=E7=9B=B8=E5=85=B3=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- data/msg/uDevice_depth_st.json | 3 + data/msg/uPower_currentState_st.json | 2 +- data/msg/uPower_disSysState_st.json | 6 +- data/msg/uPower_fcsState_st.json | 32 +++---- data/msg/uPower_liBatState_st.json | 22 ++--- src/pPowerManger/LowerCommManager.cpp | 2 +- src/pPowerManger/PowerManagerFsm.cpp | 63 ++----------- src/pPowerManger/PowerManagerFsm.hpp | 61 +++++++++---- src/pPowerManger/PowerManger.cpp | 20 +---- src/pPowerManger/PowerManger.h | 10 +-- src/pPowerManger/UpperCommManager.cpp | 36 ++++++++ src/pPowerManger/UpperCommManager.h | 7 +- src/pPowerManger/driver.cpp | 124 +++++++++++++------------- src/pPowerManger/pmSysvariable.h | 49 ++++++++++ 14 files changed, 241 insertions(+), 196 deletions(-) create mode 100644 data/msg/uDevice_depth_st.json diff --git a/data/msg/uDevice_depth_st.json b/data/msg/uDevice_depth_st.json new file mode 100644 index 0000000..0c734a3 --- /dev/null +++ b/data/msg/uDevice_depth_st.json @@ -0,0 +1,3 @@ +{ + "value_array_uint16" :[2,1,3] +} \ No newline at end of file diff --git a/data/msg/uPower_currentState_st.json b/data/msg/uPower_currentState_st.json index 41648bf..a8a0701 100644 --- a/data/msg/uPower_currentState_st.json +++ b/data/msg/uPower_currentState_st.json @@ -6,7 +6,7 @@ "HVABbusBVol_uint16": 0, "HVABmastSteGeaCur_uint16": 0, "HVABopenWaterCur_uint16": 0, - "HVABxczCur_uint16": 0, + "HVABxczCur_uint16": 1, "HVBBCCUCur_uint16": 0, "HVBBFCSSecurSysCur_uint16": 0, "HVBBbatInsCur_uint16": 0, diff --git a/data/msg/uPower_disSysState_st.json b/data/msg/uPower_disSysState_st.json index ed8e1bf..90bc4ac 100644 --- a/data/msg/uPower_disSysState_st.json +++ b/data/msg/uPower_disSysState_st.json @@ -1,8 +1,8 @@ { "HVolABusBreaker_unit16": 0, - "HVolBBusBreaker_unit16": 0, - "HVolBusBreaker_uint16": 0, - "LVolBusBreaker_uint16": 0, + "HVolBBusBreaker_unit16": 79, + "HVolBusBreaker_uint16": 58, + "LVolBusBreaker_uint16": 159, "faultCode_array": [ 0 diff --git a/data/msg/uPower_fcsState_st.json b/data/msg/uPower_fcsState_st.json index 31141fb..dde57b0 100644 --- a/data/msg/uPower_fcsState_st.json +++ b/data/msg/uPower_fcsState_st.json @@ -1,30 +1,30 @@ { - "backpressure1_fp32": 0.0, - "backpressure2_fp32": 0.0, - "ch4oConcent1_fp32": 0.0, - "ch4oConcent2_fp32": 0.0, + "backpressure1_fp32": 1.0, + "backpressure2_fp32": 2.0, + "ch4oConcent1_fp32": 29.0, + "ch4oConcent2_fp32": 96.0, "ch4o_fp32": 0.0, - "excTemp_fp32": 0.0, + "excTemp_fp32": 23.0, "faultCode1_uint16": 0, "faultCode2_uint16": 0, "faultCode3_uint16": 0, "fcuCurIns_fp32": 0.0, "fcuCurPower_fp32": 0.0, - "fcuCur_fp32": 0.0, + "fcuCur_fp32": 84.0, "fcuFaultLeve_uint8": 0, - "fcuOutIns_fp32": 0.0, - "fcuOutPower_fp32": 0.0, + "fcuOutIns_fp32": 53.0, + "fcuOutPower_fp32": 100.0, "fcuState_uint8": 0, "fcuVolIns_fp32": 0.0, "fcuVolPower_fp32": 0.0, - "fcuVol_fp32": 0.0, - "flameDet_uint8": 0, - "h2Concent1_fp32": 0.0, - "h2Concent2_fp32": 0.0, - "o2Concent1_fp32": 0.0, - "o2Concent2_fp32": 0.0, + "fcuVol_fp32": 377.0, + "flameDet_uint8": 1, + "h2Concent1_fp32": 89.0, + "h2Concent2_fp32": 62.0, + "o2Concent1_fp32": 74.0, + "o2Concent2_fp32": 21.0, "o2Level_fp32": 0.0, "o2_fp32": 0.0, - "powLimit_fp32": 0.0, - "powerGen_fp32": 0.0 + "powLimit_fp32": 88.0, + "powerGen_fp32": 622.0 } \ No newline at end of file diff --git a/data/msg/uPower_liBatState_st.json b/data/msg/uPower_liBatState_st.json index b3e9fd4..18a243c 100644 --- a/data/msg/uPower_liBatState_st.json +++ b/data/msg/uPower_liBatState_st.json @@ -2,37 +2,37 @@ "fcuCurToInsLimit1_uint8": 0, "fcuCurToinsLimit2_uint8": 0, "insBatCurElect_uint16": 0, - "insBatLimit_uint16": 0, - "insBatSoc_uint8": 0, - "insBatTotalElect_uint16": 0, + "insBatLimit_uint16": 41, + "insBatSoc_uint8": 42, + "insBatTotalElect_uint16": 617, "insChargeState_uint8": 0, "insCurSocHold1_uint8": 0, "insCurSocHold2_uint8": 0, "insCurSocHold3_uint8": 0, - "insCurrent_uint16": 0, + "insCurrent_uint16": 2, "insLinkVol_uint16": 0, "insNegRelayState_uint8": 0, "insNegRes_uint16": 0, "insPackVol_uint16": 0, - "insPosRelayState_uint8": 0, + "insPosRelayState_uint8": 1, "insPosRes_uint16": 0, "insfaultCode_uint8": 0, "powBatCurElect_uint16": 0, - "powBatSoc_uint8": 0, - "powBatTotalElect_uint16": 0, + "powBatSoc_uint8": 31, + "powBatTotalElect_uint16": 763, "powChargeState_uint8": 0, "powCurSocHold1_uint8": 0, "powCurSocHold2_uint8": 0, "powCurSocHold3_uint8": 0, "powCurToInsLimit1_uint8": 0, "powCurToinsLimit2_uint8": 0, - "powCur_uint16": 0, + "powCur_uint16": 21, "powLinkVol_uint16": 0, - "powNegRelayState_uint8": 0, + "powNegRelayState_uint8": 1, "powNegRes_uint16": 0, - "powPosRelayState_uint8": 0, + "powPosRelayState_uint8": 1, "powPosRes_uint16": 0, - "powerBatLimit_uint16": 0, + "powerBatLimit_uint16": 13, "powerPackVol_uint16": 0, "powfaultCode_uint8": 0 } \ No newline at end of file diff --git a/src/pPowerManger/LowerCommManager.cpp b/src/pPowerManger/LowerCommManager.cpp index 2b1f7bd..9978978 100644 --- a/src/pPowerManger/LowerCommManager.cpp +++ b/src/pPowerManger/LowerCommManager.cpp @@ -238,7 +238,7 @@ bool LowerCommManager::listenThreadFunc() try { int nRead = m_udpComm->udpScoket->iRecieveMessage(Buff, sizeof(Buff)); - cout< 0) { try { diff --git a/src/pPowerManger/PowerManagerFsm.cpp b/src/pPowerManger/PowerManagerFsm.cpp index 8849ab9..334d5a5 100644 --- a/src/pPowerManger/PowerManagerFsm.cpp +++ b/src/pPowerManger/PowerManagerFsm.cpp @@ -9,71 +9,25 @@ PowerManger* PowerManagerFsm::pm = nullptr; // InitState实现 void InitState::entry() { PowerManagerFsm::entry(); - std::cout << "===========================" << std::endl; - // PowerManagerFsm::pm->m_pmEvent = "初始化状态"; - PowerManagerFsm::pm->printState("InitState", "进入初始化状态"); -} - -void InitState::react(InitEvent const &) { - // double StartTime = PowerManagerFsm::pm->GetAppStartTime(); - std::cout << "开始初始化" << std::endl; - double StartTime = 0; - while (PowerManagerFsm::pm->connectState < 5) { - MOOSPause(1000); - PowerManagerFsm::pm->updateTime(); - double dft = abs(PowerManagerFsm::pm->m_current_time - StartTime); - if(dft > 10) { - transit(); - PowerManagerFsm::pm->m_faultNum = 1; - return; - } - string desp = "等待复合管控消息 : " + to_string(10-dft); - PowerManagerFsm::pm->printState("InitState", desp); - } - - if(PowerManagerFsm::pm->checkError() < 0) { - transit(); - PowerManagerFsm::pm->m_faultNum = 2; - return; - } - - PowerManagerFsm::pm->initControlCmd(); - - while (true) { - if(PowerManagerFsm::pm->m_currentDisBreakerState.bus3Breaker.unit4InstrumentDC48VCircuitBreaker == 1 || - PowerManagerFsm::pm->m_currentDisBreakerState.bus4Breaker.unit5CircuitBreaker == 1 || - PowerManagerFsm::pm->m_currentDisBreakerState.bus4Breaker.unit2CircuitBreaker == 1 || - PowerManagerFsm::pm->m_currentDisBreakerState.bus4Breaker.unit3CircuitBreaker == 1 || - PowerManagerFsm::pm->m_currentDisBreakerState.bus4Breaker.unit1CircuitBreaker == 1) { - transit(); - return; - } - PowerManagerFsm::pm->m_pmEvent = "等待关键断路器闭合"; - MOOSPause(1000); - PowerManagerFsm::pm->printState("InitState", PowerManagerFsm::pm->m_pmEvent); - } - std::cout << "InitState: 初始化完成" << std::endl; - //转换到待机状态 + std::cout << "初始化配电指令" << std::endl; + pm->initControlCmd(); + // PowerManagerFsm::pm->printState("InitState", "进入初始化状态"); transit(); } // StandbyState实现 void StandbyState::entry() { PowerManagerFsm::entry(); - PowerManagerFsm::pm->printState("StandbyState", "进入待机状态"); + pm->m_driver.getSTANDBYTable(&pm->m_subDisSysCmd); + pm->m_CcuColCmd.fcuCmd = FcuCommand::Stop; + pm->m_CcuColCmd.powerBatCmd = BatteryCommand::Stop; } void StandbyState::react(StandbyEvent const &) { - while (true) { - if(PowerManagerFsm::pm->checkError() < 0) { - transit(); - return; - } - handlePowerCommands(); - MOOSPause(1000); - } + transit(); } + void StandbyState::handlePowerCommands() { switch (PowerManagerFsm::pm->m_msCmd.powerCMD) { case 0: PowerManagerFsm::pm->m_pmEvent = "收到上位机控制指令:关机"; break; @@ -90,6 +44,7 @@ void StandbyState::handlePowerOn() { // FaultState实现 void FaultState::entry() { + PowerManagerFsm::entry(); PowerManagerFsm::pm->printState("FaultState", "进入故障状态"); } diff --git a/src/pPowerManger/PowerManagerFsm.hpp b/src/pPowerManger/PowerManagerFsm.hpp index 0be6748..3cdfcee 100644 --- a/src/pPowerManger/PowerManagerFsm.hpp +++ b/src/pPowerManger/PowerManagerFsm.hpp @@ -2,7 +2,12 @@ #define POWER_MANAGER_FSM_HPP #include "tinyfsm.hpp" #include - +#include // 新增头文件 +#include // 新增头文件 +#include // 新增头文件,用于localtime函数 +#include // 新增头文件,用于demangle功能 +#include "pmSysvariable.h" +#include "driver.h" // 前向声明 class PowerManger; @@ -12,7 +17,6 @@ enum class PowerSystemState { FAULT, }; -// 定义事件类型 //==================状态切换事件============================= struct InitEvent : tinyfsm::Event { }; struct StandbyEvent : tinyfsm::Event { }; @@ -21,18 +25,16 @@ struct FaultEvent : tinyfsm::Event { FaultEvent(unsigned int code) : faultCode(code) {} }; //==================状态流程事件============================ -struct MasterCommandEvent : tinyfsm::Event { }; +struct MasterCommandEvent : tinyfsm::Event {}; struct TaskStart : tinyfsm::Event { }; -// struct +struct DeviceCmd : tinyfsm::Event { }; - -// 定义状态机基类 class PowerManagerFsm : public tinyfsm::Fsm { protected: static PowerManger* pm; + static DriverTable m_currentDriver; public: - // 初始化状态机 static void init(PowerManger* powerManager) { pm = powerManager; } @@ -43,30 +45,52 @@ public: virtual void react(FaultEvent const &) {}; virtual void react(MasterCommandEvent const &) {}; virtual void react(TaskStart const &) {}; + virtual void react(DeviceCmd const &) {}; // 状态机生命周期方法 - virtual void entry() {std::cout << "[ Enter state ] : " << typeid(*this).name() << std::endl;} // 进入状态 - virtual void exit() {std::cout << "[ Exit state ] : " << typeid(*this).name() << std::endl;} // 退出状态 - - - // 状态转换接口 - void triggerInitEvent() { dispatch(InitEvent()); } - void triggerStandbyEvent() { dispatch(StandbyEvent()); } - void triggerFaultEvent(unsigned int faultCode) { dispatch(FaultEvent(faultCode)); } + virtual void entry() { + auto now = std::chrono::system_clock::now(); + auto now_time = std::chrono::system_clock::to_time_t(now); + + int status = 0; + char* demangled = abi::__cxa_demangle(typeid(*this).name(), nullptr, nullptr, &status); + std::string typeName = (status == 0) ? demangled : typeid(*this).name(); + if (demangled) free(demangled); + + std::cout << "\033[1;38;5;51m╭──────────────────────────────────────────────────────\n" + << "│ \033[1;38;5;226m⮞⮞⮞ \033[0;38;5;51m[" << std::put_time(std::localtime(&now_time), "%Y-%m-%d %H:%M:%S") + << "] \033[1;38;5;255m进入状态: \033[1;38;5;213m" << typeName << "\n" + << "│ \033[0m" << std::endl; + } + + virtual void exit() { + auto now = std::chrono::system_clock::now(); + auto now_time = std::chrono::system_clock::to_time_t(now); + + int status = 0; + char* demangled = abi::__cxa_demangle(typeid(*this).name(), nullptr, nullptr, &status); + std::string typeName = (status == 0) ? demangled : typeid(*this).name(); + if (demangled) free(demangled); + + std::cout << "\033[1;38;5;203m│ \n" + << "│ \033[1;38;5;208m⮜⮜⮜ \033[0;38;5;203m[" << std::put_time(std::localtime(&now_time), "%Y-%m-%d %H:%M:%S") + << "] \033[1;38;5;255m离开状态: \033[1;38;5;213m" << typeName << "\n" + << "╰──────────────────────────────────────────────────────\033[0m" << std::endl; + } }; class InitState : public PowerManagerFsm { public: void entry() override; - void react(InitEvent const &); }; class StandbyState : public PowerManagerFsm { public: void entry() override; - void react(StandbyEvent const &); - PowerSystemState getCurrentState(); + void react(StandbyEvent const &) override; + // void react(MasterCommandEvent const &) override; + // void react(DeviceCmd const &) override; private: void handlePowerCommands(); void handlePowerOn(); @@ -78,6 +102,5 @@ public: void react(FaultEvent const &); }; -// FSM_INITIAL_STATE(PowerManagerFsm, InitState) #endif // POWER_MANAGER_FSM_HPP \ No newline at end of file diff --git a/src/pPowerManger/PowerManger.cpp b/src/pPowerManger/PowerManger.cpp index a78b461..9741dfa 100644 --- a/src/pPowerManger/PowerManger.cpp +++ b/src/pPowerManger/PowerManger.cpp @@ -126,29 +126,11 @@ bool PowerManger::Iterate() // cout << " Current State : " << (int)PowerManagerFsm::current_state_ptr->getCurrentState(); if (m_ticker++ % 5 == 0) { + m_CcuColCmd.heartbeat++; m_lowerCommManager->processPeriodicTasks(); m_upperCommManager->processPeriodicTasks(); - // buildPowerSysReport(); - //Notify(PM_TO_DB_SUBDISCMD,m_driver.saveDriverTableToJson(&m_subDisSysCmd)); - //Notify(PM_TO_DB_EQUIPMENTSTATE,m_driver.saveDriverTableToJson(&m_currentDriverState)); - //d.保存到数据库 writeDataToDB(); } - - /////////////////////// - // string a = m_driver.getSubDisCmdJson(&m_subDisSysCmd); - // saveStringToJsonFile(a,"/home/zjk/project/H100/H100PowerManger/data/subDisSysCmd.json"); - /////////////////////// - //4. 写状态信息到数据库 - // m_stateData.state_id = m_pmState.id; - // m_stateData.state_name = m_pmState.name; - // m_stateData.event = m_pmEvent; - // m_stateData.fault_code = m_faultNum; - // if(!m_db->insertStateData(m_stateData)) - // return false; - //AppCastingMOOSApp::PostReport(); - //5. 清空UDP消息队列 - // m_udpComm.clearMsgQueue(); return(true); } diff --git a/src/pPowerManger/PowerManger.h b/src/pPowerManger/PowerManger.h index f5c754c..2145dc5 100644 --- a/src/pPowerManger/PowerManger.h +++ b/src/pPowerManger/PowerManger.h @@ -114,18 +114,14 @@ class PowerManger : public AppCastingMOOSApp LowerCommManager* m_lowerCommManager; UpperCommManager* m_upperCommManager; - // 状态机实例 - PowerManagerFsm m_fsm; + // // 状态机实例 + // PowerManagerFsm m_fsm; public: //===========================状态机接口======================================= void printState(const std::string& stateName, const std::string& desp); bool FSM_RUN_IS_OK = true; - - // 状态机事件触发接口 - // void triggerInitEvent() { m_fsm.triggerInitEvent(); } - // void triggerStandbyEvent() { m_fsm.triggerStandbyEvent(); } - // void triggerFaultEvent(unsigned int faultCode) { m_fsm.triggerFaultEvent(faultCode); } + //================================================================================== int checkError(); bool shutdown(); diff --git a/src/pPowerManger/UpperCommManager.cpp b/src/pPowerManger/UpperCommManager.cpp index 7497913..0190895 100644 --- a/src/pPowerManger/UpperCommManager.cpp +++ b/src/pPowerManger/UpperCommManager.cpp @@ -17,6 +17,10 @@ bool UpperCommManager::processUpperMsg(const string& key, const string& strJson) m_pm->m_subDisSysState = getSubDisState(key, strJson); return true; } + else if(key == DB_TO_PM_DEEPTH) { + m_pm->m_depth = getDeepth(key, strJson); + return true; + } std::cout << "Unknown key: " << key << std::endl; return false; } @@ -25,6 +29,7 @@ const MSControlCmd UpperCommManager::getMasterControlCmd(const std::string& key, { MSControlCmd cmd; if (parseControlCmdFromJson(cmd, msg)) { + return cmd; } else @@ -53,6 +58,37 @@ const DriverTable UpperCommManager::getSubDisState(const std::string& key, const } } +const int UpperCommManager::getDeepth(const std::string& key, const std::string& msg){ + int deepth; + Json::Value root; + Json::CharReaderBuilder builder; + JSONCPP_STRING errs; + + // 解析JSON字符串 + std::istringstream stream(msg); + if (!Json::parseFromStream(builder, stream, &root, &errs)) { + std::cerr << "JSON解析失败: " << errs << std::endl; + return -1; + } + + // 检查并读取深度数组 + if (root.isMember("value_array_uint16") && root["value_array_uint16"].isArray()) { + const Json::Value& array = root["value_array_uint16"]; + if (array.size() >= 3) { + // 计算三个深度值的平均值 + deepth = (array[0].asInt() + array[1].asInt() + array[2].asInt()) / 3; + } else { + std::cerr << "深度数组元素不足3个" << std::endl; + return -1; + } + } else { + std::cerr << "JSON格式错误" << std::endl; + return -1; + } + + return deepth; +} + const std::string UpperCommManager::getCurrentEquState(DriverTable& driver) { return m_pm->m_driver.saveDriverTableToJson(&driver); diff --git a/src/pPowerManger/UpperCommManager.h b/src/pPowerManger/UpperCommManager.h index 3ab3bcb..f3bf90b 100644 --- a/src/pPowerManger/UpperCommManager.h +++ b/src/pPowerManger/UpperCommManager.h @@ -26,7 +26,7 @@ using namespace std; #define DB_TO_PM_SUBDISSTATE "uDevice_secdistState_st" //决策消息 -#define DB_TO_PM_DEEPTH "uPower_depth_fb" +#define DB_TO_PM_DEEPTH "uDevice_depth_st" #define DB_TO_PM_MISSION "uPlan_taskStart_cmd" class PowerManger; // 前向声明 @@ -36,7 +36,7 @@ public: UpperCommManager(PowerManger* powerManager); ~UpperCommManager(); - //周期调用 + // 周期调用 void processPeriodicTasks(); // 处理上位机消息 @@ -49,10 +49,11 @@ public: const MSControlCmd getMasterControlCmd(const std::string& key, const std::string& msg); const DriverTable getEquipmentCmd(const std::string& key, const std::string& msg); const DriverTable getSubDisState(const std::string& key, const std::string& msg); + const int getDeepth(const std::string& key, const std::string& msg); + const std::string getCurrentEquState(DriverTable& driver); const std::string getSubDisCmd(DriverTable& driver); - // 其他公共函数 string getTypeName(const string typeName); bool saveStringToJsonFile(const string &strJson, const string &filePath); diff --git a/src/pPowerManger/driver.cpp b/src/pPowerManger/driver.cpp index b5af163..7e2cc68 100644 --- a/src/pPowerManger/driver.cpp +++ b/src/pPowerManger/driver.cpp @@ -59,72 +59,72 @@ int Driver::getDriverTable(workCondition condition, DriverTable* driverTable) void Driver::getSTANDBYTable(DriverTable* driverTable) { //打开所有传感器 - driverTable->depth1 = DRIVER_FULL_POWER_ON; - driverTable->depth2 = DRIVER_FULL_POWER_ON; - driverTable->depth3 = DRIVER_FULL_POWER_ON; - driverTable->overDeep1 = DRIVER_FULL_POWER_ON; - driverTable->overDeep2 = DRIVER_FULL_POWER_ON; - driverTable->ctd1 = DRIVER_FULL_POWER_ON; - driverTable->ctd2 = DRIVER_FULL_POWER_ON; - driverTable->soundVeloc = DRIVER_FULL_POWER_ON; - driverTable->commMast = DRIVER_FULL_POWER_ON; - driverTable->ins = DRIVER_FULL_POWER_ON; - driverTable->ntp = DRIVER_FULL_POWER_ON; - driverTable->inputWaterSensor1 = DRIVER_FULL_POWER_ON; - driverTable->inputWaterSensor2 = DRIVER_FULL_POWER_ON; - driverTable->inputWaterSensor3 = DRIVER_FULL_POWER_ON; + driverTable->depth1 = 1; + driverTable->depth2 = 1; + driverTable->depth3 = 1; + driverTable->overDeep1 = 1; + driverTable->overDeep2 = 1; + driverTable->ctd1 = 1; + driverTable->ctd2 = 1; + driverTable->soundVeloc = 1; + driverTable->commMast = 1; + driverTable->ins = 1; + driverTable->ntp = 1; + driverTable->inputWaterSensor1 = 1; + driverTable->inputWaterSensor2 = 1; + driverTable->inputWaterSensor3 = 1; //关闭所有负载 - driverTable->photoSensor = DRIVER_STANDBY; - driverTable->electSensor = DRIVER_STANDBY; - driverTable->launchControler = DRIVER_STANDBY; - driverTable->sideSonar = DRIVER_POWER_OFF; - driverTable->buoyage = DRIVER_POWER_OFF; + driverTable->photoSensor = 0; + driverTable->electSensor = 0; + driverTable->launchControler = 0; + driverTable->sideSonar = 0; + driverTable->buoyage = 0; //关闭所有水声设备 - driverTable->singleBeamSonar1 = DRIVER_POWER_OFF; - driverTable->singleBeamSonar2 = DRIVER_POWER_OFF; - driverTable->singleBeamSonar3 = DRIVER_POWER_OFF; - driverTable->singleBeamSonar4 = DRIVER_POWER_OFF; - driverTable->singleBeamSonar5 = DRIVER_POWER_OFF; - driverTable->singleBeamSonar6 = DRIVER_POWER_OFF; - driverTable->singleBeamSonar7 = DRIVER_POWER_OFF; - driverTable->singleBeamSonar8 = DRIVER_POWER_OFF; - driverTable->DVL = DRIVER_POWER_OFF; - driverTable->forwardSonar = DRIVER_POWER_OFF; - driverTable->lowFreqSonar = DRIVER_POWER_OFF; - driverTable->USBL = DRIVER_POWER_OFF; + driverTable->singleBeamSonar1 = 0; + driverTable->singleBeamSonar2 = 0; + driverTable->singleBeamSonar3 = 0; + driverTable->singleBeamSonar4 = 0; + driverTable->singleBeamSonar5 = 0; + driverTable->singleBeamSonar6 = 0; + driverTable->singleBeamSonar7 = 0; + driverTable->singleBeamSonar8 = 0; + driverTable->DVL = 0; + driverTable->forwardSonar = 0; + driverTable->lowFreqSonar = 0; + driverTable->USBL = 0; //关闭所有执行机构 - driverTable->bowCover1 = DRIVER_POWER_OFF; - driverTable->bowCover2 = DRIVER_POWER_OFF; - driverTable->bowCover3 = DRIVER_POWER_OFF; - driverTable->bowCover4 = DRIVER_POWER_OFF; - driverTable->bowCover5 = DRIVER_POWER_OFF; - driverTable->bowCover6 = DRIVER_POWER_OFF; - driverTable->bowRudderDeploy = DRIVER_POWER_OFF; - driverTable->bowRudderServo1 = DRIVER_POWER_OFF; - driverTable->bowRudderServo2 = DRIVER_POWER_OFF; - driverTable->bowWaterlnet1 = DRIVER_POWER_OFF; - driverTable->bowWaterlnet2 = DRIVER_POWER_OFF; - driverTable->bowWaterlnet3 = DRIVER_POWER_OFF; - driverTable->bowWaterlnet4 = DRIVER_POWER_OFF; - driverTable->bowWaterlnet5 = DRIVER_POWER_OFF; - driverTable->bowWaterlnet6 = DRIVER_POWER_OFF; - driverTable->bowWaterlnet7 = DRIVER_POWER_OFF; - driverTable->bowWaterlnet8 = DRIVER_POWER_OFF; - driverTable->waterInject = DRIVER_POWER_OFF; - driverTable->mastLiftingServo = DRIVER_POWER_OFF; - driverTable->buoyancyAdjust1 = DRIVER_POWER_OFF; - driverTable->buoyancyAdjust2 = DRIVER_POWER_OFF; - driverTable->buoyancyAdjust3 = DRIVER_POWER_OFF; - driverTable->buoyancyAdjust4 = DRIVER_POWER_OFF; - driverTable->buoyancyAdjust5 = DRIVER_POWER_OFF; - driverTable->sternRudderServo1 = DRIVER_POWER_OFF; - driverTable->sternRudderServo2 = DRIVER_POWER_OFF; - driverTable->sternRudderServo3 = DRIVER_POWER_OFF; - driverTable->sternRudderServo4 = DRIVER_POWER_OFF; - driverTable->thruster = DRIVER_POWER_OFF; - driverTable->bowThrow = DRIVER_POWER_OFF; - driverTable->sternThrow = DRIVER_POWER_OFF; + driverTable->bowCover1 = 0; + driverTable->bowCover2 = 0; + driverTable->bowCover3 = 0; + driverTable->bowCover4 = 0; + driverTable->bowCover5 = 0; + driverTable->bowCover6 = 0; + driverTable->bowRudderDeploy = 0; + driverTable->bowRudderServo1 = 0; + driverTable->bowRudderServo2 = 0; + driverTable->bowWaterlnet1 = 0; + driverTable->bowWaterlnet2 = 0; + driverTable->bowWaterlnet3 = 0; + driverTable->bowWaterlnet4 = 0; + driverTable->bowWaterlnet5 = 0; + driverTable->bowWaterlnet6 = 0; + driverTable->bowWaterlnet7 = 0; + driverTable->bowWaterlnet8 = 0; + driverTable->waterInject = 0; + driverTable->mastLiftingServo = 0; + driverTable->buoyancyAdjust1 = 0; + driverTable->buoyancyAdjust2 = 0; + driverTable->buoyancyAdjust3 = 0; + driverTable->buoyancyAdjust4 = 0; + driverTable->buoyancyAdjust5 = 0; + driverTable->sternRudderServo1 = 0; + driverTable->sternRudderServo2 = 0; + driverTable->sternRudderServo3 = 0; + driverTable->sternRudderServo4 = 0; + driverTable->thruster = 0; + driverTable->bowThrow = 0; + driverTable->sternThrow = 0; } void Driver::getSHORE_BASED_READYable(DriverTable* driverTable) diff --git a/src/pPowerManger/pmSysvariable.h b/src/pPowerManger/pmSysvariable.h index 48d98b0..26a03a8 100644 --- a/src/pPowerManger/pmSysvariable.h +++ b/src/pPowerManger/pmSysvariable.h @@ -360,5 +360,54 @@ typedef struct pmState unsigned int workCMD; }MSControlCmd; + +namespace FcuCommand { + enum Type : unsigned char { + SelfCheck = 0x01, + Start = 0x02, + Stop = 0x03, + Reset = 0x04, + EmergencyStop = 0x05, + Supply = 0x06, + WarmUp = 0x07, + Maintenance = 0x08 + }; +} + +enum class FcuState : unsigned char { + //初始化 + Init = 0x01, + //待机 + Standby = 0x02, + //自检异常 + SelfCheckError = 0x03, + //就绪 + Ready = 0x04, + //启动 + Start = 0x05, + //运行 + Running = 0x06, + //停机 + Stop = 0x07, + //故障 + Fault = 0x08, + //补给 + Supply = 0x09, + //预热 + WarmUp = 0x0A, + //预热完成 + WarmUpComplete = 0x0B, + //维护 + Maintenance = 0x0C, + //维护完成 + MaintenanceComplete = 0x0D +}; + +namespace BatteryCommand { + enum Type : unsigned char { + Start = 0x10, + Stop = 0x20 + }; +} #endif \ No newline at end of file