增加了xc声纳的上电

This commit is contained in:
zjk
2025-09-12 11:35:17 +08:00
parent c2b9bccfc6
commit 481171d9ea
43 changed files with 1921 additions and 296 deletions
+1
View File
@@ -63,6 +63,7 @@ SET(SRC
LowerCommManager.cpp
UpperCommManager.cpp
# loguru.cpp
upmsg/upmsg_definitions.cpp
)
ADD_EXECUTABLE(pPowerManger ${SRC})
+27 -7
View File
@@ -77,17 +77,37 @@ bool LowerCommManager::initUdpComm(){
}
void LowerCommManager::processPeriodicTasks() {
sendCcuCommand(m_pm->m_CcuColCmd);
// cout << "send ccu command" << endl;
m_pm->m_db->insertData(m_pm->m_CcuColCmd);
//延时5ms
usleep(5000);
// sendDisSysCommand(m_pm->m_targetDisBreakerState);
// if(m_pm->m_systemData->device_common_status.dis_hv_c1.isTimeout)
// {
// }
if(m_pm->m_systemData->device_common_status.dis_hv_c1.isTimeout )
{
disHighVolBusCmd clr1{};
m_udpComm->sendDisSysCmd(clr1);
MOOSPause(200);
}
if(m_pm->m_systemData->device_common_status.dis_lv_c1.isTimeout )
{
disHighBVolBusCmd clr3{};
m_udpComm->sendDisSysCmd(clr3);
MOOSPause(200);
}
m_udpComm->clearMsgQueue();
}
void LowerCommManager::operate_hold()
{
disHighVolBusCmd clr1{};
disHighAVolBusCmd clr2{};
disHighBVolBusCmd clr3{};
disLowBusCmd clr4{};
m_udpComm->sendDisSysCmd(clr1);
MOOSPause(200);
m_udpComm->sendDisSysCmd(clr2);
MOOSPause(200);
m_udpComm->sendDisSysCmd(clr3);
MOOSPause(200);
m_udpComm->sendDisSysCmd(clr4);
}
bool LowerCommManager::sendCcuCommand(const ccuColCmd cmd){
// m_pm->m_db->insertCcuSysCmd(cmd);
if(!m_udpComm->sendCcuColCmd(cmd))
+3
View File
@@ -80,6 +80,9 @@ public:
bool operate_LVA_reservedCircuit1_Breaker(char opt);
bool operate_LVA_reservedCircuit2_Breaker(char opt);
bool operate_LVA_mergencyLithiumBatteryGroup1Circuit_Breaker(char opt);
//保持指令
void operate_hold();
//================================复合管控器操作函数====================================
// 发送CCU控制命令
bool sendCcuCommand(const ccuColCmd cmd);
+33 -21
View File
@@ -21,6 +21,12 @@ bool _FsmCB(void * pParam)
return pMe->FsmLoop();
}
bool _CommCB(void * pParam)
{
PowerManger* pMe = (PowerManger* )pParam;
return pMe->commLoop();
}
//---------------------------------------------------------
// Constructor()
@@ -78,6 +84,7 @@ PowerManger::PowerManger()
PowerManger::~PowerManger()
{
m_commThread.Stop();
delete m_db;
delete m_lowerCommManager;
delete m_upperCommManager;
@@ -154,12 +161,12 @@ bool PowerManger::Iterate()
// 更新系统数据
m_systemData->updateCommonStatus();
// m_CcuColCmd.heartbeat
if (m_ticker++ % 5 == 0)
{
m_CcuColCmd.heartbeat++;
m_lowerCommManager->processPeriodicTasks();
m_upperCommManager->processPeriodicTasks();
}
// if (m_ticker++ % 5 == 0)
// {
// m_CcuColCmd.heartbeat++;
// m_lowerCommManager->processPeriodicTasks();
// m_upperCommManager->processPeriodicTasks();
// }
return(true);
}
@@ -203,6 +210,10 @@ bool PowerManger::OnStartUp()
PowerManagerFsm::start();
InitEvent initEvent;
PowerManagerFsm::dispatch(initEvent);
//初始化通信线程
m_commThread.Initialise(_CommCB,this);
m_commThread.Start();
return(true);
}
@@ -224,6 +235,9 @@ void PowerManger::registerVariables()
Register(DB_TO_PM_SETPMSYS,0);
Register(DB_TO_PM_SETDEVSWITCH,0);
Register(DB_TO_PM_TASKSTOP,0);
Register(uDetect_xcVoltage_cmd::key,0);
Register(uDetect_zdpVoltage_cmd::key,0);
}
@@ -249,20 +263,6 @@ bool PowerManger::buildReport()
bool PowerManger::FsmLoop()
{
//状态机循环
// while (!m_FsmThread.IsQuitRequested())
// {
// // // 检查故障并触发事件
// // if(int error = checkError()) {
// // m_fsm.triggerFaultEvent(error);
// // } else {
// // // 自动状态转换由状态机内部处理
// // MOOSPause(1000);
// // }
// //延时1s
// usleep(1000000);
// }
return true;
}
@@ -278,7 +278,6 @@ int PowerManger::checkError()
// m_pmCurrentState.ccustate.fcuGZ_3L != 0 ||
// m_pmCurrentState.ccustate.insEmergencyStatusWord != 0)
return 0;
//2.检查断路器状态
}
void PowerManger::printState(const std::string& stateName, const std::string& desp){
@@ -360,6 +359,19 @@ unsigned char PowerManger::getFaultLevel()
return maxLevel;
}
bool PowerManger::commLoop()
{
while(!m_commThread.IsQuitRequested())
{
m_CcuColCmd.heartbeat++;
m_lowerCommManager->processPeriodicTasks();
m_upperCommManager->processPeriodicTasks();
// 延时1秒
usleep(1000000);
}
return true;
}
void PowerManger::injectFault(unsigned type,unsigned int faultCode){
LOG_F(INFO, "注入故障: %d %d", type, faultCode);
TestEvent testEvent("故障注入测试",type,faultCode);
+2 -1
View File
@@ -124,7 +124,7 @@ class PowerManger : public AppCastingMOOSApp
void initControlCmd();
public:
// CMOOSThread m_FsmThread;
CMOOSThread m_commThread;
LowerCommManager* m_lowerCommManager;
UpperCommManager* m_upperCommManager;
@@ -136,6 +136,7 @@ class PowerManger : public AppCastingMOOSApp
bool FSM_RUN_IS_OK = true;
//==================================================================================
bool commLoop();
int checkError();
bool sendNotification(const std::string& key, const std::string& value) {
+22
View File
@@ -153,6 +153,28 @@ bool UpperCommManager::processUpperMsg(const string& key, const string& strJson)
LOG_F(WARNING, "task stop error:%s", strJson.c_str());
return false;
}
}
else if(key == uDetect_xcVoltage_cmd::key)
{
uDetect_xcVoltage_cmd xcCmd;
xcCmd.fromJsonString(strJson);
SideSonarCmd sideSonarCmd;
sideSonarCmd.xcHighVoltageAdd = xcCmd.xcHighVoltageAdd_int32;
sideSonarCmd.xcLowVoltageAdd = xcCmd.xcLowVoltageAdd_int32;
PowerManagerFsm::dispatch(sideSonarCmd);
return true;
}
else if(key == uDetect_zdpVoltage_cmd::key)
{
uDetect_zdpVoltage_cmd zdpCmd;
zdpCmd.fromJsonString(strJson);
DevCmdExt devCmdExt;
devCmdExt.id = DeviceId::lowFreqSonar;
devCmdExt.cmd = zdpCmd.zdpVoltageAdd_int32;
PowerManagerFsm::dispatch(devCmdExt);
LOG_F(INFO, "set dev switch success");
return true;
};
LOG_F(WARNING, "Unknown key: %s", key.c_str());
return false;
+2 -1
View File
@@ -25,7 +25,8 @@
#include "upmsg/uExternComm_setPowerSystem.h"
#include "upmsg/uPower_equState.h"
#include "upmsg/uPower_sysState.h"
#include "upmsg/uDetect_zdpVoltage_cmd.h"
#include "upmsg/uDetect_xcVoltage_cmd.h"
#define _DEBUG
using namespace std;
+1
View File
@@ -5,5 +5,6 @@ void InitState::entry() {
PowerManagerFsm::entry();
LOG_F(INFO, "进入初始化状态");
pm->initControlCmd();
pm->m_lowerCommManager->operate_hold();
transit<StandbyState>();
}
+90
View File
@@ -0,0 +1,90 @@
#include "PowerManagerFsm.hpp"
void Lifting::entry() {
PowerManagerFsm::entry();
pm->workCondition = WorkCondition::CHANING;
//1. 关闭所有水声设备
LOG_F(INFO,"前视声纳关机指令");
pm->sendNotification("uExternComm_frontSonarControl_cmd","0");
MOOSPause(10000);
for(auto iter : underWterDevices)
{
pm->m_driver.setDeviceState(pm->m_subDisSysCmd, static_cast<DeviceId::Type>(iter), 0);
}
//2. 关闭动力电设备
//2.1 断开所有艏部高压断路器
pm->m_lowerCommManager->operate_HVA_actuatorCircuit_Breaker(0);
MOOSPause(3);
pm->m_lowerCommManager->operate_HVA_bowFTDevice123Circuit_Breaker(0);
MOOSPause(3);
pm->m_lowerCommManager->operate_HVA_bowRudderControlBoxCircuit_Breaker(0);
MOOSPause(3);
pm->m_lowerCommManager->operate_HVA_mastSteeringGearControlBoxCircuit_Breaker(0);
MOOSPause(3);
pm->m_lowerCommManager->operate_HVA_openWaterCoverStartCylinderCircuit_Breaker(0);
MOOSPause(3);
pm->m_lowerCommManager->operate_HVA_xczCircuit_Breaker(0);
MOOSPause(3);
//2.2 断开所有艉部高压设备断路器
pm->m_lowerCommManager->operate_HV_propulsionMotor_Breaker(0);
MOOSPause(3);
pm->m_lowerCommManager->operate_HV_sternFt45_Breaker(0);
MOOSPause(3);
pm->m_lowerCommManager->operate_HV_sternRudder1_Breaker(0);
MOOSPause(3);
pm->m_lowerCommManager->operate_HV_sternRudder2_Breaker(0);
MOOSPause(3);
pm->m_lowerCommManager->operate_HV_fbReserved_Breaker(0);
MOOSPause(3);
pm->m_lowerCommManager->operate_HV_tyzReserved_Breaker(0);
MOOSPause(3);
pm->m_lowerCommManager->operate_HV_reserved_Breaker(0);
MOOSPause(3);
pm->m_lowerCommManager->operate_HV_dcDc5_Breaker(0);
MOOSPause(3);
pm->m_lowerCommManager->operate_HV_coolingSystem_Breaker(0);
MOOSPause(3);
//2.5 断开动力电断路器
pm->m_lowerCommManager->operate_HV_bowHighVoltageBox_Breaker(0);
MOOSPause(3);
pm->m_lowerCommManager->operate_HV_dcDc5_Breaker(0);
MOOSPause(3);
pm->m_lowerCommManager->operate_HV_coolingSystem_Breaker(0);
MOOSPause(3);
pm->m_lowerCommManager->operate_HV_dcDc5Module_Breaker(0);
MOOSPause(3);
pm->m_lowerCommManager->operate_HV_powerLithiumBattery_Breaker(0);
//3. 关闭燃料电池
//4. 关闭动力锂电池
MOOSPause(3);
{
int count=0;
while (!(pm->m_systemData->dyn_pos_relay_status == 0x02 && pm->m_systemData->dyn_neg_relay_status == 0x02))
{
LOG_F(INFO,"动力锂电池下电中...");
MOOSPause(3);
if(count>10)
{
LOG_F(INFO, "动力锂电池无下电反馈");
break;
}
count++;
}
}
LOG_F(INFO, "动力锂电池已下电");
pm->workCondition = WorkCondition::LIFT_MODE;
LOG_F(INFO, "WorkCondition %d", pm->workCondition);
}
void Lifting::react(MasterCommandEvent const &) {
PowerManagerFsm::handelPowerCmd();
PowerManagerFsm::handleModCmd();
PowerManagerFsm::handleWorkCmd();
}
void Lifting::react(DevCmdExt const &e)
{
LOG_F(INFO, "DevCmdExt 执行");
PowerManagerFsm::react(e);
}
+27
View File
@@ -718,6 +718,30 @@ void PowerManagerFsm::handleFBSystemCmd(int id, int cmd)
}
}
void PowerManagerFsm::react(SideSonarCmd const &e)
{
LOG_F(INFO, "处理探测模块舷侧声纳指令");
if(e.xcHighVoltageAdd == 1)
{
pm->m_lowerCommManager->operate_HVA_xczCircuit_Breaker(1);
pm->m_upperCommManager->processPeriodicTasks();
}
else if(e.xcHighVoltageAdd == 2)
{
pm->m_lowerCommManager->operate_HVA_xczCircuit_Breaker(0);
pm->m_upperCommManager->processPeriodicTasks();
}
if(e.xcLowVoltageAdd == 1)
{
pm->m_driver.setDeviceState(pm->m_subDisSysCmd, DeviceId::sideSonar, (unsigned char)1);
}
else if(e.xcLowVoltageAdd == 2)
{
pm->m_driver.setDeviceState(pm->m_subDisSysCmd, DeviceId::sideSonar, (unsigned char)0);
}
}
void PowerManagerFsm::handleSideSonarCmd(int id, int cmd)
{
if(id == DeviceId::sideSonar)
@@ -2516,6 +2540,7 @@ void PowerManagerFsm::react(FaultEvent const &e)
sensorSystemFault(e);
}
void PowerManagerFsm::handelPowerCmd(){
switch (pm->m_msCmd.powerCMD)
{
@@ -2765,6 +2790,8 @@ void PowerManagerFsm::handleWorkCmd(){
LOG_F(INFO, "收到上位机控制指令:DJ模式");
transit<DJMode>();
break;
case 12:
LOG_F(INFO, "收到上位机控制指令:起吊准备");
default:
break;
}
+13
View File
@@ -44,6 +44,12 @@ struct DevCmdExt : tinyfsm::Event {
DevCmdExt() : id(0), cmd(0) {};
DevCmdExt(int id, int cmd) : id(id), cmd(cmd) {};
};
struct SideSonarCmd : tinyfsm::Event {
int xcLowVoltageAdd;
int xcHighVoltageAdd;
SideSonarCmd() : xcLowVoltageAdd(0),xcHighVoltageAdd(0) {};
SideSonarCmd(int xcLowVoltageAdd,int xcHighVoltageAdd) : xcLowVoltageAdd(xcLowVoltageAdd),xcHighVoltageAdd(xcHighVoltageAdd) {};
};
//==================测试事件================================
struct TestEvent : tinyfsm::Event {
std::string eventName;
@@ -94,6 +100,8 @@ public:
virtual void react(FaultEvent const &e);
virtual void react(TaskStopEvent const &e);
virtual void react(CycleTriggeredEvent const &e);
virtual void react(SideSonarCmd const &e);
//测试事件
virtual void react(TestEvent const &);
@@ -282,5 +290,10 @@ public:
void react(MasterCommandEvent const &) override;
};
class Lifting : public PowerManagerFsm {
public:
void entry() override;
void react(MasterCommandEvent const &) override;
};
#endif // POWER_MANAGER_FSM_HPP
+11 -11
View File
@@ -17,14 +17,14 @@ void ShoreBasedReady::entry() {
pm->m_CcuColCmd.powerBatCmd = BatteryCommand::Start;
//1.2 闭合动力电断路器
pm->m_lowerCommManager->operate_HV_powerLithiumBattery_Breaker(1);
MOOSPause(3);
MOOSPause(100);
pm->m_lowerCommManager->operate_HV_dcDc5Module_Breaker(1);
MOOSPause(3);
MOOSPause(100);
pm->m_lowerCommManager->operate_HV_dcDc5_Breaker(1);
pm->m_lowerCommManager->operate_HV_coolingSystem_Breaker(1);
MOOSPause(10);
MOOSPause(100);
pm->m_lowerCommManager->operate_HV_bowHighVoltageBox_Breaker(1);
MOOSPause(3);
MOOSPause(100);
//2. 启动动力电设备
unsigned char cmd = 1;
//2.0 艉舵
@@ -44,7 +44,7 @@ void ShoreBasedReady::entry() {
pm->m_driver.setDeviceState(pm->m_subDisSysCmd, DeviceId::bowCover5, (unsigned char)cmd);
pm->m_driver.setDeviceState(pm->m_subDisSysCmd, DeviceId::bowCover6, (unsigned char)cmd);
pm->m_upperCommManager->processPeriodicTasks();
MOOSPause(3);
MOOSPause(100);
pm->m_lowerCommManager->operate_HVA_actuatorCircuit_Breaker(1);
//2.2 敞水电缸
pm->m_driver.setDeviceState(pm->m_subDisSysCmd, DeviceId::bowWaterInet1, (unsigned char)cmd);
@@ -56,36 +56,36 @@ void ShoreBasedReady::entry() {
pm->m_driver.setDeviceState(pm->m_subDisSysCmd, DeviceId::bowWaterInet7, (unsigned char)cmd);
pm->m_driver.setDeviceState(pm->m_subDisSysCmd, DeviceId::bowWaterInet8, (unsigned char)cmd);
pm->m_upperCommManager->processPeriodicTasks();
MOOSPause(3);
MOOSPause(100);
pm->m_lowerCommManager->operate_HVA_openWaterCoverStartCylinderCircuit_Breaker(1);
//2.3 艏舵
pm->m_driver.setDeviceState(pm->m_subDisSysCmd, DeviceId::bowRudderDeploy, (unsigned char)cmd);
pm->m_driver.setDeviceState(pm->m_subDisSysCmd, DeviceId::bowRudderServo1, (unsigned char)cmd);
pm->m_upperCommManager->processPeriodicTasks();
MOOSPause(3);
MOOSPause(100);
pm->m_lowerCommManager->operate_HVA_bowRudderControlBoxCircuit_Breaker(1);
//2.4 桅杆舵机
pm->m_driver.setDeviceState(pm->m_subDisSysCmd, DeviceId::mastLiftingServo, (unsigned char)cmd);
pm->m_upperCommManager->processPeriodicTasks();
MOOSPause(3);
MOOSPause(100);
pm->m_lowerCommManager->operate_HVA_mastSteeringGearControlBoxCircuit_Breaker(1);
//2.5 艏部浮调机构
pm->m_driver.setDeviceState(pm->m_subDisSysCmd, DeviceId::buoyancyAdjust1, (unsigned char)cmd);
pm->m_driver.setDeviceState(pm->m_subDisSysCmd, DeviceId::buoyancyAdjust2, (unsigned char)cmd);
pm->m_driver.setDeviceState(pm->m_subDisSysCmd, DeviceId::buoyancyAdjust3, (unsigned char)cmd);
pm->m_upperCommManager->processPeriodicTasks();
MOOSPause(3);
MOOSPause(100);
pm->m_lowerCommManager->operate_HVA_bowFTDevice123Circuit_Breaker(1);
//2.6 艉部浮调机构
pm->m_driver.setDeviceState(pm->m_subDisSysCmd, DeviceId::buoyancyAdjust4, (unsigned char)cmd);
pm->m_driver.setDeviceState(pm->m_subDisSysCmd, DeviceId::buoyancyAdjust5, (unsigned char)cmd);
pm->m_upperCommManager->processPeriodicTasks();
MOOSPause(3);
MOOSPause(100);
pm->m_lowerCommManager->operate_HV_sternFt45_Breaker(1);
//2.7 推进电机
pm->m_driver.setDeviceState(pm->m_subDisSysCmd, DeviceId::thruster, (unsigned char)cmd);
pm->m_upperCommManager->processPeriodicTasks();
MOOSPause(3);
MOOSPause(100);
pm->m_lowerCommManager->operate_HV_propulsionMotor_Breaker(1);
pm->workCondition = WorkCondition::SHORE_BASED_READY;
LOG_F(INFO, "进入岸基备航状态");
+1
View File
@@ -5,6 +5,7 @@ void StandbyState::entry() {
PowerManagerFsm::entry();
pm->workCondition = WorkCondition::STANDBY;
pm->m_driver.getSTANDBYTable(&pm->m_subDisSysCmd);
pm->m_lowerCommManager->operate_hold();
LOG_F(INFO, "WorkCondition %d", pm->workCondition);
}
void StandbyState::react(StandbyEvent const &) {
+72
View File
@@ -891,6 +891,44 @@ const std::string DATA_HTML = R"(
</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="emergency-battery1-voltage">正在加载...</span>
</div>
<div class="data-item">
<span class="data-label">应急电池1总电流:</span>
<span class="data-value" id="emergency-battery1-current">正在加载...</span>
</div>
<div class="data-item">
<span class="data-label">应急电池1最高温度:</span>
<span class="data-value" id="emergency-battery1-max-temp">正在加载...</span>
</div>
<div class="data-item">
<span class="data-label">应急电池1故障字:</span>
<span class="data-value" id="emergency-battery1-fault-word">正在加载...</span>
</div>
<div class="data-item">
<span class="data-label">应急电池2总电压:</span>
<span class="data-value" id="emergency-battery2-voltage">正在加载...</span>
</div>
<div class="data-item">
<span class="data-label">应急电池2总电流:</span>
<span class="data-value" id="emergency-battery2-current">正在加载...</span>
</div>
<div class="data-item">
<span class="data-label">应急电池2最高温度:</span>
<span class="data-value" id="emergency-battery2-max-temp">正在加载...</span>
</div>
<div class="data-item">
<span class="data-label">应急电池2故障字:</span>
<span class="data-value" id="emergency-battery2-fault-word">正在加载...</span>
</div>
</div>
</div>
<button class="collapsible">其他系统参数</button>
<div class="content">
<div class="system-data-grid">
@@ -1682,6 +1720,40 @@ if (data.power_a_bus_status) {
if (data.timestamp !== undefined) {
document.getElementById('timestamp').textContent = new Date(data.timestamp).toLocaleString();
}
// 应急电池数据
if (data.emergency_battery1 && data.emergency_battery1.voltage !== undefined) {
document.getElementById('emergency-battery1-voltage').textContent =
data.emergency_battery1.voltage.toFixed(2) + ' V';
}
if (data.emergency_battery1 && data.emergency_battery1.current !== undefined) {
document.getElementById('emergency-battery1-current').textContent =
data.emergency_battery1.current.toFixed(2) + ' A';
}
if (data.emergency_battery1 && data.emergency_battery1.max_temp !== undefined) {
document.getElementById('emergency-battery1-max-temp').textContent =
data.emergency_battery1.max_temp.toFixed(1) + ' °C';
}
if (data.emergency_battery1 && data.emergency_battery1.fault_word !== undefined) {
document.getElementById('emergency-battery1-fault-word').textContent =
'0x' + data.emergency_battery1.fault_word.toString(16).toUpperCase();
}
if (data.emergency_battery2 && data.emergency_battery2.voltage !== undefined) {
document.getElementById('emergency-battery2-voltage').textContent =
data.emergency_battery2.voltage.toFixed(2) + ' V';
}
if (data.emergency_battery2 && data.emergency_battery2.current !== undefined) {
document.getElementById('emergency-battery2-current').textContent =
data.emergency_battery2.current.toFixed(2) + ' A';
}
if (data.emergency_battery2 && data.emergency_battery2.max_temp !== undefined) {
document.getElementById('emergency-battery2-max-temp').textContent =
data.emergency_battery2.max_temp.toFixed(1) + ' °C';
}
if (data.emergency_battery2 && data.emergency_battery2.fault_word !== undefined) {
document.getElementById('emergency-battery2-fault-word').textContent =
'0x' + data.emergency_battery2.fault_word.toString(16).toUpperCase();
}
}
// 充放电状态文本转换
@@ -579,6 +579,30 @@ void HttpServer::pushSystemData() {
j["power_bus_status"]["reservedCurrent3"] = Json::Value(m_systemData->power_bus_status.reservedCurrent3); // 预留电流3
j["power_bus_status"]["coolWaterPressure"] = Json::Value(m_systemData->power_bus_status.coolWaterPressure); // 冷却水压力
//应急电池信息
j["emergency_battery1"]["voltage"] = Json::Value(m_systemData->emergency_battery1_voltage); // 应急电池1总电压 [V]
j["emergency_battery1"]["current"] = Json::Value(m_systemData->emergency_battery1_current); // 应急电池1总电流 [A]
j["emergency_battery1"]["max_temp"] = Json::Value(m_systemData->emergency_battery1_max_temp); // 应急电池1最高温度 [°C]
j["emergency_battery1"]["fault_word"] = Json::Value(m_systemData->emergency_battery1_fault_word); // 应急电池1故障字
j["emergency_battery2"]["voltage"] = Json::Value(m_systemData->emergency_battery2_voltage); // 应急电池2总电压 [V]
j["emergency_battery2"]["current"] = Json::Value(m_systemData->emergency_battery2_current); // 应急电池2总电流 [A]
j["emergency_battery2"]["max_temp"] = Json::Value(m_systemData->emergency_battery2_max_temp); // 应急电池2最高温度 [°C]
j["emergency_battery2"]["fault_word"] = Json::Value(m_systemData->emergency_battery2_fault_word); // 应急电池2故障字
//应急电池
// emergency_battery1_voltage = data.emergency_battery1_voltage * 0.1;
// emergency_battery1_current = data.emergency_battery1_current * 0.05;
// emergency_battery1_max_temp = data.emergency_battery1_max_temp * 0.1;
// emergency_battery1_fault_word = data.emergency_battery1_fault_word;
// emergency_battery2_voltage = data.emergency_battery2_voltage * 0.1;
// emergency_battery2_current = data.emergency_battery2_current * 0.05;
// emergency_battery2_max_temp = data.emergency_battery2_max_temp * 0.1;
// emergency_battery2_fault_word = data.emergency_battery2_fault_word;
// union {
// unsigned char lowFaultWord;
// struct {
+45 -1
View File
@@ -540,6 +540,11 @@ body {
animation: alarm-pulse 2s infinite ease-in-out;
}
.emergency-battery-card {
/* 移除特殊宽度限制,使用标准电池卡片样式 */
}
@keyframes alarm-pulse {
0% {
border-color: #f87171; /* light red */
@@ -774,6 +779,26 @@ body {
</div>
</div>
</div>
<div class="battery-card emergency-battery-card">
<h3>应急电池1状态</h3>
<div class="battery-data">
<div class="data-row"><span>总电压:</span><span id="emergency-battery1-voltage">-</span>V</div>
<div class="data-row"><span>总电流:</span><span id="emergency-battery1-current">-</span>A</div>
<div class="data-row"><span>最高温度:</span><span id="emergency-battery1-max-temp">-</span>°C</div>
<div class="data-row"><span>故障字:</span><span id="emergency-battery1-fault-word">-</span></div>
</div>
</div>
<div class="battery-card emergency-battery-card">
<h3>应急电池2状态</h3>
<div class="battery-data">
<div class="data-row"><span>总电压:</span><span id="emergency-battery2-voltage">-</span>V</div>
<div class="data-row"><span>总电流:</span><span id="emergency-battery2-current">-</span>A</div>
<div class="data-row"><span>最高温度:</span><span id="emergency-battery2-max-temp">-</span>°C</div>
<div class="data-row"><span>故障字:</span><span id="emergency-battery2-fault-word">-</span></div>
</div>
</div>
<div class="panel-title">电池报警状态</div>
<div class="battery-cards">
@@ -1094,6 +1119,20 @@ body {
updateWithDebounce('h2-concentration1', data.h2_concentration1, 0);
updateWithDebounce('h2-concentration2', data.h2_concentration2, 0);
// 更新应急电池数据
if (data.emergency_battery1) {
updateWithDebounce('emergency-battery1-voltage', data.emergency_battery1.voltage, 2);
updateWithDebounce('emergency-battery1-current', data.emergency_battery1.current, 2);
updateWithDebounce('emergency-battery1-max-temp', data.emergency_battery1.max_temp, 1);
updateStatusWithDebounce('emergency-battery1-fault-word', data.emergency_battery1.fault_word, getFaultWordText);
}
if (data.emergency_battery2) {
updateWithDebounce('emergency-battery2-voltage', data.emergency_battery2.voltage, 2);
updateWithDebounce('emergency-battery2-current', data.emergency_battery2.current, 2);
updateWithDebounce('emergency-battery2-max-temp', data.emergency_battery2.max_temp, 1);
updateStatusWithDebounce('emergency-battery2-fault-word', data.emergency_battery2.fault_word, getFaultWordText);
}
// 更新电池报警状态
updateWithDebounce('dyn-alarm-flag1', data.dyn_alarm_flag1, 0);
updateWithDebounce('dyn-alarm-flag2', data.dyn_alarm_flag2, 0);
@@ -1516,6 +1555,11 @@ body {
return commands[cmd] || '未知指令';
}
function getFaultWordText(faultWord) {
if (faultWord === undefined || faultWord === null) return '-';
return '0x' + faultWord.toString(16).toUpperCase().padStart(4, '0');
}
function updateCcuControlData(data) {
if (data.ccuColCmd) {
const ccuData = data.ccuColCmd;
@@ -1812,4 +1856,4 @@ body {
</html>
)";
#endif // HTTP_SERVER_INDEX_H
#endif // HTTP_SERVER_INDEX_H
+2
View File
@@ -4,4 +4,6 @@ ProcessConfig = pPowerManger
{
AppTick = 4
CommsTick = 4
log_level = INFO
log_file = /path/to/your/logfile.log
}
+11 -2
View File
@@ -51,7 +51,16 @@ typedef struct ccuState
uint16_t ch3oh_concentration1; // 舱室甲醇气体浓度1,单位:0.01% LEL
uint16_t ch3oh_concentration2; // 舱室甲醇气体浓度2,单位:0.01% LEL
uint16_t reserved1[10]; // 保留字段,地址范围35~52,共18个uint16_t,协议预留
uint16_t reserved1[2]; // 保留字段前2个元素
uint16_t emergency_battery1_voltage; // 应急电池1总电压 [V]
uint16_t emergency_battery1_current; // 应急电池1总电流 [A]
uint16_t emergency_battery1_max_temp; // 应急电池1最高温度 [°C]
uint16_t emergency_battery1_fault_word; // 应急电池1故障字
uint16_t emergency_battery2_voltage; // 应急电池2总电压 [V]
uint16_t emergency_battery2_current; // 应急电池2总电流 [A]
uint16_t emergency_battery2_max_temp; // 应急电池2最高温度 [°C]
uint16_t emergency_battery2_fault_word; // 应急电池2故障字
uint16_t cabin_ox_concentration; // 仪表舱内氧气浓度 [%]
uint16_t cabin_temperature; // 仪表舱内温度 [°C]
uint16_t cabin_humidity; // 仪表舱内湿度 [%RH]
@@ -632,7 +641,7 @@ namespace WorkCondition {
UNDERWATER_RECON = 9, // 水下侦查
SURFACE_RECON = 10, // 水面侦查
DJ_MODE = 11, // DJ模式
DEBUG_MODE = 12 // 调试模式
LIFT_MODE = 12 // 调试模式
};
};
+36 -18
View File
@@ -3,13 +3,17 @@
#include <iostream>
#include "../logc/loguru.hpp"
SQLite::SQLite(const std::string& dbPath)
{
if (sqlite3_open(dbPath.c_str(), &m_db) != SQLITE_OK) {
LOG_F(WARNING, "Can't open database: %s", sqlite3_errmsg(m_db));
SQLite::SQLite(const std::string& dbPath) {
try {
if (sqlite3_open(dbPath.c_str(), &m_db) != SQLITE_OK) {
LOG_F(ERROR, "无法打开数据库: %s", sqlite3_errmsg(m_db));
m_db = nullptr;
}
m_dbPath = dbPath;
} catch (...) {
LOG_F(ERROR, "SQLite构造函数发生异常");
m_db = nullptr;
}
m_dbPath = dbPath;
}
SQLite::~SQLite()
@@ -71,9 +75,15 @@ bool SQLite::createTable()
o2_concentration2 INTEGER,
ch3oh_concentration1 INTEGER,
ch3oh_concentration2 INTEGER,
reserved1_1 INTEGER, reserved1_2 INTEGER, reserved1_3 INTEGER, reserved1_4 INTEGER,
reserved1_5 INTEGER, reserved1_6 INTEGER, reserved1_7 INTEGER, reserved1_8 INTEGER,
reserved1_9 INTEGER, reserved1_10 INTEGER,
reserved1_1 INTEGER, reserved1_2 INTEGER,
emergency_battery1_voltage INTEGER,
emergency_battery1_current INTEGER,
emergency_battery1_max_temp INTEGER,
emergency_battery1_fault_word INTEGER,
emergency_battery2_voltage INTEGER,
emergency_battery2_current INTEGER,
emergency_battery2_max_temp INTEGER,
emergency_battery2_fault_word INTEGER,
cabin_ox_concentration INTEGER,
cabin_temperature INTEGER,
cabin_humidity INTEGER,
@@ -269,7 +279,7 @@ bool SQLite::createTable()
workCondition INTEGER,
fcuCmd INTEGER,
fcuPowerEfficiency INTEGER,
fcuInsEfficiency INTEGER,
insChargeEnable INTEGER,
insBatCmd INTEGER,
powerBatCmd INTEGER,
powerBatEfficiency INTEGER,
@@ -375,8 +385,9 @@ bool SQLite::insertData(const ccuState data) {
h2_concentration1, h2_concentration2, h2_concentration3,
o2_concentration1, o2_concentration2,
ch3oh_concentration1, ch3oh_concentration2,
reserved1_1, reserved1_2, reserved1_3, reserved1_4, reserved1_5,
reserved1_6, reserved1_7, reserved1_8, reserved1_9, reserved1_10,
reserved1_1, reserved1_2,
emergency_battery1_voltage, emergency_battery1_current, emergency_battery1_max_temp, emergency_battery1_fault_word,
emergency_battery2_voltage, emergency_battery2_current, emergency_battery2_max_temp, emergency_battery2_fault_word,
cabin_ox_concentration, cabin_temperature, cabin_humidity, cabin_pressure,
power_cabin_ox_concentration, power_cabin_temperature,
power_cabin_humidity, power_cabin_pressure,
@@ -417,7 +428,9 @@ bool SQLite::insertData(const ccuState data) {
?, ?,
?, ?,
?, ?, ?, ?, ?,
?, ?, ?, ?, ?,
?, ?,
?, ?, ?, ?,
?, ?, ?, ?,
?, ?, ?, ?,
?, ?, ?, ?,
?,
@@ -430,8 +443,6 @@ bool SQLite::insertData(const ccuState data) {
?, ?,
?, ?,
?, ?,
?, ?,
?, ?,
?, ?, ?,
?, ?,
?, ?, ?,
@@ -443,7 +454,7 @@ bool SQLite::insertData(const ccuState data) {
?, ?, ?,
?, ?,
?, ?,
?, ?
?
);
)";
@@ -497,7 +508,16 @@ bool SQLite::insertData(const ccuState data) {
BIND_16(data.ch3oh_concentration1);
BIND_16(data.ch3oh_concentration2);
for (int i = 0; i < 10; ++i) BIND_16(data.reserved1[i]);
for (int i = 0; i < 2; ++i) BIND_16(data.reserved1[i]);
BIND_16(data.emergency_battery1_voltage);
BIND_16(data.emergency_battery1_current);
BIND_16(data.emergency_battery1_max_temp);
BIND_16(data.emergency_battery1_fault_word);
BIND_16(data.emergency_battery2_voltage);
BIND_16(data.emergency_battery2_current);
BIND_16(data.emergency_battery2_max_temp);
BIND_16(data.emergency_battery2_fault_word);
BIND_16(data.cabin_ox_concentration);
BIND_16(data.cabin_temperature);
@@ -626,8 +646,6 @@ bool SQLite::insertData(const ccuColCmd cmd) {
if (!success) {
std::cerr << "执行插入失败: " << sqlite3_errmsg(m_db) << std::endl;
}
sqlite3_finalize(stmt);
return success;
}
-1
View File
@@ -33,5 +33,4 @@ public:
};
#endif
+27 -6
View File
@@ -205,6 +205,16 @@ public:
unsigned char insfaultCode;
//应急电池
double emergency_battery1_voltage; // 应急电池1总电压 [V]
double emergency_battery1_current; // 应急电池1总电流 [A]
double emergency_battery1_max_temp; // 应急电池1最高温度 [°C]
uint16_t emergency_battery1_fault_word; // 应急电池1故障字
double emergency_battery2_voltage; // 应急电池2总电压 [V]
double emergency_battery2_current; // 应急电池2总电流 [A]
double emergency_battery2_max_temp; // 应急电池2最高温度 [°C]
uint16_t emergency_battery2_fault_word; // 应急电池2故障字
// MOOSD 状态
bool moosd_status;
//配电系统状态
@@ -522,15 +532,15 @@ public:
};
~SystemData(){};
void updateCommonStatus(double time_out=3){
void updateCommonStatus(double time_out=10){
//更新时间
double currentTime = MOOSTime();
//判断是否超时
device_common_status.ccu_status.isTimeout = (currentTime - device_common_status.ccu_status.lastUpdateTime) > time_out;
device_common_status.dis_hv_c1.isTimeout = (currentTime - device_common_status.dis_hv_c1.lastUpdateTime) > time_out;
device_common_status.dis_hv_c2.isTimeout = (currentTime - device_common_status.dis_hv_c2.lastUpdateTime) > time_out;
device_common_status.dis_lv_c1.isTimeout = (currentTime - device_common_status.dis_lv_c1.lastUpdateTime) > time_out;
device_common_status.dis_lv_c2.isTimeout = (currentTime - device_common_status.dis_lv_c2.lastUpdateTime) > time_out;
device_common_status.ccu_status.isTimeout = abs(currentTime - device_common_status.ccu_status.lastUpdateTime) > time_out;
device_common_status.dis_hv_c1.isTimeout = abs(currentTime - device_common_status.dis_hv_c1.lastUpdateTime) > time_out;
device_common_status.dis_hv_c2.isTimeout = abs(currentTime - device_common_status.dis_hv_c2.lastUpdateTime) > time_out;
device_common_status.dis_lv_c1.isTimeout = abs(currentTime - device_common_status.dis_lv_c1.lastUpdateTime) > time_out;
device_common_status.dis_lv_c2.isTimeout = abs(currentTime - device_common_status.dis_lv_c2.lastUpdateTime) > time_out;
};
void updateSystemData(ccuState data){
@@ -695,6 +705,17 @@ public:
water_leak_status_from_dynbat = (data.dyn_water_leak_status >> 4) & 0x0F; // 00 正常,01 异常漏水
dcdc_status_from_insbat = (data.ins_water_leak_dcdc_status) & 0x0F; // 00 正常,01 故障
//应急电池
emergency_battery1_voltage = data.emergency_battery1_voltage * 0.1;
emergency_battery1_current = data.emergency_battery1_current * 0.05;
emergency_battery1_max_temp = data.emergency_battery1_max_temp * 0.1;
emergency_battery1_fault_word = data.emergency_battery1_fault_word;
emergency_battery2_voltage = data.emergency_battery2_voltage * 0.1;
emergency_battery2_current = data.emergency_battery2_current * 0.05;
emergency_battery2_max_temp = data.emergency_battery2_max_temp * 0.1;
emergency_battery2_fault_word = data.emergency_battery2_fault_word;
//心跳计数器
heartbeat = data.heartbeat;
}
@@ -0,0 +1,63 @@
/* json 格式 XC阵控制软件→复合能源管控系统
{
"xcLowVoltageAdd_int32 " : XX //命令类型:“无命令”0,“申请仪表上电”1,“申请仪表断电”2;类型:int
"xcHighVoltageAdd_int32 " : XX, //命令类型:“无命令”0,“申请高压上电”1,“申请高压断电”2;类型:int
}
*/
#ifndef UDETECT_XCVOLTAGE_CMD_H
#define UDETECT_XCVOLTAGE_CMD_H
#include "../logc/loguru.hpp"
#include "json/json.h"
#include <string>
#include <memory>
class uDetect_xcVoltage_cmd
{
private:
/* data */
public:
uDetect_xcVoltage_cmd(){};
~uDetect_xcVoltage_cmd(){};
int xcLowVoltageAdd_int32;
int xcHighVoltageAdd_int32;
static std::string key;
std::string toJsonString()
{
Json::Value j;
j["xcLowVoltageAdd_int32"] = xcLowVoltageAdd_int32;
j["xcHighVoltageAdd_int32"] = xcHighVoltageAdd_int32;
Json::StreamWriterBuilder builder;
builder.settings_["indentation"] = "";
return Json::writeString(builder, j);
}
bool fromJsonString(std::string jsonString)
{
Json::CharReaderBuilder readerBuilder;
std::unique_ptr<Json::CharReader> reader(readerBuilder.newCharReader());
Json::Value j;
std::string errors;
bool parsingSuccessful = reader->parse(jsonString.c_str(), jsonString.c_str() + jsonString.length(), &j, &errors);
if (!parsingSuccessful) {
LOG_F(ERROR, "Failed to parse JSON: %s", errors.c_str());
return false;
}
if (j.isMember("xcLowVoltageAdd_int32") && j.isMember("xcHighVoltageAdd_int32")) {
xcLowVoltageAdd_int32 = j["xcLowVoltageAdd_int32"].asInt();
xcHighVoltageAdd_int32 = j["xcHighVoltageAdd_int32"].asInt();
LOG_F(INFO, "xcLowVoltageAdd_int32: %d", xcLowVoltageAdd_int32);
LOG_F(INFO, "xcHighVoltageAdd_int32: %d", xcHighVoltageAdd_int32);
LOG_F(INFO, "jsonString: %s", jsonString.c_str());
return true;
}
LOG_F(ERROR, "JSON does not contain required fields");
return false;
}
};
#endif
@@ -0,0 +1,58 @@
/* json 格式 XC阵控制软件→复合能源管控系统
{
"zdpVoltageAdd_int32 " : XX //命令类型:“无命令”0,“申请仪表上电”1,“申请仪表断电”2;类型:int
}
*/
#ifndef UDETECT_ZDPVOLTAGE_CMD_H
#define UDETECT_ZDPVOLTAGE_CMD_H
#include "../logc/loguru.hpp"
#include "json/json.h"
#include <string>
#include <memory>
class uDetect_zdpVoltage_cmd
{
private:
/* data */
public:
uDetect_zdpVoltage_cmd(){};
~uDetect_zdpVoltage_cmd(){};
int zdpVoltageAdd_int32;
static std::string key;
std::string toJsonString()
{
Json::Value j;
j["zdpVoltageAdd_int32"] = zdpVoltageAdd_int32;
Json::StreamWriterBuilder builder;
builder.settings_["indentation"] = "";
return Json::writeString(builder, j);
}
bool fromJsonString(std::string jsonString)
{
Json::CharReaderBuilder readerBuilder;
std::unique_ptr<Json::CharReader> reader(readerBuilder.newCharReader());
Json::Value j;
std::string errors;
bool parsingSuccessful = reader->parse(jsonString.c_str(), jsonString.c_str() + jsonString.length(), &j, &errors);
if (!parsingSuccessful) {
LOG_F(ERROR, "Failed to parse JSON: %s", errors.c_str());
return false;
}
if (j.isMember("zdpVoltageAdd_int32")) {
zdpVoltageAdd_int32 = j["zdpVoltageAdd_int32"].asInt();
LOG_F(INFO, "zdpVoltageAdd_int32: %d", zdpVoltageAdd_int32);
LOG_F(INFO, "jsonString: %s", jsonString.c_str());
return true;
}
LOG_F(ERROR, "JSON does not contain required fields");
return false;
}
};
#endif
@@ -0,0 +1,6 @@
#include "uDetect_zdpVoltage_cmd.h"
#include "uDetect_xcVoltage_cmd.h"
// 定义静态成员变量
std::string uDetect_zdpVoltage_cmd::key = "uDetect_zdpVoltage_cmd";
std::string uDetect_xcVoltage_cmd::key = "uDetect_xcVoltage_cmd";