增加了网页服务
This commit is contained in:
@@ -21,8 +21,12 @@ SET(SQLITE_SRC
|
||||
sqlit3/sqlite3.c
|
||||
)
|
||||
|
||||
SET(HTTP_SRC
|
||||
httpserver/mongoose.c
|
||||
httpserver/httpserver.cpp)
|
||||
|
||||
SET(FSMLIB_SRC
|
||||
fsm/PowerManagerFsm.cpp # 更新静态库的源文件路径
|
||||
fsm/PowerManagerFsm.cpp
|
||||
fsm/CruiseMode.cpp
|
||||
fsm/DJMode.cpp
|
||||
fsm/FaultState.cpp
|
||||
@@ -41,6 +45,7 @@ SET(FSMLIB_SRC
|
||||
SET(SRC
|
||||
${FSMLIB_SRC}
|
||||
${SQLITE_SRC}
|
||||
${HTTP_SRC}
|
||||
PowerManger.cpp
|
||||
PowerManger_Info.cpp
|
||||
udpComm.cpp
|
||||
|
||||
@@ -107,7 +107,11 @@ bool LowerCommManager::sendDisSysCommand(const disSysBreakerList& cmd){
|
||||
a.sternRudderSwitch2CircuitBreaker = getBreakerOption(cmd.bus1Breaker.sternRudderSwitch2CircuitBreaker);
|
||||
a.reservedCircuitBreaker = getBreakerOption(cmd.bus1Breaker.reservedCircuitBreaker);
|
||||
a.fbReservedCircuitBreaker = getBreakerOption(cmd.bus1Breaker.fbReservedCircuitBreaker);
|
||||
a.dcdc5Module = getBreakerOption(cmd.bus1Breaker.dcdcmodel);
|
||||
a.coolingSystem = getBreakerOption(cmd.bus1Breaker.coolingSystem);
|
||||
|
||||
m_udpComm->sendDisSysCmd(a);
|
||||
m_pm->m_db->insertData(a);
|
||||
usleep(5000);
|
||||
//b. 高压汇流排A断路器
|
||||
disHighAVolBusCmd b;
|
||||
@@ -118,17 +122,21 @@ bool LowerCommManager::sendDisSysCommand(const disSysBreakerList& cmd){
|
||||
b.bowRudderControlBoxCircuitBreaker = getBreakerOption(cmd.bus2Breaker.bowRudderControlBoxCircuitBreaker);
|
||||
b.openWaterCoverStartCylinderCircuitBreaker = getBreakerOption(cmd.bus2Breaker.openWaterCoverStartCylinderCircuitBreaker);
|
||||
m_udpComm->sendDisSysCmd(b);
|
||||
m_pm->m_db->insertData(b);
|
||||
usleep(5000);
|
||||
//c. 高压汇流排B断路器
|
||||
//c. 低压主母线断路器
|
||||
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);
|
||||
|
||||
c.lithiumBatteryGroupInstrumentCircuitBreaker = 0x55;
|
||||
c.bowLowVoltageDistributionBoxCircuitBreaker = 0xAA;
|
||||
c.unit4InstrumentDC48VCircuitBreaker = 0xAA;
|
||||
c.dcC1DCDistributionPanelCircuitBreaker = 0xAA;
|
||||
c.reservedCircuitBreaker1 = 0xAA;
|
||||
c.reservedCircuitBreaker2 = 0xAA;
|
||||
c.emergencyLithiumBatteryGroup2CircuitBreaker = 0xAA;
|
||||
|
||||
m_udpComm->sendDisSysCmd(c);
|
||||
m_pm->m_db->insertData(c);
|
||||
usleep(5000);
|
||||
//d. 闭合低压汇流排断路器
|
||||
disLowBusCmd d;
|
||||
@@ -141,12 +149,8 @@ bool LowerCommManager::sendDisSysCommand(const disSysBreakerList& cmd){
|
||||
d.reservedCircuitBreaker2 = getBreakerOption(cmd.bus4Breaker.reservedCircuitBreaker2);
|
||||
d.emergencyLithiumBatteryGroup1CircuitBreaker = getBreakerOption(cmd.bus4Breaker.emergencyLithiumBatteryGroup1CircuitBreaker);
|
||||
m_udpComm->sendDisSysCmd(d);
|
||||
m_pm->m_db->insertData(d);
|
||||
usleep(5000);
|
||||
//将指令写入数据库
|
||||
// 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;
|
||||
}
|
||||
|
||||
@@ -163,7 +167,7 @@ bool LowerCommManager::updatePoweSystemStates(){
|
||||
double time;
|
||||
m_udpComm->popMsgFormQueue(time,m_CcuCurrentState);
|
||||
m_pm->m_pmCurrentState.ccustate = m_CcuCurrentState.data;
|
||||
// m_db->insertCcuData(m_CcuCurrentState.data); //写入数据库
|
||||
m_pm->m_db->insertData(m_pm->m_pmCurrentState.ccustate); //写入数据库
|
||||
//DEBUG
|
||||
//写入文件
|
||||
std::ofstream outFile("ccuState.txt", std::ios::app);
|
||||
@@ -175,7 +179,7 @@ bool LowerCommManager::updatePoweSystemStates(){
|
||||
double time;
|
||||
m_udpComm->popMsgFormQueue(time,m_disHighVolBusCurrentState);
|
||||
m_pm->m_pmCurrentState.bus1State = m_disHighVolBusCurrentState.data;
|
||||
// m_db->insertDisHighVolBusData(m_disHighVolBusCurrentState.data); //写入数据库
|
||||
m_pm->m_db->insertData(m_pm->m_pmCurrentState.bus1State); //写入数据库
|
||||
msg_disHighVolBusFbMsg_Update_time = time;
|
||||
|
||||
disBus1Breaker* pdis1=new disBus1Breaker;
|
||||
@@ -200,7 +204,7 @@ bool LowerCommManager::updatePoweSystemStates(){
|
||||
double time;
|
||||
m_udpComm->popMsgFormQueue(time,m_disHighAVolBusCurrentState);
|
||||
m_pm->m_pmCurrentState.bus2State = m_disHighAVolBusCurrentState.data;
|
||||
// m_db->insertDisHighAVolBusData(m_disHighAVolBusCurrentState.data); //写入数据库
|
||||
m_pm->m_db->insertData(m_pm->m_pmCurrentState.bus2State); //写入数据库
|
||||
msg_disHighAVolBusFbMsg_Update_time = time;
|
||||
|
||||
disBus2Breaker* pdis2=new disBus2Breaker;
|
||||
@@ -219,7 +223,7 @@ bool LowerCommManager::updatePoweSystemStates(){
|
||||
double time;
|
||||
m_udpComm->popMsgFormQueue(time,m_disHighBVolBusCurrentState);
|
||||
m_pm->m_pmCurrentState.bus3State = m_disHighBVolBusCurrentState.data;
|
||||
// m_db->insertDisHighBVolBusData(m_disHighBVolBusCurrentState.data); //写入数据库
|
||||
m_pm->m_db->insertData(m_pm->m_pmCurrentState.bus3State); //写入数据库
|
||||
msg_disHighBVolBusFbMsg_Update_time = time;
|
||||
|
||||
disBus3Breaker* pdis3=new disBus3Breaker;
|
||||
@@ -239,7 +243,7 @@ bool LowerCommManager::updatePoweSystemStates(){
|
||||
double time;
|
||||
m_udpComm->popMsgFormQueue(time,m_disLowBusState);
|
||||
m_pm->m_pmCurrentState.bus4State = m_disLowBusState.data;
|
||||
// m_db->insertDisLowBusData(m_disLowBusState.data); //写入数据库
|
||||
m_pm->m_db->insertData(m_pm->m_pmCurrentState.bus4State); //写入数据库
|
||||
msg_disLowBusFbMsg_Update_time = time;
|
||||
|
||||
disBus4Breaker* pdis4=new disBus4Breaker;
|
||||
|
||||
@@ -39,7 +39,7 @@ public:
|
||||
// 发送CCU控制命令
|
||||
bool sendCcuCommand(const ccuColCmd cmd);
|
||||
bool sendDisSysCommand(const disSysBreakerList& cmd);
|
||||
|
||||
|
||||
// 获取通信状态
|
||||
int getConnectionState() const { return m_connectState; }
|
||||
|
||||
|
||||
@@ -47,18 +47,24 @@ PowerManger::PowerManger()
|
||||
//初始化控制指令
|
||||
initControlCmd();
|
||||
|
||||
//初始化UDP通信
|
||||
//初始化下位机通信
|
||||
m_lowerCommManager = new LowerCommManager(this,IPORT,CCUPORT,CCUHOST);
|
||||
m_lowerCommManager->initUdpComm();
|
||||
m_lowerCommManager->startListenThread();
|
||||
|
||||
//初始化上位机通信
|
||||
m_upperCommManager = new UpperCommManager(this);
|
||||
//
|
||||
|
||||
//初始化数据库
|
||||
m_db = new SQLite("power_data.db");
|
||||
m_db->createTable();
|
||||
|
||||
//初始化http服务器
|
||||
m_httpServer = new HttpServer(8090);
|
||||
//初始化系统数据
|
||||
m_systemData = new SystemData();
|
||||
m_httpServer->setSystemData(m_systemData);
|
||||
m_httpServer->start();
|
||||
}
|
||||
|
||||
//---------------------------------------------------------
|
||||
@@ -129,18 +135,16 @@ bool PowerManger::Iterate()
|
||||
CycleTriggeredEvent cycleEvent;
|
||||
PowerManagerFsm::dispatch(cycleEvent);
|
||||
faultLevel = getFaultLevel();
|
||||
//更新数据库
|
||||
m_db->insertData(m_pmCurrentState.ccustate);
|
||||
m_db->insertData(m_pmCurrentState.bus1State);
|
||||
m_db->insertData(m_pmCurrentState.bus2State);
|
||||
m_db->insertData(m_pmCurrentState.bus3State);
|
||||
m_db->insertData(m_pmCurrentState.bus4State);
|
||||
m_systemData->updateSystemData(m_pmCurrentState.ccustate);
|
||||
m_systemData->updateSystemData(m_pmCurrentState.bus1State);
|
||||
m_systemData->updateSystemData(m_pmCurrentState.bus2State);
|
||||
m_systemData->updateSystemData(m_pmCurrentState.bus3State);
|
||||
m_systemData->updateSystemData(m_pmCurrentState.bus4State);
|
||||
if (m_ticker++ % 5 == 0)
|
||||
{
|
||||
m_CcuColCmd.heartbeat++;
|
||||
m_lowerCommManager->processPeriodicTasks();
|
||||
m_upperCommManager->processPeriodicTasks();
|
||||
writeDataToDB();
|
||||
}
|
||||
return(true);
|
||||
}
|
||||
@@ -249,22 +253,6 @@ bool PowerManger::FsmLoop()
|
||||
return true;
|
||||
}
|
||||
|
||||
bool PowerManger::writeDataToDB()
|
||||
{
|
||||
//写入设备状态
|
||||
// if(!m_db->insertDriverTables(m_currentDriverState,VAR_TO_STR(m_currentDriverState)))
|
||||
// return false;
|
||||
// if(!m_db->insertDriverTables(m_subDisSysState,VAR_TO_STR(m_subDisSysState)))
|
||||
// return false;
|
||||
// if(!m_db->insertDriverTables(m_subDisSysCmd,VAR_TO_STR(m_subDisSysCmd)))
|
||||
// return false;
|
||||
// if(!m_db->insertDriverTables(m_MSDriverCmd,VAR_TO_STR(m_MSDriverCmd)))
|
||||
// return false;
|
||||
|
||||
return true;
|
||||
|
||||
}
|
||||
|
||||
int PowerManger::checkError()
|
||||
{
|
||||
//TODO:更新协议
|
||||
|
||||
@@ -24,7 +24,6 @@
|
||||
#include "loguru.hpp"
|
||||
#include "MOOS/libMOOS/Thirdparty/AppCasting/AppCastingMOOSApp.h"
|
||||
#include "MOOS/libMOOS/Utils/MOOSThread.h"
|
||||
// #include "MOOS/libMOOS/Comms/XPCUdpSocket.h"
|
||||
#include "MOOS/libMOOS/Utils/MOOSUtilityFunctions.h"
|
||||
#include "MOOS/libMOOS/Utils/ConsoleColours.h"
|
||||
#include "ccuUdpMsg.h"
|
||||
@@ -32,12 +31,12 @@
|
||||
#include "udpComm.h"
|
||||
#include "pmSysvariable.h"
|
||||
#include "fsm/PowerManagerFsm.hpp"
|
||||
// #include "SQLiteDB.h"
|
||||
#include "driver.h"
|
||||
#include "LowerCommManager.h"
|
||||
#include "UpperCommManager.h"
|
||||
#include "sqlit3/SQLite.h"
|
||||
|
||||
#include "systemData.h"
|
||||
#include "httpserver/httpserver.h"
|
||||
|
||||
#define IPORT 5001
|
||||
#define CCUPORT 7000
|
||||
@@ -65,10 +64,11 @@ class PowerManger : public AppCastingMOOSApp
|
||||
void updateTime(){m_current_time = MOOSTime();}
|
||||
unsigned char getFaultLevel();
|
||||
//数据库
|
||||
// SQLiteDB* m_db;
|
||||
SQLite* m_db;
|
||||
bool writeDataToDB();
|
||||
|
||||
//http
|
||||
HttpServer* m_httpServer;
|
||||
//系统数据
|
||||
SystemData* m_systemData;
|
||||
/************************************************************/
|
||||
/* |<------------FEEDBACK--------<-- */
|
||||
/* | | */
|
||||
|
||||
@@ -123,8 +123,6 @@ void UpperCommManager::processPeriodicTasks() {
|
||||
//发送次级配电指令 修改后的代码
|
||||
// strJson = getSubDisCmd(m_pm->m_subDisSysCmd);
|
||||
strJson = m_secdistStateMsg.buildMsg(m_pm->m_subDisSysCmd);
|
||||
cout << (int)m_pm->m_subDisSysCmd.depth1 << endl;
|
||||
|
||||
m_pm->sendNotification(m_secdistStateMsg.key_cmd, strJson);
|
||||
//发送仪表电状态
|
||||
m_pm->sendNotification(m_equInsStateMsg.key,m_equInsStateMsg.buildMsg(m_pm->m_subDisSysState));
|
||||
@@ -146,17 +144,4 @@ void UpperCommManager::buildSystemReport() {
|
||||
m_pm->sendNotification(m_liBatStateMsg.key, m_liBatStateMsg.buildMsg(m_pm->m_pmCurrentState.ccustate));
|
||||
m_pm->sendNotification(m_disSysStateMsg.key, m_disSysStateMsg.buildMsg(m_pm->m_currentDisBreakerState));
|
||||
m_pm->sendNotification(m_currentStateMsg.key, m_currentStateMsg.buildMsg(m_pm->m_pmCurrentState));
|
||||
}
|
||||
// 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;
|
||||
// }
|
||||
// }
|
||||
}
|
||||
+62
-62
@@ -667,69 +667,69 @@ std::string Driver::saveDriverTableToJson(const DriverTable* driverTable)
|
||||
Json::Value root;
|
||||
|
||||
// 添加所有成员到json
|
||||
root["depth1_uni8"] = driverTable->depth1;
|
||||
root["depth2_uni8"] = driverTable->depth2;
|
||||
root["depth3_uni8"] = driverTable->depth3;
|
||||
root["overDeep1_uni8"] = driverTable->overDeep1;
|
||||
root["overDeep2_uni8"] = driverTable->overDeep2;
|
||||
root["ctd1_uni8"] = driverTable->ctd1;
|
||||
root["ctd2_uni8"] = driverTable->ctd2;
|
||||
root["soundVeloc_uni8"] = driverTable->soundVeloc;
|
||||
root["commMast_uni8"] = driverTable->commMast;
|
||||
root["ins_uni8"] = driverTable->ins;
|
||||
root["ntp_uni8"] = driverTable->ntp;
|
||||
root["inputWaterSensor1_uni8"] = driverTable->inputWaterSensor1;
|
||||
root["inputWaterSensor2_uni8"] = driverTable->inputWaterSensor2;
|
||||
root["inputWaterSensor3_uni8"] = driverTable->inputWaterSensor3;
|
||||
root["depth1_uint8"] = driverTable->depth1;
|
||||
root["depth2_uint8"] = driverTable->depth2;
|
||||
root["depth3_uint8"] = driverTable->depth3;
|
||||
root["overDeep1_uint8"] = driverTable->overDeep1;
|
||||
root["overDeep2_uint8"] = driverTable->overDeep2;
|
||||
root["ctd1_uint8"] = driverTable->ctd1;
|
||||
root["ctd2_uint8"] = driverTable->ctd2;
|
||||
root["soundVeloc_uint8"] = driverTable->soundVeloc;
|
||||
root["commMast_uint8"] = driverTable->commMast;
|
||||
root["ins_uint8"] = driverTable->ins;
|
||||
root["ntp_uint8"] = driverTable->ntp;
|
||||
root["inputWaterSensor1_uint8"] = driverTable->inputWaterSensor1;
|
||||
root["inputWaterSensor2_uint8"] = driverTable->inputWaterSensor2;
|
||||
root["inputWaterSensor3_uint8"] = driverTable->inputWaterSensor3;
|
||||
|
||||
root["singleBeamSonar1_uni8"] = driverTable->singleBeamSonar1;
|
||||
root["singleBeamSonar2_uni8"] = driverTable->singleBeamSonar2;
|
||||
root["singleBeamSonar3_uni8"] = driverTable->singleBeamSonar3;
|
||||
root["singleBeamSonar4_uni8"] = driverTable->singleBeamSonar4;
|
||||
root["singleBeamSonar5_uni8"] = driverTable->singleBeamSonar5;
|
||||
root["singleBeamSonar6_uni8"] = driverTable->singleBeamSonar6;
|
||||
root["singleBeamSonar7_uni8"] = driverTable->singleBeamSonar7;
|
||||
root["singleBeamSonar8_uni8"] = driverTable->singleBeamSonar8;
|
||||
root["forwardSonar_uni8"] = driverTable->forwardSonar;
|
||||
root["DVL_uni8"] = driverTable->DVL;
|
||||
root["lowFreqSonar_uni8"] = driverTable->lowFreqSonar;
|
||||
root["USBL_uni8"] = driverTable->USBL;
|
||||
root["bowCover1_uni8"] = driverTable->bowCover1;
|
||||
root["bowCover2_uni8"] = driverTable->bowCover2;
|
||||
root["bowCover3_uni8"] = driverTable->bowCover3;
|
||||
root["bowCover4_uni8"] = driverTable->bowCover4;
|
||||
root["bowCover5_uni8"] = driverTable->bowCover5;
|
||||
root["bowCover6_uni8"] = driverTable->bowCover6;
|
||||
root["bowRudderDeploy_uni8"] = driverTable->bowRudderDeploy;
|
||||
root["bowRudderServo1_uni8"] = driverTable->bowRudderServo1;
|
||||
root["bowRudderServo2_uni8"] = driverTable->bowRudderServo2;
|
||||
root["bowWaterlnet1_uni8"] = driverTable->bowWaterlnet1;
|
||||
root["bowWaterlnet2_uni8"] = driverTable->bowWaterlnet2;
|
||||
root["bowWaterlnet3_uni8"] = driverTable->bowWaterlnet3;
|
||||
root["bowWaterlnet4_uni8"] = driverTable->bowWaterlnet4;
|
||||
root["bowWaterlnet5_uni8"] = driverTable->bowWaterlnet5;
|
||||
root["bowWaterlnet6_uni8"] = driverTable->bowWaterlnet6;
|
||||
root["bowWaterlnet7_uni8"] = driverTable->bowWaterlnet7;
|
||||
root["bowWaterlnet8_uni8"] = driverTable->bowWaterlnet8;
|
||||
root["waterInject_uni8"] = driverTable->waterInject;
|
||||
root["mastLiftingServo_uni8"] = driverTable->mastLiftingServo;
|
||||
root["buoyancyAdjust1_uni8"] = driverTable->buoyancyAdjust1;
|
||||
root["buoyancyAdjust2_uni8"] = driverTable->buoyancyAdjust2;
|
||||
root["buoyancyAdjust3_uni8"] = driverTable->buoyancyAdjust3;
|
||||
root["buoyancyAdjust4_uni8"] = driverTable->buoyancyAdjust4;
|
||||
root["buoyancyAdjust5_uni8"] = driverTable->buoyancyAdjust5;
|
||||
root["sternRudderServo1_uni8"] = driverTable->sternRudderServo1;
|
||||
root["sternRudderServo2_uni8"] = driverTable->sternRudderServo2;
|
||||
root["sternRudderServo3_uni8"] = driverTable->sternRudderServo3;
|
||||
root["sternRudderServo4_uni8"] = driverTable->sternRudderServo4;
|
||||
root["thruster_uni8"] = driverTable->thruster;
|
||||
root["bowThrow_uni8"] = driverTable->bowThrow;
|
||||
root["sternThrow_uni8"] = driverTable->sternThrow;
|
||||
root["photoSensor_uni8"] = driverTable->photoSensor;
|
||||
root["electSensor_uni8"] = driverTable->electSensor;
|
||||
root["launchControler_uni8"] = driverTable->launchControler;
|
||||
root["sideSonar_uni8"] = driverTable->sideSonar;
|
||||
root["buoyage_uni8"] = driverTable->buoyage;
|
||||
root["singleBeamSonar1_uint8"] = driverTable->singleBeamSonar1;
|
||||
root["singleBeamSonar2_uint8"] = driverTable->singleBeamSonar2;
|
||||
root["singleBeamSonar3_uint8"] = driverTable->singleBeamSonar3;
|
||||
root["singleBeamSonar4_uint8"] = driverTable->singleBeamSonar4;
|
||||
root["singleBeamSonar5_uint8"] = driverTable->singleBeamSonar5;
|
||||
root["singleBeamSonar6_uint8"] = driverTable->singleBeamSonar6;
|
||||
root["singleBeamSonar7_uint8"] = driverTable->singleBeamSonar7;
|
||||
root["singleBeamSonar8_uint8"] = driverTable->singleBeamSonar8;
|
||||
root["forwardSonar_uint8"] = driverTable->forwardSonar;
|
||||
root["DVL_uint8"] = driverTable->DVL;
|
||||
root["lowFreqSonar_uint8"] = driverTable->lowFreqSonar;
|
||||
root["USBL_uint8"] = driverTable->USBL;
|
||||
root["bowCover1_uint8"] = driverTable->bowCover1;
|
||||
root["bowCover2_uint8"] = driverTable->bowCover2;
|
||||
root["bowCover3_uint8"] = driverTable->bowCover3;
|
||||
root["bowCover4_uint8"] = driverTable->bowCover4;
|
||||
root["bowCover5_uint8"] = driverTable->bowCover5;
|
||||
root["bowCover6_uint8"] = driverTable->bowCover6;
|
||||
root["bowRudderDeploy_uint8"] = driverTable->bowRudderDeploy;
|
||||
root["bowRudderServo1_uint8"] = driverTable->bowRudderServo1;
|
||||
root["bowRudderServo2_uint8"] = driverTable->bowRudderServo2;
|
||||
root["bowWaterlnet1_uint8"] = driverTable->bowWaterlnet1;
|
||||
root["bowWaterlnet2_uint8"] = driverTable->bowWaterlnet2;
|
||||
root["bowWaterlnet3_uint8"] = driverTable->bowWaterlnet3;
|
||||
root["bowWaterlnet4_uint8"] = driverTable->bowWaterlnet4;
|
||||
root["bowWaterlnet5_uint8"] = driverTable->bowWaterlnet5;
|
||||
root["bowWaterlnet6_uint8"] = driverTable->bowWaterlnet6;
|
||||
root["bowWaterlnet7_uint8"] = driverTable->bowWaterlnet7;
|
||||
root["bowWaterlnet8_uint8"] = driverTable->bowWaterlnet8;
|
||||
root["waterInject_uint8"] = driverTable->waterInject;
|
||||
root["mastLiftingServo_uint8"] = driverTable->mastLiftingServo;
|
||||
root["buoyancyAdjust1_uint8"] = driverTable->buoyancyAdjust1;
|
||||
root["buoyancyAdjust2_uint8"] = driverTable->buoyancyAdjust2;
|
||||
root["buoyancyAdjust3_uint8"] = driverTable->buoyancyAdjust3;
|
||||
root["buoyancyAdjust4_uint8"] = driverTable->buoyancyAdjust4;
|
||||
root["buoyancyAdjust5_uint8"] = driverTable->buoyancyAdjust5;
|
||||
root["sternRudderServo1_uint8"] = driverTable->sternRudderServo1;
|
||||
root["sternRudderServo2_uint8"] = driverTable->sternRudderServo2;
|
||||
root["sternRudderServo3_uint8"] = driverTable->sternRudderServo3;
|
||||
root["sternRudderServo4_uint8"] = driverTable->sternRudderServo4;
|
||||
root["thruster_uint8"] = driverTable->thruster;
|
||||
root["bowThrow_uint8"] = driverTable->bowThrow;
|
||||
root["sternThrow_uint8"] = driverTable->sternThrow;
|
||||
root["photoSensor_uint8"] = driverTable->photoSensor;
|
||||
root["electSensor_uint8"] = driverTable->electSensor;
|
||||
root["launchControler_uint8"] = driverTable->launchControler;
|
||||
root["sideSonar_uint8"] = driverTable->sideSonar;
|
||||
root["buoyage_uint8"] = driverTable->buoyage;
|
||||
return root.toStyledString();
|
||||
}
|
||||
std::string Driver::getDriverTableJson()
|
||||
|
||||
@@ -14,7 +14,10 @@ void PowerManagerFsm::react(TaskStopEvent const &e) {
|
||||
|
||||
void PowerManagerFsm::react(CycleTriggeredEvent const &){
|
||||
// 更新当前设备状态
|
||||
pm->m_currentDriverState = pm->m_currentDriverState;
|
||||
// cout << "CycleTriggeredEvent" << endl;
|
||||
pm->m_currentDriverState = pm->m_subDisSysState;
|
||||
// cout << (int)pm->m_subDisSysState.depth1 << endl;
|
||||
// cout << (int)pm->m_subDisSysState.depth1 << endl;
|
||||
}
|
||||
bool PowerManagerFsm::handPowerProtection(DevCmdExt const &e){
|
||||
if(pm->workCondition > WorkCondition::REMOTE_CONTROL){
|
||||
|
||||
@@ -7,8 +7,9 @@ void StandbyState::entry() {
|
||||
// pm->m_CcuColCmd.powerBatCmd = BatteryCommand::Stop;
|
||||
// 启动流程 仪表电一直设置为启动
|
||||
pm->m_CcuColCmd.powerBatCmd = BatteryCommand::Start;
|
||||
pm->workCondition = WorkCondition::STANDBY;
|
||||
// 启动设备
|
||||
|
||||
pm->workCondition = WorkCondition::STANDBY;
|
||||
pm->m_driver.getSTANDBYTable(&pm->m_subDisSysCmd);
|
||||
|
||||
//
|
||||
|
||||
@@ -0,0 +1,257 @@
|
||||
#include "httpserver.h"
|
||||
#include "index.h"
|
||||
#include "../PowerManger.h"
|
||||
#include "mongoose.h"
|
||||
#include <iostream>
|
||||
#include "json/json.h"
|
||||
|
||||
using json = Json::Value;
|
||||
|
||||
// WebSocket事件处理函数
|
||||
void HttpServer::handleWebSocketEvent(struct mg_connection* c, int ev, void* ev_data, void* fn_data) {
|
||||
HttpServer* server = static_cast<HttpServer*>(fn_data);
|
||||
|
||||
if (ev == MG_EV_OPEN) {
|
||||
// 新连接建立
|
||||
std::lock_guard<std::mutex> lock(server->ws_connections_mutex_);
|
||||
server->ws_connections_.push_back(c);
|
||||
LOG_F(INFO, "WebSocket connection opened: id=%lu fd=%d", c->id, c->fd);
|
||||
} else if (ev == MG_EV_CLOSE || ev == MG_EV_ERROR) {
|
||||
// 连接关闭或错误
|
||||
std::lock_guard<std::mutex> lock(server->ws_connections_mutex_);
|
||||
auto it = std::find(server->ws_connections_.begin(), server->ws_connections_.end(), c);
|
||||
if (it != server->ws_connections_.end()) {
|
||||
LOG_F(ERROR, "WebSocket %s: id=%lu fd=%d",
|
||||
ev == MG_EV_ERROR ? "error" : "closed", c->id, c->fd);
|
||||
server->ws_connections_.erase(it);
|
||||
}
|
||||
} else if (ev == MG_EV_HTTP_MSG) {
|
||||
// HTTP请求处理
|
||||
struct mg_http_message *hm = (struct mg_http_message *) ev_data;
|
||||
if (mg_match(hm->uri, mg_str("/ws"), NULL)) {
|
||||
// 升级到WebSocket连接
|
||||
mg_ws_upgrade(c, hm, nullptr);
|
||||
} else {
|
||||
// 返回主页HTML
|
||||
mg_http_reply(c, 200, "Content-Type: text/html; charset=utf-8\r\n", INDEX_HTML.c_str());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
HttpServer::HttpServer(int port) : port_(port), running_(false) {
|
||||
mg_mgr_init(&mgr_);
|
||||
}
|
||||
|
||||
HttpServer::~HttpServer() {
|
||||
stop();
|
||||
mg_mgr_free(&mgr_);
|
||||
}
|
||||
|
||||
bool HttpServer::serverThreadCB(void* pParam) {
|
||||
HttpServer* pThis = static_cast<HttpServer*>(pParam);
|
||||
return pThis->serverThreadFunc();
|
||||
}
|
||||
|
||||
bool HttpServer::serverThreadFunc() {
|
||||
while(running_) {
|
||||
mg_mgr_poll(&mgr_, 1000);
|
||||
|
||||
// 定期推送系统数据
|
||||
static uint64_t last_push_time = 0;
|
||||
uint64_t now = mg_millis();
|
||||
if (now - last_push_time > 1000) { // 每秒推送一次
|
||||
last_push_time = now;
|
||||
pushSystemData();
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
void HttpServer::pushSystemData() {
|
||||
if (!m_systemData) return;
|
||||
// 序列化系统数据为JSON
|
||||
json j;
|
||||
//燃料电池系统参数
|
||||
j["fc_mode"] = Json::Value(m_systemData->fc_mode); // 燃料电池系统运行模式:00H-无效, 01H-调试, 02H-自动, 03H-补给
|
||||
j["fc_status"] = Json::Value(m_systemData->fc_status); // 燃料电池状态:00H-无效, 01H-初始化, ..., 0DH-维护完成
|
||||
j["fc_fault_level"] = Json::Value(m_systemData->fc_fault_level);
|
||||
|
||||
//功率和时间参数
|
||||
j["output_power_limit"] = Json::Value(m_systemData->output_power_limit); // 系统输出功率限制值,单位:W
|
||||
j["total_generation_time"] = Json::Value(m_systemData->total_generation_time); // 系统累计发电时间,单位:0.1小时
|
||||
j["total_generation_power"] = Json::Value(m_systemData->total_generation_power); // 系统累计发电功率,单位:W
|
||||
|
||||
//燃料电池故障信息
|
||||
j["fc_fault_level_1"] = Json::Value(m_systemData->fc_fault_level_1);
|
||||
j["fc_fault_level_2"] = Json::Value(m_systemData->fc_fault_level_2);
|
||||
j["fc_fault_level_3"] = Json::Value(m_systemData->fc_fault_level_3);
|
||||
j["fc_fault_level_4"] = Json::Value(m_systemData->fc_fault_level_4);
|
||||
|
||||
//燃料容量
|
||||
j["hydrogen_capacity"] = Json::Value(m_systemData->hydrogen_capacity); // 储氢罐剩余容量百分比,单位:%
|
||||
j["liquid_oxygen_capacity"] = Json::Value(m_systemData->liquid_oxygen_capacity); // 液氧罐剩余容量百分比,单位:%
|
||||
|
||||
//温度压力参数
|
||||
j["palladium_temp"] = Json::Value(m_systemData->palladium_temp); // 钯膜最高温度,单位:℃
|
||||
j["main_pipe_pressure"] = Json::Value(m_systemData->main_pipe_pressure); // 主水路压力,单位:0.01kPa
|
||||
j["aux_pipe_pressure"] = Json::Value(m_systemData->aux_pipe_pressure); // 辅水路压力,单位:0.01kPa
|
||||
|
||||
//舱室环境参数
|
||||
j["cabin_pressure1"] = Json::Value(m_systemData->cabin_pressure1); // 舱室1压力,单位:0.01kPa
|
||||
j["cabin_pressure2"] = Json::Value(m_systemData->cabin_pressure2); // 舱室2压力,单位:0.01kPa
|
||||
j["cabin_temp1"] = Json::Value(m_systemData->cabin_temp1); // 舱室1温度,单位:0.01℃
|
||||
j["cabin_temp2"] = Json::Value(m_systemData->cabin_temp2); // 舱室2温度,单位:0.01℃
|
||||
j["cabin_humidity1"] = Json::Value(m_systemData->cabin_humidity1); // 舱室1湿度,单位:0.01%RH
|
||||
j["cabin_humidity2"] = Json::Value(m_systemData->cabin_humidity2); // 舱室2湿度,单位:0.01%RH
|
||||
|
||||
//火焰探测器
|
||||
j["flame_detector1"] = Json::Value(m_systemData->flame_detector1); // 火焰探测器1状态:00H-无效, 01H-报警, 02H-故障
|
||||
j["flame_detector2"] = Json::Value(m_systemData->flame_detector2); // 火焰探测器2状态:00H-无效, 01H-报警, 02H-故障
|
||||
|
||||
//气体浓度
|
||||
j["h2_concentration1"] = Json::Value(m_systemData->h2_concentration1); // 舱室H2浓度1,单位:0.01% LEL
|
||||
j["h2_concentration2"] = Json::Value(m_systemData->h2_concentration2); // 舱室H2浓度2,单位:0.01% LEL
|
||||
j["h2_concentration3"] = Json::Value(m_systemData->h2_concentration3); // 舱室H2浓度3,单位:0.01% LEL
|
||||
j["o2_concentration1"] = Json::Value(m_systemData->o2_concentration1); // 舱室O2浓度1,单位:0.01% LEL
|
||||
j["o2_concentration2"] = Json::Value(m_systemData->o2_concentration2); // 舱室O2浓度2,单位:0.01% LEL
|
||||
j["ch3oh_concentration1"] = Json::Value(m_systemData->ch3oh_concentration1); // 舱室甲醇气体浓度1,单位:0.01% LEL
|
||||
j["ch3oh_concentration2"] = Json::Value(m_systemData->ch3oh_concentration2); // 舱室甲醇气体浓度2,单位:0.01% LEL
|
||||
|
||||
//保留字段
|
||||
j["cabin_ox_concentration"] = Json::Value(m_systemData->cabin_ox_concentration); // 仪表舱内氧气浓度,单位:0.1%
|
||||
j["cabin_temperature"] = Json::Value(m_systemData->cabin_temperature); // 仪表舱内温度,单位:0.1℃
|
||||
j["cabin_humidity"] = Json::Value(m_systemData->cabin_humidity); // 仪表舱内湿度,单位:0.1%RH
|
||||
j["cabin_pressure"] = Json::Value(m_systemData->cabin_pressure); // 仪表舱内大气压,单位:0.2kPa
|
||||
|
||||
//动力舱参数
|
||||
j["power_cabin_ox_concentration"] = Json::Value(m_systemData->power_cabin_ox_concentration); // 动力舱内氧气浓度,单位:0.1%
|
||||
j["power_cabin_temperature"] = Json::Value(m_systemData->power_cabin_temperature); // 动力舱内温度,单位:0.1℃
|
||||
j["power_cabin_humidity"] = Json::Value(m_systemData->power_cabin_humidity); // 动力舱内湿度,单位:0.1%RH
|
||||
j["power_cabin_pressure"] = Json::Value(m_systemData->power_cabin_pressure); // 动力舱内大气压,单位:0.2kPa
|
||||
|
||||
//电池报警标志
|
||||
// uint8_t dyn_alarm_flag[6]; // 动力锂电池报警标志
|
||||
// uint8_t ins_alarm_flag[6]; // 仪表锂电池报警标志
|
||||
j["dyn_alarm_flag1"] = Json::Value(m_systemData->dyn_alarm_flag[0]);
|
||||
j["dyn_alarm_flag2"] = Json::Value(m_systemData->dyn_alarm_flag[1]);
|
||||
j["dyn_alarm_flag3"] = Json::Value(m_systemData->dyn_alarm_flag[2]);
|
||||
j["dyn_alarm_flag4"] = Json::Value(m_systemData->dyn_alarm_flag[3]);
|
||||
j["dyn_alarm_flag5"] = Json::Value(m_systemData->dyn_alarm_flag[4]);
|
||||
j["dyn_alarm_flag6"] = Json::Value(m_systemData->dyn_alarm_flag[5]);
|
||||
|
||||
j["ins_alarm_flag1"] = Json::Value(m_systemData->ins_alarm_flag[0]);
|
||||
j["ins_alarm_flag2"] = Json::Value(m_systemData->ins_alarm_flag[1]);
|
||||
j["ins_alarm_flag3"] = Json::Value(m_systemData->ins_alarm_flag[2]);
|
||||
j["ins_alarm_flag4"] = Json::Value(m_systemData->ins_alarm_flag[3]);
|
||||
j["ins_alarm_flag5"] = Json::Value(m_systemData->ins_alarm_flag[4]);
|
||||
j["ins_alarm_flag6"] = Json::Value(m_systemData->ins_alarm_flag[5]);
|
||||
|
||||
//继电器状态
|
||||
j["ins_relay_status1"] = Json::Value(m_systemData->ins_relay_status1); // 仪表电池继电器状态
|
||||
j["ins_relay_status2"] = Json::Value(m_systemData->ins_relay_status2); // 仪表电池预充继电器和负极继电器状态
|
||||
j["dyn_relay_status1"] = Json::Value(m_systemData->dyn_relay_status1); // 动力电池正极与充电继电器状态
|
||||
j["dyn_relay_status2"] = Json::Value(m_systemData->dyn_relay_status2); // 动力电池预充与负极继电器状态
|
||||
|
||||
//电池功率参数
|
||||
j["ins_max_discharge_power"] = Json::Value(m_systemData->ins_max_discharge_power); // 仪表电池最大允许放电功率,单位:0.05kW
|
||||
j["dyn_max_discharge_power"] = Json::Value(m_systemData->dyn_max_discharge_power); // 动力电池最大允许放电功率,单位:0.05kW
|
||||
|
||||
//电池SOC
|
||||
j["ins_soc"] = Json::Value(m_systemData->ins_soc); // 仪表电池SOC,单位:0.1%
|
||||
j["dyn_soc"] = Json::Value(m_systemData->dyn_soc); // 动力电池SOC,单位:0.1%
|
||||
|
||||
//电池能量
|
||||
j["ins_total_energy"] = Json::Value(m_systemData->ins_total_energy); // 仪表电池能量,单位:0.01kWh
|
||||
j["dyn_total_energy"] = Json::Value(m_systemData->dyn_total_energy); // 动力电池能量,单位:0.01kWh
|
||||
|
||||
//电池输入功率
|
||||
j["ins_power_input"] = Json::Value(m_systemData->ins_power_input);
|
||||
j["dyn_power_input"] = Json::Value(m_systemData->dyn_power_input);
|
||||
|
||||
//电池电压电流
|
||||
j["ins_voltage_link"] = Json::Value(m_systemData->ins_voltage_link); // 仪表电池LINK端电压,单位:0.01V
|
||||
j["ins_voltage_pack"] = Json::Value(m_systemData->ins_voltage_pack); // 仪表电池PACK端电压,单位:0.01V
|
||||
j["ins_current"] = Json::Value(m_systemData->ins_current); // 仪表电池电流,单位:0.01A
|
||||
j["ins_resistance_pos"] = Json::Value(m_systemData->ins_resistance_pos); // 仪表电池正极绝缘电阻,单位:kΩ
|
||||
j["ins_resistance_neg"] = Json::Value(m_systemData->ins_resistance_neg); // 仪表电池负极绝缘电阻,单位:kΩ
|
||||
j["dyn_voltage_link"] = Json::Value(m_systemData->dyn_voltage_link); // 动力电池LINK端电压,单位:0.01V
|
||||
j["dyn_voltage_pack"] = Json::Value(m_systemData->dyn_voltage_pack); // 动力电池PACK端电压,单位:0.01V
|
||||
j["dyn_current"] = Json::Value(m_systemData->dyn_current); // 动力电池电流,单位:0.05A
|
||||
j["dyn_resistance_pos"] = Json::Value(m_systemData->dyn_resistance_pos); // 动力电池正极绝缘电阻,单位:kΩ
|
||||
j["dyn_resistance_neg"] = Json::Value(m_systemData->dyn_resistance_neg); // 动力电池负极绝缘电阻,单位:kΩ
|
||||
|
||||
|
||||
//紧急状态
|
||||
j["ins_emergency_status"] = Json::Value(m_systemData->ins_emergency_status); // 紧急状态:00H-无紧急, 01H-紧急
|
||||
j["dyn_emergency_status"] = Json::Value(m_systemData->dyn_emergency_status); // 紧急状态:00H-无紧急, 01H-紧急
|
||||
|
||||
j["ins_soc_threshold1"] = Json::Value(m_systemData->ins_soc_threshold1); // 仪表电池1 SOC门限
|
||||
j["ins_soc_threshold2"] = Json::Value(m_systemData->ins_soc_threshold2); // 仪表电池2 SOC门限
|
||||
j["ins_soc_threshold3"] = Json::Value(m_systemData->ins_soc_threshold3); // 仪表电池3 SOC门限
|
||||
j["dyn_soc_threshold1"] = Json::Value(m_systemData->dyn_soc_threshold1); // 动力电池1 SOC门限
|
||||
j["dyn_soc_threshold2"] = Json::Value(m_systemData->dyn_soc_threshold2); // 动力电池2 SOC门限
|
||||
j["dyn_soc_threshold3"] = Json::Value(m_systemData->dyn_soc_threshold3); // 动力电池3 SOC门限
|
||||
j["ins_power_limit1"] = Json::Value(m_systemData->ins_power_limit1); // 仪表电池1功率限制值
|
||||
j["ins_power_limit2"] = Json::Value(m_systemData->ins_power_limit2); // 仪表电池2功率限制值
|
||||
j["dyn_power_limit1"] = Json::Value(m_systemData->dyn_power_limit1); // 动力电池1功率限制值
|
||||
j["dyn_power_limit2"] = Json::Value(m_systemData->dyn_power_limit2); // 动力电池2功率限制值
|
||||
|
||||
//设备在线状态
|
||||
j["device_online_flag1"] = Json::Value(m_systemData->device_online_flag1);
|
||||
j["device_online_flag2"] = Json::Value(m_systemData->device_online_flag2);
|
||||
|
||||
//复合管控器心跳计算器
|
||||
j["heartbeat"] = Json::Value(m_systemData->heartbeat);
|
||||
|
||||
// 时间戳
|
||||
j["timestamp"] = Json::Value((Json::UInt64)mg_millis());
|
||||
|
||||
Json::StreamWriterBuilder builder;
|
||||
std::string msg = Json::writeString(builder, j);
|
||||
|
||||
// 发送给所有WebSocket客户端
|
||||
std::lock_guard<std::mutex> lock(ws_connections_mutex_);
|
||||
for (auto c : ws_connections_) {
|
||||
mg_ws_send(c, msg.c_str(), msg.size(), WEBSOCKET_OP_TEXT);
|
||||
}
|
||||
}
|
||||
|
||||
void HttpServer::start() {
|
||||
if (running_) return;
|
||||
|
||||
std::string addr = "http://0.0.0.0:" + std::to_string(port_);
|
||||
mg_http_listen(&mgr_, addr.c_str(), [](mg_connection *c, int ev, void *ev_data) {
|
||||
HttpServer* server = static_cast<HttpServer*>(c->fn_data);
|
||||
if (server) {
|
||||
server->handleWebSocketEvent(c, ev, ev_data, c->fn_data);
|
||||
}
|
||||
}, this);
|
||||
|
||||
running_ = true;
|
||||
m_ServerThread.Initialise(serverThreadCB, this);
|
||||
m_ServerThread.Start();
|
||||
|
||||
std::cout << "HTTP server started on " << addr << std::endl;
|
||||
LOG_F(INFO, "HTTP server started on %s", addr.c_str());
|
||||
}
|
||||
|
||||
void HttpServer::stop() {
|
||||
if (!running_) return;
|
||||
|
||||
running_ = false;
|
||||
m_ServerThread.Stop();
|
||||
|
||||
// 关闭所有WebSocket连接
|
||||
std::lock_guard<std::mutex> lock(ws_connections_mutex_);
|
||||
for (auto c : ws_connections_) {
|
||||
mg_ws_send(c, "", 0, WEBSOCKET_OP_CLOSE);
|
||||
}
|
||||
ws_connections_.clear();
|
||||
|
||||
std::cout << "HTTP server stopped" << std::endl;
|
||||
}
|
||||
|
||||
bool HttpServer::isRunning() const {
|
||||
return running_;
|
||||
}
|
||||
|
||||
@@ -0,0 +1,57 @@
|
||||
#ifndef HTTP_SERVER_H
|
||||
#define HTTP_SERVER_H
|
||||
#include "MOOS/libMOOS/Utils/MOOSThread.h"
|
||||
#include "mongoose.h"
|
||||
#include "../loguru.hpp"
|
||||
#include "../systemData.h"
|
||||
#include <vector>
|
||||
#include <mutex>
|
||||
#include <unordered_map>
|
||||
class PowerManger; // 前向声明
|
||||
|
||||
class HttpServer {
|
||||
public:
|
||||
// 构造函数,传入PowerManger指针和端口号
|
||||
explicit HttpServer(int port = 8000);
|
||||
|
||||
// 析构函数
|
||||
~HttpServer();
|
||||
|
||||
// 启动HTTP服务器线程
|
||||
void start();
|
||||
|
||||
// 停止HTTP服务器线程
|
||||
void stop();
|
||||
|
||||
// 检查服务器是否正在运行
|
||||
bool isRunning() const;
|
||||
|
||||
// 设置系统数据
|
||||
void setSystemData(SystemData* systemData){
|
||||
m_systemData = systemData;
|
||||
}
|
||||
|
||||
// 推送系统数据到所有WebSocket客户端
|
||||
void pushSystemData();
|
||||
|
||||
private:
|
||||
// WebSocket事件处理函数
|
||||
static void handleWebSocketEvent(struct mg_connection* c, int ev, void* ev_data, void* fn_data);
|
||||
|
||||
// 线程回调函数
|
||||
static bool serverThreadCB(void* pParam);
|
||||
bool serverThreadFunc();
|
||||
|
||||
// 后台系统数据
|
||||
SystemData *m_systemData = nullptr;
|
||||
|
||||
struct mg_mgr mgr_; // Mongoose管理器
|
||||
int port_; // 监听端口
|
||||
bool running_; // 运行状态标志
|
||||
CMOOSThread m_ServerThread; // 服务器线程
|
||||
std::mutex ws_connections_mutex_; // WebSocket连接锁
|
||||
std::vector<mg_connection*> ws_connections_; // WebSocket连接列表
|
||||
std::unordered_map<mg_connection*, uint64_t> ws_last_io_time_; // 连接最后活动时间
|
||||
};
|
||||
|
||||
#endif // HTTP_SERVER_H
|
||||
@@ -0,0 +1,616 @@
|
||||
#ifndef HTTP_SERVER_INDEX_H
|
||||
#define HTTP_SERVER_INDEX_H
|
||||
|
||||
#include <string>
|
||||
|
||||
const std::string INDEX_HTML = R"(
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<title>Power Manager</title>
|
||||
<link rel="stylesheet" href="/static/style.css">
|
||||
<style>
|
||||
.data-item {
|
||||
margin: 10px 0;
|
||||
padding: 8px;
|
||||
background: #f5f5f5;
|
||||
border-radius: 4px;
|
||||
}
|
||||
.data-label {
|
||||
font-weight: bold;
|
||||
margin-right: 10px;
|
||||
}
|
||||
.collapsible {
|
||||
background-color: #eee;
|
||||
color: #444;
|
||||
cursor: pointer;
|
||||
padding: 10px;
|
||||
width: 100%;
|
||||
border: none;
|
||||
text-align: left;
|
||||
outline: none;
|
||||
font-size: 15px;
|
||||
margin-top: 10px;
|
||||
}
|
||||
.active, .collapsible:hover {
|
||||
background-color: #ccc;
|
||||
}
|
||||
.content {
|
||||
padding: 0 18px;
|
||||
display: none;
|
||||
overflow: hidden;
|
||||
background-color: #f9f9f9;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<h1>Power Manager System</h1>
|
||||
|
||||
<button class="collapsible">燃料电池系统状态</button>
|
||||
<div class="content">
|
||||
<div class="system-data-grid">
|
||||
<div class="data-item">
|
||||
<span class="data-label">FC模式:</span>
|
||||
<span class="data-value" id="fc-mode">正在加载...</span>
|
||||
</div>
|
||||
<div class="data-item">
|
||||
<span class="data-label">FC状态:</span>
|
||||
<span class="data-value" id="fc-status">正在加载...</span>
|
||||
</div>
|
||||
<div class="data-item">
|
||||
<span class="data-label">故障等级:</span>
|
||||
<span class="data-value" id="fc-fault-level">正在加载...</span>
|
||||
</div>
|
||||
<div class="data-item">
|
||||
<span class="data-label">输出功率限制:</span>
|
||||
<span class="data-value" id="output-power-limit">正在加载...</span>
|
||||
</div>
|
||||
<div class="data-item">
|
||||
<span class="data-label">累计发电时间:</span>
|
||||
<span class="data-value" id="total-generation-time">正在加载...</span>
|
||||
</div>
|
||||
<div class="data-item">
|
||||
<span class="data-label">累计发电功率:</span>
|
||||
<span class="data-value" id="total-generation-power">正在加载...</span>
|
||||
</div>
|
||||
<div class="data-item">
|
||||
<span class="data-label">FC故障等级1:</span>
|
||||
<span class="data-value" id="fc-fault-level-1">正在加载...</span>
|
||||
</div>
|
||||
<div class="data-item">
|
||||
<span class="data-label">FC故障等级2:</span>
|
||||
<span class="data-value" id="fc-fault-level-2">正在加载...</span>
|
||||
</div>
|
||||
<div class="data-item">
|
||||
<span class="data-label">FC故障等级3:</span>
|
||||
<span class="data-value" id="fc-fault-level-3">正在加载...</span>
|
||||
</div>
|
||||
<div class="data-item">
|
||||
<span class="data-label">FC故障等级4:</span>
|
||||
<span class="data-value" id="fc-fault-level-4">正在加载...</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<button class="collapsible">燃料和容量</button>
|
||||
<div class="content">
|
||||
<div class="system-data-grid">
|
||||
<div class="data-item">
|
||||
<span class="data-label">氢容量:</span>
|
||||
<span class="data-value" id="hydrogen-capacity">正在加载...</span>
|
||||
</div>
|
||||
<div class="data-item">
|
||||
<span class="data-label">液氧容量:</span>
|
||||
<span class="data-value" id="liquid-oxygen-capacity">正在加载...</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<button class="collapsible">燃料电池温度压力参数</button>
|
||||
<div class="content">
|
||||
<div class="system-data-grid">
|
||||
<div class="data-item">
|
||||
<span class="data-label">钯膜温度:</span>
|
||||
<span class="data-value" id="palladium-temp">正在加载...</span>
|
||||
</div>
|
||||
<div class="data-item">
|
||||
<span class="data-label">主水路压力:</span>
|
||||
<span class="data-value" id="main-pipe-pressure">正在加载...</span>
|
||||
</div>
|
||||
<div class="data-item">
|
||||
<span class="data-label">辅水路压力:</span>
|
||||
<span class="data-value" id="aux-pipe-pressure">正在加载...</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<button class="collapsible">锂电池舱室环境</button>
|
||||
<div class="content">
|
||||
<div class="system-data-grid">
|
||||
<div class="data-item">
|
||||
<span class="data-label">仪表舱室压力:</span>
|
||||
<span class="data-value" id="cabin-pressure1">正在加载...</span>
|
||||
</div>
|
||||
<div class="data-item">
|
||||
<span class="data-label">动力舱室压力:</span>
|
||||
<span class="data-value" id="cabin-pressure2">正在加载...</span>
|
||||
</div>
|
||||
<div class="data-item">
|
||||
<span class="data-label">仪表舱室温度:</span>
|
||||
<span class="data-value" id="cabin-temp1">正在加载...</span>
|
||||
</div>
|
||||
<div class="data-item">
|
||||
<span class="data-label">动力舱室温度:</span>
|
||||
<span class="data-value" id="cabin-temp2">正在加载...</span>
|
||||
</div>
|
||||
<div class="data-item">
|
||||
<span class="data-label">仪表舱室湿度:</span>
|
||||
<span class="data-value" id="cabin-humidity1">正在加载...</span>
|
||||
</div>
|
||||
<div class="data-item">
|
||||
<span class="data-label">动力舱室湿度:</span>
|
||||
<span class="data-value" id="cabin-humidity2">正在加载...</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<button class="collapsible">燃料电池气体浓度</button>
|
||||
<div class="content">
|
||||
<div class="system-data-grid">
|
||||
<div class="data-item">
|
||||
<span class="data-label">H2浓度1:</span>
|
||||
<span class="data-value" id="h2-concentration1">正在加载...</span>
|
||||
</div>
|
||||
<div class="data-item">
|
||||
<span class="data-label">H2浓度2:</span>
|
||||
<span class="data-value" id="h2-concentration2">正在加载...</span>
|
||||
</div>
|
||||
<div class="data-item">
|
||||
<span class="data-label">H2浓度3:</span>
|
||||
<span class="data-value" id="h2-concentration3">正在加载...</span>
|
||||
</div>
|
||||
<div class="data-item">
|
||||
<span class="data-label">O2浓度1:</span>
|
||||
<span class="data-value" id="o2-concentration1">正在加载...</span>
|
||||
</div>
|
||||
<div class="data-item">
|
||||
<span class="data-label">O2浓度2:</span>
|
||||
<span class="data-value" id="o2-concentration2">正在加载...</span>
|
||||
</div>
|
||||
<div class="data-item">
|
||||
<span class="data-label">甲醇浓度1:</span>
|
||||
<span class="data-value" id="ch3oh-concentration1">正在加载...</span>
|
||||
</div>
|
||||
<div class="data-item">
|
||||
<span class="data-label">甲醇浓度2:</span>
|
||||
<span class="data-value" id="ch3oh-concentration2">正在加载...</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<button class="collapsible">电池系统</button>
|
||||
<div class="content">
|
||||
<div class="system-data-grid">
|
||||
<div class="data-item">
|
||||
<span class="data-label">仪表电池SOC:</span>
|
||||
<span class="data-value" id="ins-soc">正在加载...</span>
|
||||
</div>
|
||||
<div class="data-item">
|
||||
<span class="data-label">动力电池SOC:</span>
|
||||
<span class="data-value" id="dyn-soc">正在加载...</span>
|
||||
</div>
|
||||
<div class="data-item">
|
||||
<span class="data-label">仪表电池电压:</span>
|
||||
<span class="data-value" id="ins-voltage-link">正在加载...</span>
|
||||
</div>
|
||||
<div class="data-item">
|
||||
<span class="data-label">动力电池电压:</span>
|
||||
<span class="data-value" id="dyn-voltage-link">正在加载...</span>
|
||||
</div>
|
||||
<div class="data-item">
|
||||
<span class="data-label">仪表电池电流:</span>
|
||||
<span class="data-value" id="ins-current">正在加载...</span>
|
||||
</div>
|
||||
<div class="data-item">
|
||||
<span class="data-label">动力电池电流:</span>
|
||||
<span class="data-value" id="dyn-current">正在加载...</span>
|
||||
</div>
|
||||
<div class="data-item">
|
||||
<span class="data-label">仪表电池能量:</span>
|
||||
<span class="data-value" id="ins-total-energy">正在加载...</span>
|
||||
</div>
|
||||
<div class="data-item">
|
||||
<span class="data-label">动力电池能量:</span>
|
||||
<span class="data-value" id="dyn-total-energy">正在加载...</span>
|
||||
</div>
|
||||
<div class="data-item">
|
||||
<span class="data-label">仪表电池输入功率:</span>
|
||||
<span class="data-value" id="ins-power-input">正在加载...</span>
|
||||
</div>
|
||||
<div class="data-item">
|
||||
<span class="data-label">动力电池输入功率:</span>
|
||||
<span class="data-value" id="dyn-power-input">正在加载...</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<button class="collapsible">继电器状态</button>
|
||||
<div class="content">
|
||||
<div class="system-data-grid">
|
||||
<div class="data-item">
|
||||
<span class="data-label">仪表继电器1:</span>
|
||||
<span class="data-value" id="ins-relay-status1">正在加载...</span>
|
||||
</div>
|
||||
<div class="data-item">
|
||||
<span class="data-label">仪表继电器2:</span>
|
||||
<span class="data-value" id="ins-relay-status2">正在加载...</span>
|
||||
</div>
|
||||
<div class="data-item">
|
||||
<span class="data-label">动力继电器1:</span>
|
||||
<span class="data-value" id="dyn-relay-status1">正在加载...</span>
|
||||
</div>
|
||||
<div class="data-item">
|
||||
<span class="data-label">动力继电器2:</span>
|
||||
<span class="data-value" id="dyn-relay-status2">正在加载...</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<button class="collapsible">锂电池报警标志</button>
|
||||
<div class="content">
|
||||
<div class="system-data-grid">
|
||||
<div class="data-item">
|
||||
<span class="data-label">动力报警标志1:</span>
|
||||
<span class="data-value" id="dyn-alarm-flag1">正在加载...</span>
|
||||
</div>
|
||||
<div class="data-item">
|
||||
<span class="data-label">动力报警标志2:</span>
|
||||
<span class="data-value" id="dyn-alarm-flag2">正在加载...</span>
|
||||
</div>
|
||||
<div class="data-item">
|
||||
<span class="data-label">动力报警标志3:</span>
|
||||
<span class="data-value" id="dyn-alarm-flag3">正在加载...</span>
|
||||
</div>
|
||||
<div class="data-item">
|
||||
<span class="data-label">动力报警标志4:</span>
|
||||
<span class="data-value" id="dyn-alarm-flag4">正在加载...</span>
|
||||
</div>
|
||||
<div class="data-item">
|
||||
<span class="data-label">动力报警标志5:</span>
|
||||
<span class="data-value" id="dyn-alarm-flag5">正在加载...</span>
|
||||
</div>
|
||||
<div class="data-item">
|
||||
<span class="data-label">动力报警标志6:</span>
|
||||
<span class="data-value" id="dyn-alarm-flag6">正在加载...</span>
|
||||
</div>
|
||||
<div class="data-item">
|
||||
<span class="data-label">仪表报警标志1:</span>
|
||||
<span class="data-value" id="ins-alarm-flag1">正在加载...</span>
|
||||
</div>
|
||||
<div class="data-item">
|
||||
<span class="data-label">仪表报警标志2:</span>
|
||||
<span class="data-value" id="ins-alarm-flag2">正在加载...</span>
|
||||
</div>
|
||||
<div class="data-item">
|
||||
<span class="data-label">仪表报警标志3:</span>
|
||||
<span class="data-value" id="ins-alarm-flag3">正在加载...</span>
|
||||
</div>
|
||||
<div class="data-item">
|
||||
<span class="data-label">仪表报警标志4:</span>
|
||||
<span class="data-value" id="ins-alarm-flag4">正在加载...</span>
|
||||
</div>
|
||||
<div class="data-item">
|
||||
<span class="data-label">仪表报警标志5:</span>
|
||||
<span class="data-value" id="ins-alarm-flag5">正在加载...</span>
|
||||
</div>
|
||||
<div class="data-item">
|
||||
<span class="data-label">仪表报警标志6:</span>
|
||||
<span class="data-value" id="ins-alarm-flag6">正在加载...</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<button class="collapsible">其他系统参数</button>
|
||||
<div class="content">
|
||||
<div class="system-data-grid">
|
||||
<div class="data-item">
|
||||
<span class="data-label">设备在线标志1:</span>
|
||||
<span class="data-value" id="device-online-flag1">正在加载...</span>
|
||||
</div>
|
||||
<div class="data-item">
|
||||
<span class="data-label">设备在线标志2:</span>
|
||||
<span class="data-value" id="device-online-flag2">正在加载...</span>
|
||||
</div>
|
||||
<div class="data-item">
|
||||
<span class="data-label">心跳计数器:</span>
|
||||
<span class="data-value" id="heartbeat">正在加载...</span>
|
||||
</div>
|
||||
<div class="data-item">
|
||||
<span class="data-label">时间戳:</span>
|
||||
<span class="data-value" id="timestamp">正在加载...</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<script>
|
||||
// WebSocket连接
|
||||
let ws = null;
|
||||
|
||||
// 初始化WebSocket连接
|
||||
function initWebSocket() {
|
||||
ws = new WebSocket('ws://' + window.location.host + '/ws');
|
||||
|
||||
ws.onopen = () => {
|
||||
console.log('WebSocket连接已建立');
|
||||
};
|
||||
|
||||
ws.onmessage = (event) => {
|
||||
const data = JSON.parse(event.data);
|
||||
updateSystemData(data);
|
||||
};
|
||||
|
||||
ws.onclose = () => {
|
||||
console.log('WebSocket连接已关闭');
|
||||
setTimeout(initWebSocket, 5000); // 5秒后重连
|
||||
};
|
||||
|
||||
ws.onerror = (error) => {
|
||||
console.error('WebSocket错误:', error);
|
||||
};
|
||||
}
|
||||
|
||||
// 更新系统数据
|
||||
function updateSystemData(data) {
|
||||
// 燃料电池数据
|
||||
if (data.fc_mode !== undefined) {
|
||||
document.getElementById('fc-mode').textContent = getFCModeText(data.fc_mode);
|
||||
}
|
||||
if (data.fc_status !== undefined) {
|
||||
document.getElementById('fc-status').textContent = getFCStatusText(data.fc_status);
|
||||
}
|
||||
if (data.fc_fault_level !== undefined) {
|
||||
document.getElementById('fc-fault-level').textContent = data.fc_fault_level;
|
||||
}
|
||||
if (data.output_power_limit !== undefined) {
|
||||
document.getElementById('output-power-limit').textContent = data.output_power_limit + ' W';
|
||||
}
|
||||
if (data.total_generation_time !== undefined) {
|
||||
document.getElementById('total-generation-time').textContent = (data.total_generation_time).toFixed(1) + ' 小时';
|
||||
}
|
||||
if (data.total_generation_power !== undefined) {
|
||||
document.getElementById('total-generation-power').textContent = data.total_generation_power + ' W';
|
||||
}
|
||||
if (data.fc_fault_level_1 !== undefined) {
|
||||
document.getElementById('fc-fault-level-1').textContent = data.fc_fault_level_1;
|
||||
}
|
||||
if (data.fc_fault_level_2 !== undefined) {
|
||||
document.getElementById('fc-fault-level-2').textContent = data.fc_fault_level_2;
|
||||
}
|
||||
if (data.fc_fault_level_3 !== undefined) {
|
||||
document.getElementById('fc-fault-level-3').textContent = data.fc_fault_level_3;
|
||||
}
|
||||
if (data.fc_fault_level_4 !== undefined) {
|
||||
document.getElementById('fc-fault-level-4').textContent = data.fc_fault_level_4;
|
||||
}
|
||||
|
||||
// 燃料容量
|
||||
if (data.hydrogen_capacity !== undefined) {
|
||||
document.getElementById('hydrogen-capacity').textContent = data.hydrogen_capacity + '%';
|
||||
}
|
||||
if (data.liquid_oxygen_capacity !== undefined) {
|
||||
document.getElementById('liquid-oxygen-capacity').textContent = data.liquid_oxygen_capacity + '%';
|
||||
}
|
||||
|
||||
// 温度压力参数
|
||||
if (data.palladium_temp !== undefined) {
|
||||
document.getElementById('palladium-temp').textContent = data.palladium_temp + ' ℃';
|
||||
}
|
||||
if (data.main_pipe_pressure !== undefined) {
|
||||
document.getElementById('main-pipe-pressure').textContent = (data.main_pipe_pressure).toFixed(2) + ' kPa';
|
||||
}
|
||||
if (data.aux_pipe_pressure !== undefined) {
|
||||
document.getElementById('aux-pipe-pressure').textContent = (data.aux_pipe_pressure).toFixed(2) + ' kPa';
|
||||
}
|
||||
|
||||
// 舱室环境
|
||||
if (data.cabin_pressure1 !== undefined) {
|
||||
document.getElementById('cabin-pressure1').textContent = (data.cabin_pressure1).toFixed(2) + ' kPa';
|
||||
}
|
||||
if (data.cabin_pressure2 !== undefined) {
|
||||
document.getElementById('cabin-pressure2').textContent = (data.cabin_pressure2).toFixed(2) + ' kPa';
|
||||
}
|
||||
if (data.cabin_temp1 !== undefined) {
|
||||
document.getElementById('cabin-temp1').textContent = data.cabin_temp1 + ' ℃';
|
||||
}
|
||||
if (data.cabin_temp2 !== undefined) {
|
||||
document.getElementById('cabin-temp2').textContent = data.cabin_temp2 + ' ℃';
|
||||
}
|
||||
if (data.cabin_humidity1 !== undefined) {
|
||||
document.getElementById('cabin-humidity1').textContent = data.cabin_humidity1 + '%';
|
||||
}
|
||||
if (data.cabin_humidity2 !== undefined) {
|
||||
document.getElementById('cabin-humidity2').textContent = data.cabin_humidity2 + '%';
|
||||
}
|
||||
|
||||
// 气体浓度
|
||||
if (data.h2_concentration1 !== undefined) {
|
||||
document.getElementById('h2-concentration1').textContent = data.h2_concentration1 + ' ppm';
|
||||
}
|
||||
if (data.h2_concentration2 !== undefined) {
|
||||
document.getElementById('h2-concentration2').textContent = data.h2_concentration2 + ' ppm';
|
||||
}
|
||||
if (data.h2_concentration3 !== undefined) {
|
||||
document.getElementById('h2-concentration3').textContent = data.h2_concentration3 + ' ppm';
|
||||
}
|
||||
if (data.o2_concentration1 !== undefined) {
|
||||
document.getElementById('o2-concentration1').textContent = data.o2_concentration1 + ' ppm';
|
||||
}
|
||||
if (data.o2_concentration2 !== undefined) {
|
||||
document.getElementById('o2-concentration2').textContent = data.o2_concentration2 + ' ppm';
|
||||
}
|
||||
if (data.ch3oh_concentration1 !== undefined) {
|
||||
document.getElementById('ch3oh-concentration1').textContent = data.ch3oh_concentration1 + ' ppm';
|
||||
}
|
||||
if (data.ch3oh_concentration2 !== undefined) {
|
||||
document.getElementById('ch3oh-concentration2').textContent = data.ch3oh_concentration2 + ' ppm';
|
||||
}
|
||||
|
||||
// 电池系统
|
||||
if (data.ins_soc !== undefined) {
|
||||
document.getElementById('ins-soc').textContent = (data.ins_soc).toFixed(1) + '%';
|
||||
}
|
||||
if (data.dyn_soc !== undefined) {
|
||||
document.getElementById('dyn-soc').textContent = (data.dyn_soc).toFixed(1) + '%';
|
||||
}
|
||||
if (data.ins_voltage_link !== undefined) {
|
||||
document.getElementById('ins-voltage-link').textContent = (data.ins_voltage_link ).toFixed(2) + ' V';
|
||||
}
|
||||
if (data.dyn_voltage_link !== undefined) {
|
||||
document.getElementById('dyn-voltage-link').textContent = (data.dyn_voltage_link ).toFixed(2) + ' V';
|
||||
}
|
||||
if (data.ins_current !== undefined) {
|
||||
document.getElementById('ins-current').textContent = (data.ins_current).toFixed(2) + ' A';
|
||||
}
|
||||
if (data.dyn_current !== undefined) {
|
||||
document.getElementById('dyn-current').textContent = (data.dyn_current).toFixed(2) + ' A';
|
||||
}
|
||||
if (data.ins_total_energy !== undefined) {
|
||||
document.getElementById('ins-total-energy').textContent = data.ins_total_energy + ' Wh';
|
||||
}
|
||||
if (data.dyn_total_energy !== undefined) {
|
||||
document.getElementById('dyn-total-energy').textContent = data.dyn_total_energy + ' Wh';
|
||||
}
|
||||
if (data.ins_power_input !== undefined) {
|
||||
document.getElementById('ins-power-input').textContent = data.ins_power_input + ' W';
|
||||
}
|
||||
if (data.dyn_power_input !== undefined) {
|
||||
document.getElementById('dyn-power-input').textContent = data.dyn_power_input + ' W';
|
||||
}
|
||||
|
||||
// 继电器状态
|
||||
if (data.ins_relay_status1 !== undefined) {
|
||||
document.getElementById('ins-relay-status1').textContent = getRelayStatusText(data.ins_relay_status1);
|
||||
}
|
||||
if (data.ins_relay_status2 !== undefined) {
|
||||
document.getElementById('ins-relay-status2').textContent = getRelayStatusText(data.ins_relay_status2);
|
||||
}
|
||||
if (data.dyn_relay_status1 !== undefined) {
|
||||
document.getElementById('dyn-relay-status1').textContent = getRelayStatusText(data.dyn_relay_status1);
|
||||
}
|
||||
if (data.dyn_relay_status2 !== undefined) {
|
||||
document.getElementById('dyn-relay-status2').textContent = getRelayStatusText(data.dyn_relay_status2);
|
||||
}
|
||||
|
||||
// 报警标志
|
||||
if (data.dyn_alarm_flag1 !== undefined) {
|
||||
document.getElementById('dyn-alarm-flag1').textContent = data.dyn_alarm_flag1;
|
||||
}
|
||||
if (data.dyn_alarm_flag2 !== undefined) {
|
||||
document.getElementById('dyn-alarm-flag2').textContent = data.dyn_alarm_flag2;
|
||||
}
|
||||
if (data.dyn_alarm_flag3 !== undefined) {
|
||||
document.getElementById('dyn-alarm-flag3').textContent = data.dyn_alarm_flag3;
|
||||
}
|
||||
if (data.dyn_alarm_flag4 !== undefined) {
|
||||
document.getElementById('dyn-alarm-flag4').textContent = data.dyn_alarm_flag4;
|
||||
}
|
||||
if (data.dyn_alarm_flag5 !== undefined) {
|
||||
document.getElementById('dyn-alarm-flag5').textContent = data.dyn_alarm_flag5;
|
||||
}
|
||||
if (data.dyn_alarm_flag6 !== undefined) {
|
||||
document.getElementById('dyn-alarm-flag6').textContent = data.dyn_alarm_flag6;
|
||||
}
|
||||
if (data.ins_alarm_flag1 !== undefined) {
|
||||
document.getElementById('ins-alarm-flag1').textContent = data.ins_alarm_flag1;
|
||||
}
|
||||
if (data.ins_alarm_flag2 !== undefined) {
|
||||
document.getElementById('ins-alarm-flag2').textContent = data.ins_alarm_flag2;
|
||||
}
|
||||
if (data.ins_alarm_flag3 !== undefined) {
|
||||
document.getElementById('ins-alarm-flag3').textContent = data.ins_alarm_flag3;
|
||||
}
|
||||
if (data.ins_alarm_flag4 !== undefined) {
|
||||
document.getElementById('ins-alarm-flag4').textContent = data.ins_alarm_flag4;
|
||||
}
|
||||
if (data.ins_alarm_flag5 !== undefined) {
|
||||
document.getElementById('ins-alarm-flag5').textContent = data.ins_alarm_flag5;
|
||||
}
|
||||
if (data.ins_alarm_flag6 !== undefined) {
|
||||
document.getElementById('ins-alarm-flag6').textContent = data.ins_alarm_flag6;
|
||||
}
|
||||
|
||||
// 其他系统参数
|
||||
if (data.device_online_flag1 !== undefined) {
|
||||
document.getElementById('device-online-flag1').textContent = data.device_online_flag1;
|
||||
}
|
||||
if (data.device_online_flag2 !== undefined) {
|
||||
document.getElementById('device-online-flag2').textContent = data.device_online_flag2;
|
||||
}
|
||||
if (data.heartbeat !== undefined) {
|
||||
document.getElementById('heartbeat').textContent = data.heartbeat;
|
||||
}
|
||||
if (data.timestamp !== undefined) {
|
||||
document.getElementById('timestamp').textContent = new Date(data.timestamp).toLocaleString();
|
||||
}
|
||||
}
|
||||
|
||||
// FC模式文本转换
|
||||
function getFCModeText(mode) {
|
||||
const modes = {
|
||||
0: '无效',
|
||||
1: '调试',
|
||||
2: '自动',
|
||||
3: '补给'
|
||||
};
|
||||
return modes[mode] || '未知模式';
|
||||
}
|
||||
|
||||
// FC状态文本转换
|
||||
function getFCStatusText(status) {
|
||||
const statuses = {
|
||||
0: '无效',
|
||||
1: '初始化',
|
||||
2: '待机',
|
||||
3: '启动中',
|
||||
4: '运行',
|
||||
5: '关机中',
|
||||
6: '故障',
|
||||
7: '维护',
|
||||
8: '校准',
|
||||
9: '测试',
|
||||
10: '紧急停止',
|
||||
11: '重启',
|
||||
12: '升级',
|
||||
13: '维护完成'
|
||||
};
|
||||
return statuses[status] || '未知状态';
|
||||
}
|
||||
|
||||
// 继电器状态文本转换
|
||||
function getRelayStatusText(status) {
|
||||
return status === 1 ? '闭合' : '断开';
|
||||
}
|
||||
|
||||
// 折叠面板功能
|
||||
const coll = document.getElementsByClassName("collapsible");
|
||||
for (let i = 0; i < coll.length; i++) {
|
||||
coll[i].addEventListener("click", function() {
|
||||
this.classList.toggle("active");
|
||||
const content = this.nextElementSibling;
|
||||
if (content.style.display === "block") {
|
||||
content.style.display = "none";
|
||||
} else {
|
||||
content.style.display = "block";
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
// 初始化WebSocket连接
|
||||
window.addEventListener('load', initWebSocket);
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
)";
|
||||
|
||||
#endif // HTTP_SERVER_INDEX_H
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -207,6 +207,8 @@ typedef struct disHighVolBusState
|
||||
unsigned char meterPowerLossSignal;
|
||||
// 22: 应急电源状态 (0x55 正常,0xAA 故障)
|
||||
unsigned char emergencyPowerLossSignal;
|
||||
// 22: dc/dc温度
|
||||
unsigned char dcDcTemperature;
|
||||
// 23: 动力汇流排电压
|
||||
unsigned short powerBusVoltage;
|
||||
// 24: DC/DC5模块电流
|
||||
@@ -462,7 +464,7 @@ typedef struct pmState
|
||||
ccuState ccustate;
|
||||
disHighVolBusState bus1State;
|
||||
disHighAVolBusState bus2State;
|
||||
disLowMainBusState bus3State;
|
||||
disLowMainBusState bus3State;
|
||||
disLowBusState bus4State;
|
||||
} PmState;
|
||||
|
||||
@@ -480,6 +482,8 @@ typedef struct pmState
|
||||
unsigned char fbReservedCircuitBreaker : 1;
|
||||
unsigned char tyzReservedCircuitBreaker : 1;
|
||||
unsigned char reservedCircuitBreaker : 1;
|
||||
unsigned char dcdcmodel : 1;
|
||||
unsigned char coolingSystem : 1;
|
||||
unsigned short paceholder : 4;
|
||||
} disBus1Breaker;
|
||||
|
||||
@@ -819,5 +823,4 @@ namespace FaultEnable {
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
#endif
|
||||
@@ -262,6 +262,96 @@ bool SQLite::createTable()
|
||||
if (!createTable("disLowBusState", disLowBusColumns)) {
|
||||
return false;
|
||||
}
|
||||
// 6. 创建ccuColCmd表
|
||||
std::string ccuColCmdColumns = R"(
|
||||
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||
timestamp DATETIME DEFAULT (datetime('now', 'localtime')),
|
||||
workCondition INTEGER,
|
||||
fcuCmd INTEGER,
|
||||
fcuPowerEfficiency INTEGER,
|
||||
fcuInsEfficiency INTEGER,
|
||||
insBatCmd INTEGER,
|
||||
powerBatCmd INTEGER,
|
||||
powerBatEfficiency INTEGER,
|
||||
heartbeat INTEGER,
|
||||
masterState INTEGER,
|
||||
paceholder1 INTEGER,
|
||||
paceholder2 INTEGER
|
||||
)";
|
||||
if (!createTable("ccuColCmd", ccuColCmdColumns)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// 7. 创建disHighVolBusCmd表
|
||||
std::string disHighVolBusCmdColumns = R"(
|
||||
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||
timestamp DATETIME DEFAULT (datetime('now', 'localtime')),
|
||||
fuelCellCircuitBreaker INTEGER,
|
||||
powerLithiumBatteryCircuitBreaker INTEGER,
|
||||
propulsionMotorCircuitBreaker INTEGER,
|
||||
lithiumBatteryGroupInstrumentCircuitBreaker INTEGER,
|
||||
dcDc5ModuleCircuitBreaker INTEGER,
|
||||
bowHighVoltageDistributionBoxCircuitBreaker INTEGER,
|
||||
sternFTDevice45CircuitBreaker INTEGER,
|
||||
sternRudderSwitch1CircuitBreaker INTEGER,
|
||||
sternRudderSwitch2CircuitBreaker INTEGER,
|
||||
fbReservedCircuitBreaker INTEGER,
|
||||
tyzReservedCircuitBreaker INTEGER,
|
||||
reservedCircuitBreaker INTEGER,
|
||||
dcdc5Module INTEGER,
|
||||
coolingSystem INTEGER
|
||||
)";
|
||||
if (!createTable("disHighVolBusCmd", disHighVolBusCmdColumns)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// 8. 创建disHighAVolBusCmd表
|
||||
std::string disHighAVolBusCmdColumns = R"(
|
||||
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||
timestamp DATETIME DEFAULT (datetime('now', 'localtime')),
|
||||
bowFTDevice123CircuitBreaker INTEGER,
|
||||
actuatorCircuitBreaker INTEGER,
|
||||
mastSteeringGearControlBoxCircuitBreaker INTEGER,
|
||||
xczCircuitBreaker INTEGER,
|
||||
bowRudderControlBoxCircuitBreaker INTEGER,
|
||||
openWaterCoverStartCylinderCircuitBreaker INTEGER
|
||||
)";
|
||||
if (!createTable("disHighAVolBusCmd", disHighAVolBusCmdColumns)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// 9. 创建disLowMainBusCmd表
|
||||
std::string disLowMainBusCmdColumns = R"(
|
||||
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||
timestamp DATETIME DEFAULT (datetime('now', 'localtime')),
|
||||
lithiumBatteryGroupInstrumentCircuitBreaker INTEGER,
|
||||
bowLowVoltageDistributionBoxCircuitBreaker INTEGER,
|
||||
unit4InstrumentDC48VCircuitBreaker INTEGER,
|
||||
dcC1DCDistributionPanelCircuitBreaker INTEGER,
|
||||
reservedCircuitBreaker1 INTEGER,
|
||||
reservedCircuitBreaker2 INTEGER,
|
||||
emergencyLithiumBatteryGroup2CircuitBreaker INTEGER
|
||||
)";
|
||||
if (!createTable("disLowMainBusCmd", disLowMainBusCmdColumns)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// 10. 创建disLowBusCmd表
|
||||
std::string disLowBusCmdColumns = R"(
|
||||
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||
timestamp DATETIME DEFAULT (datetime('now', 'localtime')),
|
||||
unit1CircuitBreaker INTEGER,
|
||||
unit2CircuitBreaker INTEGER,
|
||||
unit3CircuitBreaker INTEGER,
|
||||
unit5CircuitBreaker INTEGER,
|
||||
bowPZDeviceCircuitBreaker INTEGER,
|
||||
reservedCircuitBreaker1 INTEGER,
|
||||
reservedCircuitBreaker2 INTEGER,
|
||||
emergencyLithiumBatteryGroup1CircuitBreaker INTEGER
|
||||
)";
|
||||
if (!createTable("disLowBusCmd", disLowBusCmdColumns)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
@@ -492,6 +582,244 @@ bool SQLite::insertData(const ccuState data) {
|
||||
return success;
|
||||
}
|
||||
|
||||
bool SQLite::insertData(const ccuColCmd cmd) {
|
||||
if (!m_db) {
|
||||
std::cerr << "数据库未打开,无法插入数据。" << std::endl;
|
||||
return false;
|
||||
}
|
||||
|
||||
const char* sql = R"(
|
||||
INSERT INTO ccuColCmd (
|
||||
workCondition, fcuCmd, fcuPowerEfficiency,
|
||||
fcuInsEfficiency, insBatCmd, powerBatCmd,
|
||||
powerBatEfficiency, heartbeat, masterState,
|
||||
paceholder1, paceholder2
|
||||
) VALUES (
|
||||
?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?
|
||||
);
|
||||
)";
|
||||
|
||||
sqlite3_stmt* stmt = nullptr;
|
||||
if (sqlite3_prepare_v2(m_db, sql, -1, &stmt, nullptr) != SQLITE_OK) {
|
||||
std::cerr << "准备插入语句失败: " << sqlite3_errmsg(m_db) << std::endl;
|
||||
return false;
|
||||
}
|
||||
|
||||
int idx = 1;
|
||||
#define BIND_INT(x) sqlite3_bind_int(stmt, idx++, static_cast<int>(x))
|
||||
|
||||
BIND_INT(cmd.workCondition);
|
||||
BIND_INT(cmd.fcuCmd);
|
||||
BIND_INT(cmd.fcuPowerEfficiency);
|
||||
BIND_INT(cmd.fcuInsEfficiency);
|
||||
BIND_INT(cmd.insBatCmd);
|
||||
BIND_INT(cmd.powerBatCmd);
|
||||
BIND_INT(cmd.powerBatEfficiency);
|
||||
BIND_INT(cmd.heartbeat);
|
||||
BIND_INT(cmd.masterState);
|
||||
BIND_INT(cmd.paceholder1);
|
||||
BIND_INT(cmd.paceholder2);
|
||||
|
||||
#undef BIND_INT
|
||||
|
||||
bool success = (sqlite3_step(stmt) == SQLITE_DONE);
|
||||
if (!success) {
|
||||
std::cerr << "执行插入失败: " << sqlite3_errmsg(m_db) << std::endl;
|
||||
}
|
||||
|
||||
sqlite3_finalize(stmt);
|
||||
return success;
|
||||
}
|
||||
|
||||
bool SQLite::insertData(const disHighVolBusCmd cmd) {
|
||||
if (!m_db) {
|
||||
std::cerr << "数据库未打开,无法插入数据。" << std::endl;
|
||||
return false;
|
||||
}
|
||||
|
||||
const char* sql = R"(
|
||||
INSERT INTO disHighVolBusCmd (
|
||||
fuelCellCircuitBreaker, powerLithiumBatteryCircuitBreaker,
|
||||
propulsionMotorCircuitBreaker, lithiumBatteryGroupInstrumentCircuitBreaker,
|
||||
dcDc5ModuleCircuitBreaker, bowHighVoltageDistributionBoxCircuitBreaker,
|
||||
sternFTDevice45CircuitBreaker, sternRudderSwitch1CircuitBreaker,
|
||||
sternRudderSwitch2CircuitBreaker, fbReservedCircuitBreaker,
|
||||
tyzReservedCircuitBreaker, reservedCircuitBreaker,
|
||||
dcdc5Module, coolingSystem
|
||||
) VALUES (
|
||||
?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?
|
||||
);
|
||||
)";
|
||||
|
||||
sqlite3_stmt* stmt = nullptr;
|
||||
if (sqlite3_prepare_v2(m_db, sql, -1, &stmt, nullptr) != SQLITE_OK) {
|
||||
std::cerr << "准备插入语句失败: " << sqlite3_errmsg(m_db) << std::endl;
|
||||
return false;
|
||||
}
|
||||
|
||||
int idx = 1;
|
||||
#define BIND_INT(x) sqlite3_bind_int(stmt, idx++, static_cast<int>(x))
|
||||
|
||||
BIND_INT(cmd.fuelCellCircuitBreaker);
|
||||
BIND_INT(cmd.powerLithiumBatteryCircuitBreaker);
|
||||
BIND_INT(cmd.propulsionMotorCircuitBreaker);
|
||||
BIND_INT(cmd.lithiumBatteryGroupInstrumentCircuitBreaker);
|
||||
BIND_INT(cmd.dcDc5ModuleCircuitBreaker);
|
||||
BIND_INT(cmd.bowHighVoltageDistributionBoxCircuitBreaker);
|
||||
BIND_INT(cmd.sternFTDevice45CircuitBreaker);
|
||||
BIND_INT(cmd.sternRudderSwitch1CircuitBreaker);
|
||||
BIND_INT(cmd.sternRudderSwitch2CircuitBreaker);
|
||||
BIND_INT(cmd.fbReservedCircuitBreaker);
|
||||
BIND_INT(cmd.tyzReservedCircuitBreaker);
|
||||
BIND_INT(cmd.reservedCircuitBreaker);
|
||||
BIND_INT(cmd.dcdc5Module);
|
||||
BIND_INT(cmd.coolingSystem);
|
||||
|
||||
#undef BIND_INT
|
||||
|
||||
bool success = (sqlite3_step(stmt) == SQLITE_DONE);
|
||||
if (!success) {
|
||||
std::cerr << "执行插入失败: " << sqlite3_errmsg(m_db) << std::endl;
|
||||
}
|
||||
|
||||
sqlite3_finalize(stmt);
|
||||
return success;
|
||||
}
|
||||
|
||||
bool SQLite::insertData(const disHighAVolBusCmd cmd) {
|
||||
if (!m_db) {
|
||||
std::cerr << "数据库未打开,无法插入数据。" << std::endl;
|
||||
return false;
|
||||
}
|
||||
|
||||
const char* sql = R"(
|
||||
INSERT INTO disHighAVolBusCmd (
|
||||
bowFTDevice123CircuitBreaker, actuatorCircuitBreaker,
|
||||
mastSteeringGearControlBoxCircuitBreaker, xczCircuitBreaker,
|
||||
bowRudderControlBoxCircuitBreaker, openWaterCoverStartCylinderCircuitBreaker
|
||||
) VALUES (
|
||||
?, ?, ?, ?, ?, ?
|
||||
);
|
||||
)";
|
||||
|
||||
sqlite3_stmt* stmt = nullptr;
|
||||
if (sqlite3_prepare_v2(m_db, sql, -1, &stmt, nullptr) != SQLITE_OK) {
|
||||
std::cerr << "准备插入语句失败: " << sqlite3_errmsg(m_db) << std::endl;
|
||||
return false;
|
||||
}
|
||||
|
||||
int idx = 1;
|
||||
#define BIND_INT(x) sqlite3_bind_int(stmt, idx++, static_cast<int>(x))
|
||||
|
||||
BIND_INT(cmd.bowFTDevice123CircuitBreaker);
|
||||
BIND_INT(cmd.actuatorCircuitBreaker);
|
||||
BIND_INT(cmd.mastSteeringGearControlBoxCircuitBreaker);
|
||||
BIND_INT(cmd.xczCircuitBreaker);
|
||||
BIND_INT(cmd.bowRudderControlBoxCircuitBreaker);
|
||||
BIND_INT(cmd.openWaterCoverStartCylinderCircuitBreaker);
|
||||
|
||||
#undef BIND_INT
|
||||
|
||||
bool success = (sqlite3_step(stmt) == SQLITE_DONE);
|
||||
if (!success) {
|
||||
std::cerr << "执行插入失败: " << sqlite3_errmsg(m_db) << std::endl;
|
||||
}
|
||||
|
||||
sqlite3_finalize(stmt);
|
||||
return success;
|
||||
}
|
||||
|
||||
bool SQLite::insertData(const disLowMainBusCmd cmd) {
|
||||
if (!m_db) {
|
||||
std::cerr << "数据库未打开,无法插入数据。" << std::endl;
|
||||
return false;
|
||||
}
|
||||
|
||||
const char* sql = R"(
|
||||
INSERT INTO disLowMainBusCmd (
|
||||
lithiumBatteryGroupInstrumentCircuitBreaker, bowLowVoltageDistributionBoxCircuitBreaker,
|
||||
unit4InstrumentDC48VCircuitBreaker, dcC1DCDistributionPanelCircuitBreaker,
|
||||
reservedCircuitBreaker1, reservedCircuitBreaker2,
|
||||
emergencyLithiumBatteryGroup2CircuitBreaker
|
||||
) VALUES (
|
||||
?, ?, ?, ?, ?, ?, ?
|
||||
);
|
||||
)";
|
||||
|
||||
sqlite3_stmt* stmt = nullptr;
|
||||
if (sqlite3_prepare_v2(m_db, sql, -1, &stmt, nullptr) != SQLITE_OK) {
|
||||
std::cerr << "准备插入语句失败: " << sqlite3_errmsg(m_db) << std::endl;
|
||||
return false;
|
||||
}
|
||||
|
||||
int idx = 1;
|
||||
#define BIND_INT(x) sqlite3_bind_int(stmt, idx++, static_cast<int>(x))
|
||||
|
||||
BIND_INT(cmd.lithiumBatteryGroupInstrumentCircuitBreaker);
|
||||
BIND_INT(cmd.bowLowVoltageDistributionBoxCircuitBreaker);
|
||||
BIND_INT(cmd.unit4InstrumentDC48VCircuitBreaker);
|
||||
BIND_INT(cmd.dcC1DCDistributionPanelCircuitBreaker);
|
||||
BIND_INT(cmd.reservedCircuitBreaker1);
|
||||
BIND_INT(cmd.reservedCircuitBreaker2);
|
||||
BIND_INT(cmd.emergencyLithiumBatteryGroup2CircuitBreaker);
|
||||
|
||||
#undef BIND_INT
|
||||
|
||||
bool success = (sqlite3_step(stmt) == SQLITE_DONE);
|
||||
if (!success) {
|
||||
std::cerr << "执行插入失败: " << sqlite3_errmsg(m_db) << std::endl;
|
||||
}
|
||||
|
||||
sqlite3_finalize(stmt);
|
||||
return success;
|
||||
}
|
||||
|
||||
bool SQLite::insertData(const disLowBusCmd cmd) {
|
||||
if (!m_db) {
|
||||
std::cerr << "数据库未打开,无法插入数据。" << std::endl;
|
||||
return false;
|
||||
}
|
||||
|
||||
const char* sql = R"(
|
||||
INSERT INTO disLowBusCmd (
|
||||
unit1CircuitBreaker, unit2CircuitBreaker,
|
||||
unit3CircuitBreaker, unit5CircuitBreaker,
|
||||
bowPZDeviceCircuitBreaker, reservedCircuitBreaker1,
|
||||
reservedCircuitBreaker2, emergencyLithiumBatteryGroup1CircuitBreaker
|
||||
) VALUES (
|
||||
?, ?, ?, ?, ?, ?, ?, ?
|
||||
);
|
||||
)";
|
||||
|
||||
sqlite3_stmt* stmt = nullptr;
|
||||
if (sqlite3_prepare_v2(m_db, sql, -1, &stmt, nullptr) != SQLITE_OK) {
|
||||
std::cerr << "准备插入语句失败: " << sqlite3_errmsg(m_db) << std::endl;
|
||||
return false;
|
||||
}
|
||||
|
||||
int idx = 1;
|
||||
#define BIND_INT(x) sqlite3_bind_int(stmt, idx++, static_cast<int>(x))
|
||||
|
||||
BIND_INT(cmd.unit1CircuitBreaker);
|
||||
BIND_INT(cmd.unit2CircuitBreaker);
|
||||
BIND_INT(cmd.unit3CircuitBreaker);
|
||||
BIND_INT(cmd.unit5CircuitBreaker);
|
||||
BIND_INT(cmd.bowPZDeviceCircuitBreaker);
|
||||
BIND_INT(cmd.reservedCircuitBreaker1);
|
||||
BIND_INT(cmd.reservedCircuitBreaker2);
|
||||
BIND_INT(cmd.emergencyLithiumBatteryGroup1CircuitBreaker);
|
||||
|
||||
#undef BIND_INT
|
||||
|
||||
bool success = (sqlite3_step(stmt) == SQLITE_DONE);
|
||||
if (!success) {
|
||||
std::cerr << "执行插入失败: " << sqlite3_errmsg(m_db) << std::endl;
|
||||
}
|
||||
|
||||
sqlite3_finalize(stmt);
|
||||
return success;
|
||||
}
|
||||
|
||||
bool SQLite::insertData(const disHighVolBusState data) {
|
||||
if (!m_db) {
|
||||
std::cerr << "数据库未打开,无法插入数据。" << std::endl;
|
||||
|
||||
@@ -23,6 +23,13 @@ public:
|
||||
bool insertData(disHighAVolBusState data);
|
||||
bool insertData(disLowMainBusState data);
|
||||
bool insertData(disLowBusState data);
|
||||
|
||||
//插入指令数据
|
||||
bool insertData(ccuColCmd cmd);
|
||||
bool insertData(disHighVolBusCmd cmd);
|
||||
bool insertData(disHighAVolBusCmd cmd);
|
||||
bool insertData(disLowMainBusCmd cmd);
|
||||
bool insertData(disLowBusCmd cmd);
|
||||
};
|
||||
|
||||
|
||||
|
||||
@@ -0,0 +1,661 @@
|
||||
#ifndef SYSTEMDATA_H
|
||||
#define SYSTEMDATA_H
|
||||
#include "pmSysvariable.h"
|
||||
#include "sqlit3/SQLite.h"
|
||||
|
||||
class SystemData
|
||||
{
|
||||
private:
|
||||
SQLite* m_db;
|
||||
public:
|
||||
//燃料电池系统参数
|
||||
uint8_t fc_mode; // 燃料电池系统运行模式:00H-无效, 01H-调试, 02H-自动, 03H-补给
|
||||
uint8_t fc_status; // 燃料电池状态:00H-无效, 01H-初始化, ..., 0DH-维护完成
|
||||
uint8_t fc_fault_level; // 燃料电池故障等级:00H-无故障, 10H-一级, 20H-二级, 30H-三级, 40H-四级
|
||||
|
||||
//功率和时间参数
|
||||
float output_power_limit; // 系统输出功率限制值,单位:W
|
||||
float total_generation_time; // 系统累计发电时间,单位:0.1小时
|
||||
float total_generation_power; // 系统累计发电总功率,单位:W
|
||||
|
||||
//故障信息
|
||||
uint16_t fc_fault_level_1; // 一级故障位
|
||||
uint16_t fc_fault_level_2; // 二级故障位
|
||||
uint16_t fc_fault_level_3; // 三级故障位
|
||||
uint16_t fc_fault_level_4; // 四级故障位
|
||||
|
||||
//燃料容量
|
||||
float hydrogen_capacity; // 储氢罐剩余容量百分比,单位:%
|
||||
float liquid_oxygen_capacity; // 液氧罐剩余容量百分比,单位:%
|
||||
|
||||
//温度压力参数
|
||||
float palladium_temp; // 钯膜最高温度,单位:℃
|
||||
float main_pipe_pressure; // 主水路压力,单位:0.01kPa
|
||||
float aux_pipe_pressure; // 辅水路压力,单位:0.01kPa
|
||||
|
||||
//舱室环境参数
|
||||
float cabin_pressure1; // 舱室1压力,单位:0.01kPa
|
||||
float cabin_pressure2; // 舱室2压力,单位:0.01kPa
|
||||
float cabin_temp1; // 舱室1温度,单位:0.01℃
|
||||
float cabin_temp2; // 舱室2温度,单位:0.01℃
|
||||
float cabin_humidity1; // 舱室1湿度,单位:0.01%RH
|
||||
float cabin_humidity2; // 舱室2湿度,单位:0.01%RH
|
||||
|
||||
//火焰探测器
|
||||
uint8_t flame_detector1; // 火焰探测器1状态:00H-无效, 01H-报警, 02H-故障
|
||||
uint8_t flame_detector2; // 火焰探测器2状态:00H-无效, 01H-报警, 02H-故障
|
||||
|
||||
//气体浓度
|
||||
float h2_concentration1; // 舱室H2浓度1,单位:0.01% LEL
|
||||
float h2_concentration2; // 舱室H2浓度2,单位:0.01% LEL
|
||||
float h2_concentration3; // 舱室H2浓度3,单位:0.01% LEL
|
||||
float o2_concentration1; // 舱室O2浓度1,单位:0.01% LEL
|
||||
float o2_concentration2; // 舱室O2浓度2,单位:0.01% LEL
|
||||
float ch3oh_concentration1; // 舱室甲醇气体浓度1,单位:0.01% LEL
|
||||
float ch3oh_concentration2; // 舱室甲醇气体浓度2,单位:0.01% LEL
|
||||
|
||||
//保留字段
|
||||
float reserved1[10]; // 保留字段
|
||||
float cabin_ox_concentration; // 仪表舱内氧气浓度,单位:0.1%
|
||||
float cabin_temperature; // 仪表舱内温度,单位:0.1℃
|
||||
float cabin_humidity; // 仪表舱内湿度,单位:0.1%RH
|
||||
float cabin_pressure; // 仪表舱内大气压,单位:0.2kPa
|
||||
|
||||
//动力舱参数
|
||||
float power_cabin_ox_concentration; // 动力舱内氧气浓度,单位:0.1%
|
||||
float power_cabin_temperature; // 动力舱内温度,单位:0.1℃
|
||||
float power_cabin_humidity; // 动力舱内湿度,单位:0.1%RH
|
||||
float power_cabin_pressure; // 动力舱内大气压,单位:0.2kPa
|
||||
uint8_t reserved2[1]; // 保留字段
|
||||
|
||||
//电池报警标志
|
||||
uint8_t dyn_alarm_flag[6]; // 动力锂电池报警标志
|
||||
uint8_t ins_alarm_flag[6]; // 仪表锂电池报警标志
|
||||
|
||||
//继电器状态
|
||||
uint8_t ins_relay_status1; // 仪表电池继电器状态
|
||||
uint8_t ins_relay_status2; // 仪表电池预充继电器和负极继电器状态
|
||||
uint8_t dyn_relay_status1; // 动力电池正极与充电继电器状态
|
||||
uint8_t dyn_relay_status2; // 动力电池预充与负极继电器状态
|
||||
|
||||
//电池功率参数
|
||||
float ins_max_discharge_power; // 仪表电池最大允许放电功率,单位:0.05kW
|
||||
float dyn_max_discharge_power; // 动力电池最大允许放电功率,单位:0.05kW
|
||||
|
||||
//电池SOC
|
||||
float ins_soc; // 仪表锂电池荷电状态SOC,范围:0~100
|
||||
float dyn_soc; // 动力锂电池荷电状态SOC,范围:0~100
|
||||
|
||||
//电池能量
|
||||
float ins_total_energy; // 仪表电池总能量,单位:0.1kWh
|
||||
float dyn_total_energy; // 动力电池总能量,单位:0.1kWh
|
||||
|
||||
//电池输入功率
|
||||
float ins_power_input; // 仪表电池输入功率,单位:0.1kW
|
||||
float dyn_power_input; // 动力电池输入功率,单位:0.1kW
|
||||
|
||||
//电池充放电状态
|
||||
uint8_t ins_charge_status; // 仪表电池充放电状态:00H-无效,10H-充电,20H-放电
|
||||
uint8_t dyn_charge_status; // 动力电池充放电状态:00H-无效,10H-充电,20H-放电
|
||||
|
||||
//电池电压电流
|
||||
float ins_voltage_link; // 仪表电池LINK端电压,单位:0.01V
|
||||
float ins_voltage_pack; // 仪表电池PACK端电压,单位:0.01V
|
||||
float ins_current; // 仪表电池电流,单位:0.01A
|
||||
float ins_resistance_pos; // 仪表电池正极绝缘电阻,单位:kΩ
|
||||
float ins_resistance_neg; // 仪表电池负极绝缘电阻,单位:kΩ
|
||||
float dyn_voltage_link; // 动力电池LINK端电压,单位:0.01V
|
||||
float dyn_voltage_pack; // 动力电池PACK端电压,单位:0.01V
|
||||
float dyn_current; // 动力电池电流,单位:0.05A
|
||||
float dyn_resistance_pos; // 动力电池正极绝缘电阻,单位:kΩ
|
||||
float dyn_resistance_neg; // 动力电池负极绝缘电阻,单位:kΩ
|
||||
|
||||
//紧急状态
|
||||
uint8_t ins_emergency_status; // 仪表电池紧急状态
|
||||
uint8_t dyn_emergency_status; // 动力电池紧急状态
|
||||
|
||||
//保留字段
|
||||
uint8_t reserved3[2]; // 保留字段
|
||||
float ins_soc_threshold1; // 仪表电池1 SOC门限
|
||||
float ins_soc_threshold2; // 仪表电池2 SOC门限
|
||||
float ins_soc_threshold3; // 仪表电池3 SOC门限
|
||||
float dyn_soc_threshold1; // 动力电池1 SOC门限
|
||||
float dyn_soc_threshold2; // 动力电池2 SOC门限
|
||||
float dyn_soc_threshold3; // 动力电池3 SOC门限
|
||||
float ins_power_limit1; // 仪表电池1功率限制值
|
||||
float ins_power_limit2; // 仪表电池2功率限制值
|
||||
float dyn_power_limit1; // 动力电池1功率限制值
|
||||
float dyn_power_limit2; // 动力电池2功率限制值
|
||||
|
||||
//设备在线状态
|
||||
uint32_t device_online_flag1; // 设备在线状态标志1
|
||||
uint32_t device_online_flag2; // 设备在线状态标志2
|
||||
|
||||
//保留字段
|
||||
uint32_t reserved4; // 保留字段
|
||||
uint32_t heartbeat; // 主机心跳计数器
|
||||
|
||||
//配电系统状态
|
||||
//动力母线状态
|
||||
struct POWER_BUS_STATUS
|
||||
{
|
||||
// 5: 燃料电池断路器 0 断开 1 闭合 2 故障
|
||||
unsigned char fuelCellCircuitBreaker;
|
||||
// 6: 动力锂电池断路器 0 断开 1 闭合 2 故障
|
||||
unsigned char powerLithiumBatteryCircuitBreaker;
|
||||
// 7: 推进电机断路器 0 断开 1 闭合 2 故障
|
||||
unsigned char propulsionMotorCircuitBreaker;
|
||||
// 8: 锂电池组仪表断路器 0 断开 1 闭合 2 故障
|
||||
unsigned char lithiumBatteryGroupInstrumentCircuitBreaker;
|
||||
// 9: DC/DC5模块断路器 0 断开 1 闭合 2 故障
|
||||
unsigned char dcDc5ModuleCircuitBreaker;
|
||||
// 10: 艏部高压配电箱断路器 0 断开 1 闭合 2 故障
|
||||
unsigned char bowHighVoltageDistributionBoxCircuitBreaker;
|
||||
// 11: 艉部FT装置4/5断路器 0 断开 1 闭合 2 故障
|
||||
unsigned char sternFTDevice45CircuitBreaker;
|
||||
// 12: 艉舵开关1断路器 0 断开 1 闭合 2 故障
|
||||
unsigned char sternRudderSwitch1CircuitBreaker;
|
||||
// 13: 艉舵开关2断路器 0 断开 1 闭合 2 故障
|
||||
unsigned char sternRudderSwitch2CircuitBreaker;
|
||||
// 14: FB预留断路器 0 断开 1 闭合 2 故障
|
||||
unsigned char fbReservedCircuitBreaker;
|
||||
// 15: TYZ预留断路器 0 断开 1 闭合 2 故障
|
||||
unsigned char tyzReservedCircuitBreaker;
|
||||
// 16: 预留断路器 0 断开 1 闭合 2 故障
|
||||
unsigned char reservedCircuitBreaker;
|
||||
// 17: DC/DC5模块状态 0 未运行;1 运行;2 DC/DC模块过温关机;3 输出过流;4 输出过压;5 输出欠压;6 输入过压;7 输入欠压;8 输出短路保护;9 内部故障
|
||||
unsigned char dcDcModuleStatus;
|
||||
// 18:冷却系统状态 0 未运行 1 运行 2 冷却泵1故障 3 冷却泵2故障 4 冷却水泄露
|
||||
unsigned char coolingSystemStatus;
|
||||
// 19: 动力母排绝缘状态 0 正常 1 绝缘低
|
||||
unsigned char powerBusInsulationStatus;
|
||||
// 20: A汇流排绝缘状态 0 正常 1 绝缘低
|
||||
unsigned char aBusInsulationStatus;
|
||||
// 21: 仪表电源状态 0 正常 1 故障
|
||||
unsigned char meterPowerLossSignal;
|
||||
// 22: 应急电源状态 0 正常 1 故障
|
||||
unsigned char emergencyPowerLossSignal;
|
||||
// 22: dc/dc温度
|
||||
float dcDcTemperature;
|
||||
// 23: 动力汇流排电压
|
||||
float powerBusVoltage;
|
||||
// 24: DC/DC5模块电流
|
||||
float dcDc5ModuleCurrent;
|
||||
// 25: 动力汇流排电流
|
||||
float powerBusCurrent;
|
||||
// 26: A汇流排电压
|
||||
float busbarAVoltage;
|
||||
// 27: 推进电机控制箱电流
|
||||
float propulsionMotorControlBoxCurrent;
|
||||
// 28: A汇流排电流
|
||||
float busbarACurrent;
|
||||
// 29: 锂电池组(仪表)电流
|
||||
float lithiumBatteryGroupMeterCurrent;
|
||||
// 30: 艏部高压配电箱电流
|
||||
float bowHighVoltageDistributionBoxCurrent;
|
||||
// 31: 艉部FT装置4/5电流
|
||||
float sternFTDevice45Current;
|
||||
// 32: TYZ预留开关电流
|
||||
float tyzReservedSwitchCurrent;
|
||||
// 33: 艉舵开关1电流
|
||||
float sternRudderSwitch1Current;
|
||||
// 34: 预留电流
|
||||
float reservedCurrent1; // 改为 reservedCurrent1 以避免重名
|
||||
// 35: 艉舵开关2电流
|
||||
float sternRudderSwitch2Current;
|
||||
// 36: 预留电流2
|
||||
float reservedCurrent2; // 改为 reservedCurrent2 以避免重名
|
||||
// 37: FB预留电流
|
||||
float fbReservedSwitchCurrent;
|
||||
// 38: 预留电流3
|
||||
float reservedCurrent3; // 改为 reservedCurrent3 以避免重名
|
||||
// 39: 冷却水压力
|
||||
float coolWaterPressure;
|
||||
}power_bus_status;
|
||||
|
||||
struct POWER_A_BUS_STATUS
|
||||
{
|
||||
//动力汇流排状态
|
||||
//5. 艏部FT装置1/2/3断路器 0 断开 1 闭合 2 故障
|
||||
unsigned char bowFTDevice123CircuitBreaker;
|
||||
//6. 启闭机构断路器 0 断开 1 闭合 2 故障
|
||||
unsigned char actuatorCircuitBreaker;
|
||||
//7. 桅杆舵机控制箱断路器 0 断开 1 闭合 2 故障
|
||||
unsigned char mastSteeringGearControlBoxCircuitBreaker;
|
||||
//8. XCZ断路器 0 断开 1 闭合 2 故障
|
||||
unsigned char xczCircuitBreaker;
|
||||
//9. 艏舵控制箱断路器 0 断开 1 闭合 2 故障
|
||||
unsigned char bowRudderControlBoxCircuitBreaker;
|
||||
//10. 敞水盖启动电缸断路器 0 断开 1 闭合 2 故障
|
||||
unsigned char openWaterCoverStartCylinderCircuitBreaker;
|
||||
//11. 仪表电源失电信号 0 正常 1 故障
|
||||
unsigned char instrumentPowerFailureSignal;
|
||||
//12. 应急电源失电信号 0 正常 1 故障
|
||||
unsigned char emergencyPowerFailureSignal;
|
||||
//13. 浸水报警 0 无 1 有
|
||||
unsigned char waterIngressionAlarm;
|
||||
//14. 汇流排B电压
|
||||
float busbarBVoltage;
|
||||
//15. 汇流排B电流
|
||||
float busbarBCurrent;
|
||||
//16. 艏部FT装置1/2/3电流
|
||||
float bowFTDevice123Current;
|
||||
//17. 启闭机构电流
|
||||
float actuatorCurrent;
|
||||
//18. 桅杆舵机控制箱电流
|
||||
float mastSteeringGearControlBoxCurrent;
|
||||
//19. XCZ电流
|
||||
float xczCurrent;
|
||||
//20. 艏舵控制箱电流
|
||||
float bowRudderControlBoxCurrent;
|
||||
//21. 敞水盖启动电缸电流
|
||||
float openWaterCoverStartCylinderCurrent;
|
||||
} power_a_bus_status;
|
||||
|
||||
//仪表主母线状态
|
||||
struct INSTRUMENT_MAIN_BUS_STATUS
|
||||
{
|
||||
//5. 锂电池组(仪表)断路器 0 断开 1 闭合 2 故障
|
||||
unsigned char lithiumBatteryGroupInstrumentCircuitBreaker;
|
||||
//6. 艏部低压配电箱断路器 0 断开 1 闭合 2 故障
|
||||
unsigned char bowLowVoltageDistributionBoxCircuitBreaker;
|
||||
//7. UNIT4仪表DC48V断路器 0 断开 1 闭合 2 故障
|
||||
unsigned char unit4InstrumentDC48VCircuitBreaker;
|
||||
//8. DC-C1直流配电板断路器 0 断开 1 闭合 2 故障
|
||||
unsigned char dcC1DCDistributionPanelCircuitBreaker;
|
||||
//9. 预留断路器1 0 断开 1 闭合 2 故障
|
||||
unsigned char reservedCircuitBreaker1; // 为了区分,添加了数字后缀
|
||||
//10. 预留断路器2 0 断开 1 闭合 2 故障
|
||||
unsigned char reservedCircuitBreaker2; // 为了区分,添加了数字后缀
|
||||
//11. 应急锂电池组2断路器 0 断开 1 闭合 2 故障
|
||||
unsigned char emergencyLithiumBatteryGroup2CircuitBreaker;
|
||||
//12. 仪表电源失电信号 0 正常 1 故障
|
||||
unsigned char instrumentPowerFailureSignal;
|
||||
//13. 应急电源失电信号 0 正常 1 故障
|
||||
unsigned char emergencyPowerFailureSignal;
|
||||
//14. 仪表汇流排绝缘低 0 正常 1 绝缘低
|
||||
unsigned char instrumentBusbarInsulationLow;
|
||||
//15. 仪表母排电压
|
||||
float instrumentBusbarVoltage;
|
||||
//16. 艏部低压配电箱电流
|
||||
float bowLowVoltageDistributionBoxCurrent;
|
||||
//17. DC-C1(直流配电板1)仪表DC48V电流
|
||||
float dcC1InstrumentDC48VCurrent;
|
||||
//18. 预留电流
|
||||
float reservedCurrent1; // 为了区分,添加了数字后缀
|
||||
//19. 应急锂电池组2电流
|
||||
float emergencyLithiumBatteryGroup2Current;
|
||||
//20. 锂电池组(仪表)电流
|
||||
float lithiumBatteryGroupInstrumentCurrent;
|
||||
//21. UNIT4仪表DC48V电流
|
||||
float unit4InstrumentDC48VCurrent;
|
||||
//22. Ushort 预留电流
|
||||
float reservedCurrent2; // 为了区分,添加了数字后缀
|
||||
//23. 应急2汇流排电压
|
||||
float emergency2BusbarVoltage;
|
||||
//24. 复合能源管控系统应急DC48V电流
|
||||
float compositeEnergyManagementSystemEmergencyDC48VCurrent;
|
||||
//25. 燃料电池安全系统应急DC48V电流
|
||||
float fuelCellSecuritySystemEmergencyDC48VCurrent;
|
||||
//26. PLC控制电源电流
|
||||
float plcControlPowerCurrent;
|
||||
} instrument_main_bus_status;
|
||||
|
||||
//仪表汇流排状态
|
||||
struct INSTRUMENT_BUS_STATUS
|
||||
{
|
||||
//5. UNIT1断路器 0 断开 1 闭合 2 故障
|
||||
unsigned char unit1CircuitBreaker;
|
||||
//6. UNIT2断路器 0 断开 1 闭合 2 故障
|
||||
unsigned char unit2CircuitBreaker;
|
||||
//7. UNIT3断路器 0 断开 1 闭合 2 故障
|
||||
unsigned char unit3CircuitBreaker;
|
||||
//8. UNIT5断路器 0 断开 1 闭合 2 故障
|
||||
unsigned char unit5CircuitBreaker;
|
||||
//9. 艏部PZ装置断路器 0 断开 1 闭合 2 故障
|
||||
unsigned char bowPZDeviceCircuitBreaker;
|
||||
//10. 预留断路器1 0 断开 1 闭合 2 故障
|
||||
unsigned char reservedCircuitBreaker1; // 为了区分,添加了数字后缀
|
||||
//11. 预留断路器2 0 断开 1 闭合 2 故障
|
||||
unsigned char reservedCircuitBreaker2; // 为了区分,添加了数字后缀
|
||||
//12. 应急锂电池组1断路器 0 断开 1 闭合 2 故障
|
||||
unsigned char emergencyLithiumBatteryGroup1CircuitBreaker;
|
||||
//13. 仪表电源失电信号 0 正常 1 故障
|
||||
unsigned char powerFailureSignal;
|
||||
//14. 应急电源失电信号 0 正常 1 故障
|
||||
unsigned char emergencyPowerFailureSignal;
|
||||
//15. 浸水报警 0 无 1 有
|
||||
unsigned char waterIngressionAlarm;
|
||||
//16. 仪表母排电压
|
||||
float instrumentBusbarVoltage;
|
||||
//17. 仪表母排电流
|
||||
float instrumentBusbarCurrent;
|
||||
//18. UNIT1电流
|
||||
float unit1Current;
|
||||
//19. UNIT2电流
|
||||
float unit2Current;
|
||||
//20. UNIT3电流
|
||||
float unit3Current;
|
||||
//21. UNIT5电流
|
||||
float unit5Current;
|
||||
//22. 艏部PZ装置电流
|
||||
float bowPZDeviceCurrent;
|
||||
//23. 应急锂电池组1电流
|
||||
float emergencyLithiumBatteryGroup1Current;
|
||||
//24. 应急1汇流排电压
|
||||
float emergency1BusbarVoltage;
|
||||
} instrument_bus_status;
|
||||
|
||||
public:
|
||||
SystemData(){
|
||||
//初始化变量全部为0
|
||||
memset(this, 0, sizeof(SystemData));
|
||||
};
|
||||
~SystemData();
|
||||
|
||||
void updateSystemData(ccuState data){
|
||||
fc_mode = data.fc_mode;
|
||||
fc_status = data.fc_status;
|
||||
fc_fault_level = data.fc_fault_level;
|
||||
|
||||
//功率和时间参数
|
||||
output_power_limit = data.output_power_limit;
|
||||
total_generation_time = data.total_generation_time * 0.1;
|
||||
total_generation_power = data.total_generation_power;
|
||||
|
||||
//故障信息
|
||||
fc_fault_level_1 = data.fault_level_1;
|
||||
fc_fault_level_2 = data.fault_level_2;
|
||||
fc_fault_level_3 = data.fault_level_3;
|
||||
fc_fault_level_4 = data.fault_level_4;
|
||||
|
||||
//燃料容量
|
||||
hydrogen_capacity = static_cast<int>(data.hydrogen_capacity);
|
||||
liquid_oxygen_capacity = static_cast<int>(data.liquid_oxygen_capacity);
|
||||
|
||||
//温度压力参数
|
||||
palladium_temp = data.palladium_temp;
|
||||
main_pipe_pressure = data.main_pipe_pressure * 0.01;
|
||||
aux_pipe_pressure = data.aux_pipe_pressure * 0.01;
|
||||
|
||||
//舱室环境参数
|
||||
cabin_pressure1 = data.cabin_pressure1 * 0.01;
|
||||
cabin_pressure2 = data.cabin_pressure2 * 0.01;
|
||||
cabin_temp1 = data.cabin_temp1 * 0.01;
|
||||
cabin_temp2 = data.cabin_temp2 * 0.01;
|
||||
cabin_humidity1 = data.cabin_humidity1 * 0.01;
|
||||
cabin_humidity2 = data.cabin_humidity2 * 0.01;
|
||||
|
||||
//火焰探测器
|
||||
flame_detector1 = data.flame_detector1;
|
||||
flame_detector2 = data.flame_detector2;
|
||||
|
||||
//气体浓度
|
||||
h2_concentration1 = data.h2_concentration1 * 0.01;
|
||||
h2_concentration2 = data.h2_concentration2 * 0.01;
|
||||
h2_concentration3 = data.h2_concentration3 * 0.01;
|
||||
o2_concentration1 = data.o2_concentration1 * 0.01;
|
||||
o2_concentration2 = data.o2_concentration2 * 0.01;
|
||||
ch3oh_concentration1 = data.ch3oh_concentration1 * 0.01;
|
||||
ch3oh_concentration2 = data.ch3oh_concentration2 * 0.01;
|
||||
|
||||
//保留字段
|
||||
for(int i=0; i<10; i++) {
|
||||
reserved1[i] = data.reserved1[i];
|
||||
}
|
||||
|
||||
//仪表舱参数
|
||||
cabin_ox_concentration = data.cabin_ox_concentration * 0.1;
|
||||
cabin_temperature = static_cast<int16_t>(data.cabin_temperature) * 0.1;
|
||||
cabin_humidity = data.cabin_humidity * 0.1;
|
||||
cabin_pressure = data.cabin_pressure * 0.2;
|
||||
|
||||
//动力舱参数
|
||||
power_cabin_ox_concentration = data.power_cabin_ox_concentration * 0.1;
|
||||
power_cabin_temperature = static_cast<int16_t>(data.power_cabin_temperature) * 0.1;
|
||||
power_cabin_humidity = data.power_cabin_humidity * 0.1;
|
||||
power_cabin_pressure = data.power_cabin_pressure * 0.2;
|
||||
|
||||
//电池报警标志
|
||||
for(int i=0; i<6; i++) {
|
||||
dyn_alarm_flag[i] = data.dyn_alarm_flag[i];
|
||||
ins_alarm_flag[i] = data.ins_alarm_flag[i];
|
||||
}
|
||||
|
||||
//继电器状态
|
||||
ins_relay_status1 = data.ins_relay_status1;
|
||||
ins_relay_status2 = data.ins_relay_status2;
|
||||
dyn_relay_status1 = data.dyn_relay_status1;
|
||||
dyn_relay_status2 = data.dyn_relay_status2;
|
||||
|
||||
//电池功率参数
|
||||
ins_max_discharge_power = data.ins_max_discharge_power * 0.05;
|
||||
dyn_max_discharge_power = data.dyn_max_discharge_power * 0.05;
|
||||
|
||||
//电池SOC
|
||||
ins_soc = static_cast<int>(data.ins_soc);
|
||||
dyn_soc = static_cast<int>(data.dyn_soc);
|
||||
|
||||
//电池能量
|
||||
ins_total_energy = data.ins_total_energy * 0.1;
|
||||
dyn_total_energy = data.dyn_total_energy * 0.1;
|
||||
|
||||
//电池输入功率
|
||||
ins_power_input = data.ins_power_input * 0.1;
|
||||
dyn_power_input = data.dyn_power_input * 0.1;
|
||||
|
||||
//电池充放电状态
|
||||
ins_charge_status = data.ins_charge_status;
|
||||
dyn_charge_status = data.dyn_charge_status;
|
||||
|
||||
//电池电压电流
|
||||
ins_voltage_link = data.ins_voltage_link * 0.01;
|
||||
ins_voltage_pack = data.ins_voltage_pack * 0.01;
|
||||
ins_current = static_cast<int16_t>(data.ins_current) * 0.01;
|
||||
ins_resistance_pos = data.ins_resistance_pos;
|
||||
ins_resistance_neg = data.ins_resistance_neg;
|
||||
dyn_voltage_link = data.dyn_voltage_link * 0.01;
|
||||
dyn_voltage_pack = data.dyn_voltage_pack * 0.01;
|
||||
dyn_current = static_cast<int16_t>(data.dyn_current) * 0.05;
|
||||
dyn_resistance_pos = data.dyn_resistance_pos;
|
||||
dyn_resistance_neg = data.dyn_resistance_neg;
|
||||
|
||||
//紧急状态
|
||||
ins_emergency_status = data.ins_emergency_status;
|
||||
dyn_emergency_status = data.dyn_emergency_status;
|
||||
|
||||
//保留字段
|
||||
for(int i=0; i<2; i++) {
|
||||
reserved2[i] = data.reserved2[i];
|
||||
}
|
||||
|
||||
//SOC门限值
|
||||
ins_soc_threshold1 = data.ins_soc_threshold1;
|
||||
ins_soc_threshold2 = data.ins_soc_threshold2;
|
||||
ins_soc_threshold3 = data.ins_soc_threshold3;
|
||||
|
||||
//功率限制值
|
||||
ins_power_limit1 = data.ins_power_limit1;
|
||||
ins_power_limit2 = data.ins_power_limit2;
|
||||
|
||||
//设备在线状态
|
||||
device_online_flag1 = data.device_online_flag1;
|
||||
device_online_flag2 = data.device_online_flag2;
|
||||
|
||||
//心跳计数器
|
||||
heartbeat = data.heartbeat;
|
||||
}
|
||||
void updateSystemData(disHighVolBusState data){
|
||||
//断路器状态 (0x55 1 0xAA 0 0x5A 2)
|
||||
power_bus_status.fuelCellCircuitBreaker = data.fuelCellCircuitBreaker == 0x55 ? 1 :
|
||||
(data.fuelCellCircuitBreaker == 0xAA ? 0 : 2);
|
||||
power_bus_status.powerLithiumBatteryCircuitBreaker = data.powerLithiumBatteryCircuitBreaker == 0x55 ? 1 :
|
||||
(data.powerLithiumBatteryCircuitBreaker == 0xAA ? 0 : 2);
|
||||
power_bus_status.propulsionMotorCircuitBreaker = data.propulsionMotorCircuitBreaker == 0x55 ? 1 :
|
||||
(data.propulsionMotorCircuitBreaker == 0xAA ? 0 : 2);
|
||||
power_bus_status.lithiumBatteryGroupInstrumentCircuitBreaker = data.lithiumBatteryGroupInstrumentCircuitBreaker == 0x55 ? 1 :
|
||||
(data.lithiumBatteryGroupInstrumentCircuitBreaker == 0xAA ? 0 : 2);
|
||||
power_bus_status.dcDc5ModuleCircuitBreaker = data.dcDc5ModuleCircuitBreaker == 0x55 ? 1 :
|
||||
(data.dcDc5ModuleCircuitBreaker == 0xAA ? 0 : 2);
|
||||
power_bus_status.bowHighVoltageDistributionBoxCircuitBreaker = data.bowHighVoltageDistributionBoxCircuitBreaker == 0x55 ? 1 :
|
||||
(data.bowHighVoltageDistributionBoxCircuitBreaker == 0xAA ? 0 : 2);
|
||||
power_bus_status.sternFTDevice45CircuitBreaker = data.sternFTDevice45CircuitBreaker == 0x55 ? 1 :
|
||||
(data.sternFTDevice45CircuitBreaker == 0xAA ? 0 : 2);
|
||||
power_bus_status.sternRudderSwitch1CircuitBreaker = data.sternRudderSwitch1CircuitBreaker == 0x55 ? 1 :
|
||||
(data.sternRudderSwitch1CircuitBreaker == 0xAA ? 0 : 2);
|
||||
power_bus_status.sternRudderSwitch2CircuitBreaker = data.sternRudderSwitch2CircuitBreaker == 0x55 ? 1 :
|
||||
(data.sternRudderSwitch2CircuitBreaker == 0xAA ? 0 : 2);
|
||||
power_bus_status.fbReservedCircuitBreaker = data.fbReservedCircuitBreaker == 0x55 ? 1 :
|
||||
(data.fbReservedCircuitBreaker == 0xAA ? 0 : 2);
|
||||
power_bus_status.tyzReservedCircuitBreaker = data.tyzReservedCircuitBreaker == 0x55 ? 1 :
|
||||
(data.tyzReservedCircuitBreaker == 0xAA ? 0 : 2);
|
||||
power_bus_status.reservedCircuitBreaker = data.reservedCircuitBreaker == 0x55 ? 1 :
|
||||
(data.reservedCircuitBreaker == 0xAA ? 0 : 2);
|
||||
|
||||
//模块状态
|
||||
power_bus_status.dcDcModuleStatus = data.dcDcFaultWord1;
|
||||
power_bus_status.coolingSystemStatus = data.dcDcFaultWord2;
|
||||
|
||||
//绝缘状态
|
||||
power_bus_status.powerBusInsulationStatus = data.powerBusInsulationStatus == 0x55 ? 0 : 1;
|
||||
power_bus_status.aBusInsulationStatus = data.aBusInsulationStatus == 0x55 ? 0 : 1;
|
||||
|
||||
//电源状态
|
||||
power_bus_status.meterPowerLossSignal = data.meterPowerLossSignal == 0x55 ? 0 : 1;
|
||||
power_bus_status.emergencyPowerLossSignal = data.emergencyPowerLossSignal == 0x55 ? 0 : 1;
|
||||
|
||||
//温度
|
||||
power_bus_status.dcDcTemperature = data.dcDcTemperature;
|
||||
|
||||
//电压电流参数
|
||||
power_bus_status.powerBusVoltage = data.powerBusVoltage;
|
||||
power_bus_status.dcDc5ModuleCurrent = data.dcDc5ModuleCurrent;
|
||||
power_bus_status.powerBusCurrent = data.powerBusCurrent;
|
||||
power_bus_status.busbarAVoltage = data.busbarAVoltage;
|
||||
power_bus_status.propulsionMotorControlBoxCurrent = data.propulsionMotorControlBoxCurrent;
|
||||
power_bus_status.busbarACurrent = data.busbarACurrent;
|
||||
power_bus_status.lithiumBatteryGroupMeterCurrent = data.lithiumBatteryGroupMeterCurrent;
|
||||
power_bus_status.bowHighVoltageDistributionBoxCurrent = data.bowHighVoltageDistributionBoxCurrent;
|
||||
power_bus_status.sternFTDevice45Current = data.sternFTDevice45Current;
|
||||
power_bus_status.tyzReservedSwitchCurrent = data.tyzReservedSwitchCurrent;
|
||||
power_bus_status.sternRudderSwitch1Current = data.sternRudderSwitch1Current;
|
||||
power_bus_status.reservedCurrent1 = data.reservedCurrent1;
|
||||
power_bus_status.sternRudderSwitch2Current = data.sternRudderSwitch2Current;
|
||||
power_bus_status.reservedCurrent2 = data.reservedCurrent2;
|
||||
power_bus_status.fbReservedSwitchCurrent = data.fbReservedSwitchCurrent;
|
||||
power_bus_status.reservedCurrent3 = data.reservedCurrent3;
|
||||
|
||||
//冷却水压力
|
||||
power_bus_status.coolWaterPressure = data.coolWaterPressure;
|
||||
};
|
||||
void updateSystemData(disHighAVolBusState data){
|
||||
//断路器状态 (0x55 1 0xAA 0 0x5A 2)
|
||||
power_a_bus_status.bowFTDevice123CircuitBreaker = data.bowFTDevice123CircuitBreaker == 0x55 ? 1 :
|
||||
(data.bowFTDevice123CircuitBreaker == 0xAA ? 0 : 2);
|
||||
power_a_bus_status.actuatorCircuitBreaker = data.actuatorCircuitBreaker == 0x55 ? 1 :
|
||||
(data.actuatorCircuitBreaker == 0xAA ? 0 : 2);
|
||||
power_a_bus_status.mastSteeringGearControlBoxCircuitBreaker = data.mastSteeringGearControlBoxCircuitBreaker == 0x55 ? 1 :
|
||||
(data.mastSteeringGearControlBoxCircuitBreaker == 0xAA ? 0 : 2);
|
||||
power_a_bus_status.xczCircuitBreaker = data.xczCircuitBreaker == 0x55 ? 1 :
|
||||
(data.xczCircuitBreaker == 0xAA ? 0 : 2);
|
||||
power_a_bus_status.bowRudderControlBoxCircuitBreaker = data.bowRudderControlBoxCircuitBreaker == 0x55 ? 1 :
|
||||
(data.bowRudderControlBoxCircuitBreaker == 0xAA ? 0 : 2);
|
||||
power_a_bus_status.openWaterCoverStartCylinderCircuitBreaker = data.openWaterCoverStartCylinderCircuitBreaker == 0x55 ? 1 :
|
||||
(data.openWaterCoverStartCylinderCircuitBreaker == 0xAA ? 0 : 2);
|
||||
|
||||
//电源状态
|
||||
power_a_bus_status.instrumentPowerFailureSignal = data.instrumentPowerFailureSignal == 0x55 ? 0 : 1;
|
||||
power_a_bus_status.emergencyPowerFailureSignal = data.emergencyPowerFailureSignal == 0x55 ? 0 : 1;
|
||||
|
||||
//浸水报警
|
||||
power_a_bus_status.waterIngressionAlarm = data.waterIngressionAlarm;
|
||||
|
||||
//电压电流参数
|
||||
power_a_bus_status.busbarBVoltage = data.busbarBVoltage;
|
||||
power_a_bus_status.busbarBCurrent = data.busbarBCurrent;
|
||||
power_a_bus_status.bowFTDevice123Current = data.bowFTDevice123Current;
|
||||
power_a_bus_status.actuatorCurrent = data.actuatorCurrent;
|
||||
power_a_bus_status.mastSteeringGearControlBoxCurrent = data.mastSteeringGearControlBoxCurrent;
|
||||
power_a_bus_status.xczCurrent = data.xczCurrent;
|
||||
power_a_bus_status.bowRudderControlBoxCurrent = data.bowRudderControlBoxCurrent;
|
||||
power_a_bus_status.openWaterCoverStartCylinderCurrent = data.openWaterCoverStartCylinderCurrent;
|
||||
};
|
||||
void updateSystemData(disLowMainBusState data){
|
||||
//断路器状态 (0x55 1 0xAA 0 0x5A 2)
|
||||
instrument_main_bus_status.lithiumBatteryGroupInstrumentCircuitBreaker = data.lithiumBatteryGroupInstrumentCircuitBreaker == 0x55 ? 1 :
|
||||
(data.lithiumBatteryGroupInstrumentCircuitBreaker == 0xAA ? 0 : 2);
|
||||
instrument_main_bus_status.bowLowVoltageDistributionBoxCircuitBreaker = data.bowLowVoltageDistributionBoxCircuitBreaker == 0x55 ? 1 :
|
||||
(data.bowLowVoltageDistributionBoxCircuitBreaker == 0xAA ? 0 : 2);
|
||||
instrument_main_bus_status.unit4InstrumentDC48VCircuitBreaker = data.unit4InstrumentDC48VCircuitBreaker == 0x55 ? 1 :
|
||||
(data.unit4InstrumentDC48VCircuitBreaker == 0xAA ? 0 : 2);
|
||||
instrument_main_bus_status.dcC1DCDistributionPanelCircuitBreaker = data.dcC1DCDistributionPanelCircuitBreaker == 0x55 ? 1 :
|
||||
(data.dcC1DCDistributionPanelCircuitBreaker == 0xAA ? 0 : 2);
|
||||
instrument_main_bus_status.reservedCircuitBreaker1 = data.reservedCircuitBreaker1 == 0x55 ? 1 :
|
||||
(data.reservedCircuitBreaker1 == 0xAA ? 0 : 2);
|
||||
instrument_main_bus_status.reservedCircuitBreaker2 = data.reservedCircuitBreaker2 == 0x55 ? 1 :
|
||||
(data.reservedCircuitBreaker2 == 0xAA ? 0 : 2);
|
||||
instrument_main_bus_status.emergencyLithiumBatteryGroup2CircuitBreaker = data.emergencyLithiumBatteryGroup2CircuitBreaker == 0x55 ? 1 :
|
||||
(data.emergencyLithiumBatteryGroup2CircuitBreaker == 0xAA ? 0 : 2);
|
||||
|
||||
//电源状态
|
||||
instrument_main_bus_status.instrumentPowerFailureSignal = data.instrumentPowerFailureSignal == 0x55 ? 0 : 1;
|
||||
instrument_main_bus_status.emergencyPowerFailureSignal = data.emergencyPowerFailureSignal == 0x55 ? 0 : 1;
|
||||
|
||||
//绝缘状态
|
||||
instrument_main_bus_status.instrumentBusbarInsulationLow = data.instrumentBusbarInsulationLow == 0x55 ? 0 : 1;
|
||||
|
||||
//电压电流参数
|
||||
instrument_main_bus_status.instrumentBusbarVoltage = data.instrumentBusbarVoltage;
|
||||
instrument_main_bus_status.bowLowVoltageDistributionBoxCurrent = data.bowLowVoltageDistributionBoxCurrent;
|
||||
instrument_main_bus_status.dcC1InstrumentDC48VCurrent = data.dcC1InstrumentDC48VCurrent;
|
||||
instrument_main_bus_status.reservedCurrent1 = data.reservedCurrent1;
|
||||
instrument_main_bus_status.emergencyLithiumBatteryGroup2Current = data.emergencyLithiumBatteryGroup2Current;
|
||||
instrument_main_bus_status.lithiumBatteryGroupInstrumentCurrent = data.lithiumBatteryGroupInstrumentCurrent;
|
||||
instrument_main_bus_status.unit4InstrumentDC48VCurrent = data.unit4InstrumentDC48VCurrent;
|
||||
instrument_main_bus_status.reservedCurrent2 = data.reservedCurrent2;
|
||||
instrument_main_bus_status.emergency2BusbarVoltage = data.emergency2BusbarVoltage;
|
||||
instrument_main_bus_status.compositeEnergyManagementSystemEmergencyDC48VCurrent = data.compositeEnergyManagementSystemEmergencyDC48VCurrent;
|
||||
instrument_main_bus_status.fuelCellSecuritySystemEmergencyDC48VCurrent = data.fuelCellSecuritySystemEmergencyDC48VCurrent;
|
||||
instrument_main_bus_status.plcControlPowerCurrent = data.plcControlPowerCurrent;
|
||||
}
|
||||
void updateSystemData(disLowBusState data){
|
||||
//断路器状态 (0x55 1 0xAA 0 0x5A 2)
|
||||
instrument_bus_status.unit1CircuitBreaker = data.unit1CircuitBreaker == 0x55 ? 1 :
|
||||
(data.unit1CircuitBreaker == 0xAA ? 0 : 2);
|
||||
instrument_bus_status.unit2CircuitBreaker = data.unit2CircuitBreaker == 0x55 ? 1 :
|
||||
(data.unit2CircuitBreaker == 0xAA ? 0 : 2);
|
||||
instrument_bus_status.unit3CircuitBreaker = data.unit3CircuitBreaker == 0x55 ? 1 :
|
||||
(data.unit3CircuitBreaker == 0xAA ? 0 : 2);
|
||||
instrument_bus_status.unit5CircuitBreaker = data.unit5CircuitBreaker == 0x55 ? 1 :
|
||||
(data.unit5CircuitBreaker == 0xAA ? 0 : 2);
|
||||
instrument_bus_status.bowPZDeviceCircuitBreaker = data.bowPZDeviceCircuitBreaker == 0x55 ? 1 :
|
||||
(data.bowPZDeviceCircuitBreaker == 0xAA ? 0 : 2);
|
||||
instrument_bus_status.reservedCircuitBreaker1 = data.reservedCircuitBreaker1 == 0x55 ? 1 :
|
||||
(data.reservedCircuitBreaker1 == 0xAA ? 0 : 2);
|
||||
instrument_bus_status.reservedCircuitBreaker2 = data.reservedCircuitBreaker2 == 0x55 ? 1 :
|
||||
(data.reservedCircuitBreaker2 == 0xAA ? 0 : 2);
|
||||
instrument_bus_status.emergencyLithiumBatteryGroup1CircuitBreaker = data.emergencyLithiumBatteryGroup1CircuitBreaker == 0x55 ? 1 :
|
||||
(data.emergencyLithiumBatteryGroup1CircuitBreaker == 0xAA ? 0 : 2);
|
||||
|
||||
//电源状态
|
||||
instrument_bus_status.powerFailureSignal = data.powerFailureSignal == 0x55 ? 0 : 1;
|
||||
instrument_bus_status.emergencyPowerFailureSignal = data.emergencyPowerFailureSignal == 0x55 ? 0 : 1;
|
||||
|
||||
//浸水报警
|
||||
instrument_bus_status.waterIngressionAlarm = data.waterIngressionAlarm;
|
||||
|
||||
//电压电流参数
|
||||
instrument_bus_status.instrumentBusbarVoltage = data.instrumentBusbarVoltage;
|
||||
instrument_bus_status.instrumentBusbarCurrent = data.instrumentBusbarCurrent;
|
||||
instrument_bus_status.unit1Current = data.unit1Current;
|
||||
instrument_bus_status.unit2Current = data.unit2Current;
|
||||
instrument_bus_status.unit3Current = data.unit3Current;
|
||||
instrument_bus_status.unit5Current = data.unit5Current;
|
||||
instrument_bus_status.bowPZDeviceCurrent = data.bowPZDeviceCurrent;
|
||||
instrument_bus_status.emergencyLithiumBatteryGroup1Current = data.emergencyLithiumBatteryGroup1Current;
|
||||
instrument_bus_status.emergency1BusbarVoltage = data.emergency1BusbarVoltage;
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
#endif
|
||||
@@ -396,7 +396,9 @@ bool udpComm::sendDisSysCmd(const disHighVolBusCmd cmd)
|
||||
msg->header.id = DIS_HVBUS_CMD_ID;
|
||||
msg->header.start1 = DIS_MSG_HEAD1;
|
||||
msg->header.start2 = DIS_MSG_HEAD2;
|
||||
msg->header.length = sizeof(disHighVolBusCmd);
|
||||
//TODO : 阈字节长度固定了,后续会修改
|
||||
msg->header.length = 18;
|
||||
// msg->header.length = sizeof(disHighVolBusCmd);
|
||||
msg->data = cmd;
|
||||
msgBuf = reinterpret_cast<unsigned char *>(msg);
|
||||
cc = calculateChecksum(msgBuf,sizeof(msg_disHVBCmd));
|
||||
@@ -422,7 +424,9 @@ bool udpComm::sendDisSysCmd(const disHighAVolBusCmd cmd)
|
||||
msg->header.id = DIS_HVBUSA_CMD_ID;
|
||||
msg->header.start1 = DIS_MSG_HEAD1;
|
||||
msg->header.start2 = DIS_MSG_HEAD2;
|
||||
msg->header.length = sizeof(disHighAVolBusCmd);
|
||||
//TODO : 阈字节长度固定了,后续会修改
|
||||
msg->header.length = 6;
|
||||
// msg->header.length = sizeof(disHighAVolBusCmd);
|
||||
msg->data = cmd;
|
||||
msgBuf = reinterpret_cast<unsigned char *>(msg);
|
||||
cc = calculateChecksum(msgBuf,sizeof(msg_disHVBACmd));
|
||||
@@ -447,7 +451,9 @@ bool udpComm::sendDisSysCmd(const disHighBVolBusCmd cmd)
|
||||
msg->header.id = DIS_HVBUSB_CMD_ID;
|
||||
msg->header.start1 = DIS_MSG_HEAD1;
|
||||
msg->header.start2 = DIS_MSG_HEAD2;
|
||||
msg->header.length = sizeof(disHighBVolBusCmd);
|
||||
//TODO : 阈字节长度固定了,后续会修改
|
||||
msg->header.length = 8;
|
||||
// msg->header.length = sizeof(disHighBVolBusCmd);
|
||||
msg->data = cmd;
|
||||
msgBuf = reinterpret_cast<unsigned char *>(msg);
|
||||
cc = calculateChecksum(msgBuf,sizeof(msg_disHVBBCmd));
|
||||
@@ -473,7 +479,9 @@ bool udpComm::sendDisSysCmd(const disLowBusCmd cmd)
|
||||
msg->header.id = DIS_LVBUS_CMD_ID;
|
||||
msg->header.start1 = DIS_MSG_HEAD1;
|
||||
msg->header.start2 = DIS_MSG_HEAD2;
|
||||
msg->header.length = sizeof(disLowBusCmd);
|
||||
//TODO : 阈字节长度固定了,后续会修改
|
||||
msg->header.length = 8;
|
||||
// msg->header.length = sizeof(disLowBusCmd);
|
||||
msg->data = cmd;
|
||||
msgBuf = reinterpret_cast<unsigned char *>(msg);
|
||||
cc = calculateChecksum(msgBuf,sizeof(msg_disLVBCmd));
|
||||
|
||||
@@ -52,6 +52,7 @@ public:
|
||||
bool sendMsg(const unsigned char* msg,unsigned int size){
|
||||
// cout << "sendMsgTo" << ccuHost << ":" << ccuPort << endl;
|
||||
udpScoket->iSendMessageTo((void*) msg, size, ccuPort, ccuHost);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user