使用状态机增加了初始状态和故障状态,编写了gui调试程序

This commit is contained in:
zjk
2025-01-02 18:28:47 +08:00
parent d9d715326a
commit d2961cf005
19 changed files with 1085 additions and 196 deletions
+105 -49
View File
@@ -9,7 +9,6 @@
#include "MBUtils.h"
#include "ACTable.h"
#include "PowerManger.h"
#include "MOOS/libMOOS/Utils/ConsoleColours.h"
#include <memory>
using namespace std;
@@ -32,33 +31,18 @@ PowerManger::PowerManger()
falutLevel = 0;
soc = 0;
sustainableTime = 0;
m_connected = false;
faultCode.push_back(0);
//注册状态机
m_fsm.RegisterState("PM_STATE", 1, m_state1);
m_fsm.RegisterState("PM_STATE2", 2, m_state2);
m_fsm.RegisterState("PM_STATE3", 3, m_state3);
m_fsm.RegisterState("Init", 1, m_Inite_s1);
m_fsm.RegisterState("Fault", 99, m_Fault_s99);
m_fsm.RegisterHandleFunction(&m_state1,handleState1);
m_fsm.RegisterHandleFunction(&m_state2,handleState2);
m_fsm.RegisterHandleFunction(&m_state3,handleState3);
// 注册状态机转换条件
// m_fsm.RegisterEvent(&m_state1, "a", &m_state2);
// m_fsm.RegisterEvent(&m_state2, "b", &m_state3);
// m_fsm.RegisterEvent(&m_state3, "c", &m_state1);
// cout << m_state1.event["a"]->name << endl;
// cout << m_state2.event["b"]->name << endl;
// cout << m_state1.event["a"]->id << endl;
// m_pmEvent = "a";
m_fsm.RegisterHandleFunction(&m_Inite_s1, handleInite_s1);
m_fsm.RegisterHandleFunction(&m_Fault_s99, handleFault_s99);
// 初始化状态机
m_pmState = m_state1;
m_pmState = m_Inite_s1;
}
//---------------------------------------------------------
@@ -115,20 +99,17 @@ bool PowerManger::OnConnectToServer()
bool PowerManger::Iterate()
{
m_fsm.run(m_pmState,this);
// m_fsm.run(&m_pmState,this,m_pmEvent);
cout <<"CURRENT STATE:" << m_pmState.name << " | CURRENT EVENT :" << m_pmEvent << endl;
// cout <<"____________________________________-" << m_pmState.event[m_pmEvent]->name << endl;
// cout << m_pmState.name << endl;
// cout << m_pmEvent << endl;
AppCastingMOOSApp::Iterate();
// 更新当前状态
//1. 更新当前状态
updatePmState();
updateTime();
//2. 运行状态机
m_fsm.run(m_pmState,this);
cout <<"CURRENT STATE:" << m_pmState.name << " | CURRENT EVENT :" << m_pmEvent << endl;
AppCastingMOOSApp::Iterate();
//3. 输出报告
buildPowerSysReport();
//输出错误信息
//4. 打印错误信息
if(!m_udpComm.sError.empty())
{
for(int i=0;i<m_udpComm.sError.size();i++)
@@ -138,6 +119,7 @@ bool PowerManger::Iterate()
m_udpComm.sError.clear();
}
//AppCastingMOOSApp::PostReport();
//5. 清空UDP消息队列
m_udpComm.clearMsgQueue();
return(true);
}
@@ -176,10 +158,13 @@ bool PowerManger::OnStartUp()
}
registerVariables();
//绑定UDP端口
if(m_pCcuUdpComm = setUdpScoket(IPORT))
{
cout<<MOOS::ConsoleColours::green()<< "UDP set succeed!"<< MOOS::ConsoleColours::reset() << endl;
m_udpComm.ccuHost = CCUHOST;
m_udpComm.ccuPort = CCUPORT;
m_udpComm.udpScoket = m_pCcuUdpComm;
MOOSTrace("UDP set succeed");
}
else
@@ -253,7 +238,9 @@ bool PowerManger::ListenLoopUDP()
cout<<MOOS::ConsoleColours::red()<< m_udpComm.sError[i] << MOOS::ConsoleColours::reset() << endl;
}
}
m_connected = true;
}
// updatePmState();
}
return true;
}
@@ -794,28 +781,97 @@ bool PowerManger::saveStringToJsonFile(const string &strJson, const string &file
return false;
}
}
//TODO:配电系统操作函数
bool PowerManger::disSystemOperation(disBreaker optBreaker, disBreakerOpt)
{
// switch (disBreaker)
// {
// case bus1_fuelCellCircuitBreaker :
// // send()
// break;
// default:
// break;
// }
}
int PowerManger::handleState1(FSM_State &fsm,void* pData)
int PowerManger::handleInite_s1(FSM_State &fsm, void* pData)
{
cout << fsm.name << endl;
PowerManger* pm = (PowerManger*)pData;
fsm = pm->m_fsm.getState("PM_STATE2");
// pm->m_pmEvent = "a";
//1. 检查复合管控器连接
double StartTime = pm->GetAppStartTime();
while (!pm->m_connected)
{
pm->updateTime();
double dft = abs(pm->m_current_time - StartTime);
if(dft > 1)
{
pm->m_pmState = pm->m_Fault_s99;
break;
}
string desp = "等待复合管控消息 : 超时 : " + to_string(10-dft);
pm->printState(fsm,desp);
usleep(1000000);
}
//2. 检查复合管控器是否上报故障 如果故障则进入故障状态
bool ok = true;
if(pm->m_pmCurrentState.ccustate.fcuGZ_1H != 0 ||
pm->m_pmCurrentState.ccustate.fcuGZ_1L != 0 ||
pm->m_pmCurrentState.ccustate.fcuGZ_2H != 0 ||
pm->m_pmCurrentState.ccustate.fcuGZ_2L != 0 ||
pm->m_pmCurrentState.ccustate.fcuGZ_3H != 0 ||
pm->m_pmCurrentState.ccustate.fcuGZ_3L != 0 ||
pm->m_pmCurrentState.ccustate.insEmergencyStatusWord != 0)
{
ok = false;
}
if(!ok)
{
pm->m_pmState = pm->m_Fault_s99;
}
//3. 检查当前配电装置状态
// 首先闭合应急电源开关
//TODO 检查并配置当前配电装置状态
disHighVolBusCmd a;
a.fuelCellCircuitBreaker = 0xAA;
a.propulsionMotorCircuitBreaker = 0xAA;
pm->m_udpComm.sendDisSysCmd(a);
MOOSPause(1000);
// pm->workCondition = "";
return 0;
}
int PowerManger::handleState2(FSM_State &fsm,void* pData)
int PowerManger::handleFault_s99(FSM_State &fsm, void* pData)
{
cout << fsm.name << endl;
PowerManger* pm = (PowerManger*)pData;
fsm = pm->m_fsm.getState("PM_STATE3");
// pm->m_pmEvent = "b";
return 0;
}
int PowerManger::handleState3(FSM_State &fsm,void* pData)
{
cout << fsm.name << endl;
PowerManger* pm = (PowerManger*)pData;
fsm = pm->m_fsm.getState("PM_STATE");
// pm->m_pmEvent = "c";
return 0;
}
// int PowerManger::handleState1(FSM_State &fsm,void* pData)
// {
// cout << fsm.name << endl;
// PowerManger* pm = (PowerManger*)pData;
// fsm = pm->m_fsm.getState("PM_STATE2");
// // pm->m_pmEvent = "a";
// return 0;
// }
// int PowerManger::handleState2(FSM_State &fsm,void* pData)
// {
// cout << fsm.name << endl;
// PowerManger* pm = (PowerManger*)pData;
// fsm = pm->m_fsm.getState("PM_STATE3");
// // pm->m_pmEvent = "b";
// return 0;
// }
// int PowerManger::handleState3(FSM_State &fsm,void* pData)
// {
// cout << fsm.name << endl;
// PowerManger* pm = (PowerManger*)pData;
// fsm = pm->m_fsm.getState("PM_STATE");
// // pm->m_pmEvent = "c";
// return 0;
// }