增加了网页服务

This commit is contained in:
zjk
2025-05-16 01:08:12 +08:00
parent 47079f79df
commit e0b3e986c7
27 changed files with 31713 additions and 156 deletions
+6 -1
View File
@@ -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
+22 -18
View File
@@ -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;
+1 -1
View File
@@ -39,7 +39,7 @@ public:
// 发送CCU控制命令
bool sendCcuCommand(const ccuColCmd cmd);
bool sendDisSysCommand(const disSysBreakerList& cmd);
// 获取通信状态
int getConnectionState() const { return m_connectState; }
+13 -25
View File
@@ -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:更新协议
+6 -6
View File
@@ -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--------<-- */
/* | | */
+1 -16
View File
@@ -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
View File
@@ -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()
+4 -1
View File
@@ -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){
+2 -1
View File
@@ -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);
//
+257
View File
@@ -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_;
}
+57
View File
@@ -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
+616
View File
@@ -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
+5 -2
View File
@@ -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
+328
View File
@@ -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;
+7
View File
@@ -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);
};
+661
View File
@@ -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
+12 -4
View File
@@ -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));
+1
View File
@@ -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;
}