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] =?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