152 lines
4.9 KiB
C++
152 lines
4.9 KiB
C++
#ifndef POWER_MANAGER_FSM_HPP
|
|
#define POWER_MANAGER_FSM_HPP
|
|
|
|
#include "PowerManger.h"
|
|
#include "tinyfsm.hpp"
|
|
|
|
|
|
|
|
// 定义事件类型
|
|
struct InitEvent : tinyfsm::Event { };
|
|
struct StandbyEvent : tinyfsm::Event { };
|
|
struct FaultEvent : tinyfsm::Event {
|
|
unsigned int faultCode;
|
|
FaultEvent(unsigned int code) : faultCode(code) {}
|
|
};
|
|
|
|
// 定义状态机基类
|
|
class PowerManagerFsm : public tinyfsm::Fsm<PowerManagerFsm> {
|
|
protected:
|
|
static PowerManger* pm;
|
|
|
|
public:
|
|
// 初始化状态机
|
|
static void init(PowerManger* powerManager) {
|
|
pm = powerManager;
|
|
}
|
|
|
|
// 响应事件默认实现
|
|
virtual void react(tinyfsm::Event const &) { }
|
|
|
|
// 状态转换接口
|
|
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<FaultState>();
|
|
PowerManagerFsm::pm->m_faultNum = 1;
|
|
return;
|
|
}
|
|
string desp = "等待复合管控消息 : " + to_string(10-dft);
|
|
PowerManagerFsm::pm->printState("InitState", desp);
|
|
}
|
|
|
|
// 2. 检查复合管控器是否上报故障
|
|
if(PowerManagerFsm::pm->checkError() < 0) {
|
|
transit<FaultState>();
|
|
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<StandbyState>();
|
|
return;
|
|
}
|
|
PowerManagerFsm::pm->m_pmEvent = "等待关键断路器闭合";
|
|
MOOSPause(1000);
|
|
PowerManagerFsm::pm->printState("InitState", PowerManagerFsm::pm->m_pmEvent);
|
|
}
|
|
}
|
|
};
|
|
|
|
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<FaultState>();
|
|
return;
|
|
}
|
|
|
|
// 2. 处理上位机控制指令
|
|
handlePowerCommands();
|
|
MOOSPause(1000);
|
|
}
|
|
}
|
|
|
|
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;
|
|
}
|
|
};
|
|
|
|
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;
|
|
}
|
|
}
|
|
};
|
|
|
|
// 设置初始状态
|
|
FSM_INITIAL_STATE(PowerManagerFsm, InitState);
|
|
|
|
#endif // POWER_MANAGER_FSM_HPP
|