增加了配电控制器操作代码

This commit is contained in:
zjk
2025-02-17 21:57:45 +08:00
parent 59202d20aa
commit 1aa46629a7
14 changed files with 1356 additions and 456 deletions
+315 -229
View File
@@ -41,6 +41,9 @@ PowerManger::PowerManger()
m_faultNum = 0;
faultCode.push_back(0);
//初始化断路器状态
initTargetDisBreakerState();
//初始化数据库
string dbPath = "/home/zjk/project/H100/H100PowerManger/data/power_data.db";
m_db = new SQLiteDB(dbPath);
@@ -49,9 +52,11 @@ PowerManger::PowerManger()
//注册状态机
m_fsm.RegisterState("Init", 1, m_Inite_s1);
m_fsm.RegisterState("Stady", 2, m_Standby_s2);
m_fsm.RegisterState("Fault", 99, m_Fault_s99);
m_fsm.RegisterHandleFunction(&m_Inite_s1, handleInite_s1);
m_fsm.RegisterHandleFunction(&m_Standby_s2, handleStandby_s2);
m_fsm.RegisterHandleFunction(&m_Fault_s99, handleFault_s99);
// 初始化状态机
@@ -117,11 +122,12 @@ bool PowerManger::Iterate()
updatePmState();
updateTime();
//2. 运行状态机
// m_fsm.run(m_pmState,this);
if (FSM_RUN_IS_OK)
m_FsmThread.Start();
else
m_FsmThread.Stop();
//进行配电系统操作
disSysOption();
//3. 输出报告
buildPowerSysReport();
//4. 打印错误信息
@@ -175,7 +181,7 @@ bool PowerManger::OnStartUp()
}
registerVariables();
//绑定UDP端口
//启动UDP监听线程
if(m_pCcuUdpComm = setUdpScoket(IPORT))
{
cout<<MOOS::ConsoleColours::green()<< "UDP set succeed!"<< MOOS::ConsoleColours::reset() << endl;
@@ -324,6 +330,303 @@ bool PowerManger::IsSkewed(double dfTimeNow, double * pdfSkew)
return (dfSkew > SKEW_TOLERANCE) ? true : false;
}
void PowerManger::disSysOption()
{
//1.更新断路器的状态
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;
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;
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;
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.bus1Breaker = *pdis1;
m_currentDisBreakerState.bus2Breaker = *pdis2;
m_currentDisBreakerState.bus3Breaker = *pdis3;
m_currentDisBreakerState.bus4Breaker = *pdis4;
delete pdis1;
delete pdis2;
delete pdis3;
delete pdis4;
//2.根据目标状态进行断路器操作
//a. 高压母线的断路器
disHighVolBusCmd a;
a.fuelCellCircuitBreaker = getBreakerOption(m_targetDisBreakerState.bus1Breaker.fuelCellCircuitBreaker);
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);
}
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()
{
m_stateData.state_id = m_pmState.id;
m_stateData.state_name = m_pmState.name;
m_stateData.event = m_pmEvent;
m_stateData.event_id = 1;
m_stateData.fault_code = m_faultNum;
m_stateData.note = "No fault";
if(!m_db->insertStateData(m_stateData))
return false;
return true;
}
void PowerManger::printState(FSM_State st, string desp){
cout << MOOS::ConsoleColours::Yellow() << "STATE " << st.id << " [" << st.name << "] " << 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;
return;
}
cout << MOOS::ConsoleColours::Green() << desp << MOOS::ConsoleColours::reset() << endl;
}
int PowerManger::handleInite_s1(FSM_State &fsm, void* pData)
{
cout << fsm.name << endl;
PowerManger* pm = (PowerManger*)pData;
//1. 检查复合管控器连接 如果10S则进入故障状态
double StartTime = pm->GetAppStartTime();
while (!pm->m_connected)
{
MOOSPause(1000);
pm->updateTime();
double dft = abs(pm->m_current_time - StartTime);
if(dft > 10)
{
pm->m_pmState = pm->m_Fault_s99;
pm->m_faultNum = 1; // 通信超时
break;
}
string desp = "等待复合管控消息 : " + to_string(10-dft);
pm->printState(fsm,desp);
}
//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. 初始化配电系统为待机状态
pm->initTargetDisBreakerState();
pm->m_pmState = pm->m_Standby_s2;
return 0;
}
int PowerManger::handleStandby_s2(FSM_State &fsm, void* pData)
{
PowerManger* pm = (PowerManger*)pData;
while (true)
{
string desp = "待机状态";
pm->printState(fsm,desp);
MOOSPause(1000);
}
}
int PowerManger::handleFault_s99(FSM_State &fsm, void* pData)
{
// cout << fsm.name << endl;
PowerManger* pm = (PowerManger*)pData;
switch (pm->m_faultNum)
{
case 1:
pm->printState(fsm,"通信故障");
pm->m_pmEvent = "复合管控连接超时";
break;
default:
break;
}
pm->printState(fsm,"故障");
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;
// }
void PowerManger::initTargetDisBreakerState()
{
m_targetDisBreakerState.bus1Breaker.fuelCellCircuitBreaker = 0;
m_targetDisBreakerState.bus1Breaker.powerLithiumBatteryCircuitBreaker = 1; //动力锂电池默认接入
m_targetDisBreakerState.bus1Breaker.propulsionMotorCircuitBreaker = 0;
m_targetDisBreakerState.bus1Breaker.lithiumBatteryGroupInstrumentCircuitBreaker = 0; //仪表锂电池默认接入
m_targetDisBreakerState.bus1Breaker.dcDc5ModuleCircuitBreaker = 1; //DC-DC模块默认接入
m_targetDisBreakerState.bus1Breaker.bowHighVoltageDistributionBoxCircuitBreaker = 1; //艏部高压母线断路器默认接入
m_targetDisBreakerState.bus1Breaker.sternFTDevice45CircuitBreaker = 0; // sternFTDevice45CircuitBreaker默认接入
m_targetDisBreakerState.bus1Breaker.sternRudderSwitch1CircuitBreaker = 0;
m_targetDisBreakerState.bus1Breaker.sternRudderSwitch2CircuitBreaker = 0;
m_targetDisBreakerState.bus1Breaker.fbReservedCircuitBreaker = 0;
m_targetDisBreakerState.bus1Breaker.tyzReservedCircuitBreaker = 0;
m_targetDisBreakerState.bus1Breaker.reservedCircuitBreaker = 0;
m_targetDisBreakerState.bus2Breaker.bowFTDevice123CircuitBreaker = 0;
m_targetDisBreakerState.bus2Breaker.actuatorCircuitBreaker = 0;
m_targetDisBreakerState.bus2Breaker.mastSteeringGearControlBoxCircuitBreaker = 0;
m_targetDisBreakerState.bus2Breaker.xczCircuitBreaker = 0;
m_targetDisBreakerState.bus2Breaker.bowRudderControlBoxCircuitBreaker = 0;
m_targetDisBreakerState.bus2Breaker.openWaterCoverStartCylinderCircuitBreaker = 0;
//锂电池默认接入
m_targetDisBreakerState.bus3Breaker.lithiumBatteryGroupInstrumentCircuitBreaker = 1;
m_targetDisBreakerState.bus3Breaker.bowLowVoltageDistributionBoxCircuitBreaker = 1;
m_targetDisBreakerState.bus3Breaker.unit4InstrumentDC48VCircuitBreaker = 1;
m_targetDisBreakerState.bus3Breaker.dcC1DCDistributionPanelCircuitBreaker = 1;
m_targetDisBreakerState.bus3Breaker.reservedCircuitBreaker1 = 0;
m_targetDisBreakerState.bus3Breaker.reservedCircuitBreaker2 = 0;
m_targetDisBreakerState.bus3Breaker.emergencyLithiumBatteryGroup2CircuitBreaker = 1;
m_targetDisBreakerState.bus4Breaker.unit1CircuitBreaker = 1;
m_targetDisBreakerState.bus4Breaker.unit2CircuitBreaker = 1;
m_targetDisBreakerState.bus4Breaker.unit3CircuitBreaker = 1;
m_targetDisBreakerState.bus4Breaker.unit5CircuitBreaker = 1;
m_targetDisBreakerState.bus4Breaker.bowPZDeviceCircuitBreaker = 1;
m_targetDisBreakerState.bus4Breaker.reservedCircuitBreaker1 = 0;
m_targetDisBreakerState.bus4Breaker.reservedCircuitBreaker2 = 0;
m_targetDisBreakerState.bus4Breaker.emergencyLithiumBatteryGroup1CircuitBreaker = 1; //紧急锂电池默认接入
}
char PowerManger::getBreakerOption(char cmd)
{
if(cmd ==1)
return 0x55;
else if(cmd ==0)
return 0xAA;
else
return 0x00;
}
string PowerManger::getTypeName(const string typeName)
{
// 映射类型名称到指定的字符串
@@ -357,6 +660,7 @@ string PowerManger::getTypeName(const string typeName)
}
}
bool PowerManger::buildPowerSysReport()
{
//TODO: 构建能源系统报告
@@ -591,62 +895,21 @@ bool PowerManger::buildPowerSysReport()
lbs[VAR_TO_STR(powfaultCode)+suffix] = m_pmCurrentState.ccustate.powerAlarmIdentificationWord;
//5.构建配电系统状态报告
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;
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;
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;
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;
dis["HVolBusBreaker_uint16"] = *(unsigned short*) pdis1;
dis["HVolABusBreaker_unit16"] = *(unsigned short*) pdis2;
dis["HVolBBusBreaker_unit16"] = *(unsigned short*) pdis3;
dis["LVolBusBreaker_uint16"] = *(unsigned short*) pdis3;
*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;
delete pdis1;
delete pdis2;
delete pdis3;
delete pdis4;
//TODO: 构建配电系统故障码
Json::Value faultCodeDis_array;
for(auto val : faultCode)
@@ -788,180 +1051,3 @@ bool PowerManger::buildPowerSysReport()
return true;
}
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()
{
m_stateData.state_id = m_pmState.id;
m_stateData.state_name = m_pmState.name;
m_stateData.event = m_pmEvent;
m_stateData.event_id = 1;
m_stateData.fault_code = m_faultNum;
m_stateData.note = "No fault";
if(!m_db->insertStateData(m_stateData))
return false;
return true;
}
//TODO:配电系统操作函数
bool PowerManger::disSystemOperation(disBreaker optBreaker, disBreakerOpt)
{
return true;
}
void PowerManger::printState(FSM_State st, string desp){
cout << MOOS::ConsoleColours::Yellow() << "STATE " << st.id << " [" << st.name << "] " << 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;
return;
}
cout << MOOS::ConsoleColours::Green() << desp << MOOS::ConsoleColours::reset() << endl;
}
int PowerManger::handleInite_s1(FSM_State &fsm, void* pData)
{
cout << fsm.name << endl;
PowerManger* pm = (PowerManger*)pData;
//1. 检查复合管控器连接 如果10S则进入故障状态
double StartTime = pm->GetAppStartTime();
while (!pm->m_connected)
{
MOOSPause(1000);
pm->updateTime();
double dft = abs(pm->m_current_time - StartTime);
if(dft > 10)
{
pm->m_pmState = pm->m_Fault_s99;
pm->m_faultNum = 1; // 通信超时
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. 检查当前配电装置状态
//a. 断开高压母线的主要断路器
//TODO 配置当前配电装置状态
disHighVolBusCmd a;
a.fuelCellCircuitBreaker = DIS_BREAKER_OFF;
a.propulsionMotorCircuitBreaker = DIS_BREAKER_OFF;
a.bowHighVoltageDistributionBoxCircuitBreaker = DIS_BREAKER_OFF;
a.tyzReservedCircuitBreaker = DIS_BREAKER_OFF;
a.sternFTDevice45CircuitBreaker = DIS_BREAKER_OFF;
a.sternRudderSwitch1CircuitBreaker = DIS_BREAKER_OFF;
a.sternRudderSwitch2CircuitBreaker = DIS_BREAKER_OFF;
a.reservedCircuitBreaker = DIS_BREAKER_OFF;
a.fbReservedCircuitBreaker = DIS_BREAKER_OFF;
pm->m_udpComm.sendDisSysCmd(a);
//b. 断开艏部高压设备的主要断路器
disHighAVolBusCmd b;
b.bowFTDevice123CircuitBreaker = DIS_BREAKER_OFF;
b.actuatorCircuitBreaker = DIS_BREAKER_OFF;
b.mastSteeringGearControlBoxCircuitBreaker = DIS_BREAKER_OFF;
b.xczCircuitBreaker = DIS_BREAKER_OFF;
b.bowRudderControlBoxCircuitBreaker = DIS_BREAKER_OFF;
b.openWaterCoverStartCylinderCircuitBreaker = DIS_BREAKER_OFF;
pm->m_udpComm.sendDisSysCmd(b);
//c. 闭合低压母线的断路器
disHighBVolBusCmd c;
c.lithiumBatteryGroupInstrumentCircuitBreaker = DIS_BREAKER_ON;
c.bowLowVoltageDistributionBoxCircuitBreaker = DIS_BREAKER_ON;
c.unit4InstrumentDC48VCircuitBreaker = DIS_BREAKER_ON;
c.dcC1DCDistributionPanelCircuitBreaker = DIS_BREAKER_ON;
c.reservedCircuitBreaker1 = DIS_BREAKER_ON;
c.reservedCircuitBreaker2 = DIS_BREAKER_ON;
c.emergencyLithiumBatteryGroup2CircuitBreaker = DIS_BREAKER_ON;
pm->m_udpComm.sendDisSysCmd(c);
//d. 闭合低压汇流排断路器
disLowBusCmd d;
d.unit1CircuitBreaker = DIS_BREAKER_ON;
d.unit2CircuitBreaker = DIS_BREAKER_ON;
d.unit3CircuitBreaker = DIS_BREAKER_ON;
d.unit5CircuitBreaker = DIS_BREAKER_ON;
d.bowPZDeviceCircuitBreaker = DIS_BREAKER_ON;
d.reservedCircuitBreaker1 = DIS_BREAKER_ON;
d.reservedCircuitBreaker2 = DIS_BREAKER_ON;
d.emergencyLithiumBatteryGroup1CircuitBreaker = DIS_BREAKER_ON;
pm->m_udpComm.sendDisSysCmd(d);
MOOSPause(1000);
// pm->workCondition = "";
return 0;
}
int PowerManger::handleFault_s99(FSM_State &fsm, void* pData)
{
// cout << fsm.name << endl;
PowerManger* pm = (PowerManger*)pData;
switch (pm->m_faultNum)
{
case 1:
pm->printState(fsm,"通信故障");
pm->m_pmEvent = "复合管控连接超时";
break;
default:
break;
}
pm->printState(fsm,"故障");
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;
// }