修复:跨线程数据竞争 + 协议字段越界 + UDP 发送失败吞错
- 并发安全:PowerManger 新增 m_stateMutex,保护 m_pmCurrentState / m_currentDisBreakerState / m_CcuColCmd / faultCode,并封装 addFaultCode/clearFaultCodes/getFaultCodes 访问器 - SystemData 新增跨线程读访问器(getDynVoltageLink/getPowerBusStatus/ getDcdcStatus/getDeviceCommonStatus 等)及配电故障码集合加锁访问 - upmsg buildMsg / httpserver pushSystemData / LowerCommManager 均改为 持锁快照,避免 listen 线程与 comm 线程撕裂读写 - 修复析构顺序:先删 httpServer 再删其他对象,避免 use-after-free - 修复 ccuState reserved2 越界读(协议预留 2 字节,结构体仅声明 1), 修正 coutMsg 中 SOC 门限/功率限制字段打印 - udpComm::sendDisSysCmd 不再吞掉异常,返回 sendMsg 实际结果并记录 ERROR, 新增 SendDisSysCmdFailsWithoutSocket 单测 - 新增 fullFeeder 全类型 UDP 集成仿真器与 fetch-data/clean-data 脚本, .gitignore 补充 SQLite 运行期文件与 fullFeeder 二进制
This commit is contained in:
@@ -80,17 +80,23 @@ void LowerCommManager::setCommLogger(ICommLogger* logger)
|
||||
if (m_udpComm) m_udpComm->setCommLogger(logger);
|
||||
}
|
||||
void LowerCommManager::processPeriodicTasks() {
|
||||
sendCcuCommand(m_pm->m_CcuColCmd);
|
||||
m_pm->m_db->insertData(m_pm->m_CcuColCmd);
|
||||
ccuColCmd cmd;
|
||||
{
|
||||
std::lock_guard<std::mutex> lock(m_pm->m_stateMutex);
|
||||
cmd = m_pm->m_CcuColCmd;
|
||||
}
|
||||
sendCcuCommand(cmd);
|
||||
m_pm->m_db->insertData(cmd);
|
||||
//延时5ms
|
||||
usleep(5000);
|
||||
if(m_pm->m_systemData->device_common_status.dis_hv_c1.isTimeout )
|
||||
auto devStatus = m_pm->m_systemData->getDeviceCommonStatus();
|
||||
if(devStatus.dis_hv_c1.isTimeout )
|
||||
{
|
||||
disHighVolBusCmd clr1{};
|
||||
m_udpComm->sendDisSysCmd(clr1);
|
||||
MOOSPause(200);
|
||||
}
|
||||
if(m_pm->m_systemData->device_common_status.dis_lv_c1.isTimeout )
|
||||
if(devStatus.dis_lv_c1.isTimeout )
|
||||
{
|
||||
disHighBVolBusCmd clr3{};
|
||||
m_udpComm->sendDisSysCmd(clr3);
|
||||
@@ -195,10 +201,14 @@ bool LowerCommManager::updatePoweSystemStates(){
|
||||
double time;
|
||||
if(m_udpComm->popMsgFormQueue(time, m_CcuCurrentState))
|
||||
{
|
||||
m_pm->m_pmCurrentState.ccustate = m_CcuCurrentState.data;
|
||||
m_pm->m_db->insertData(m_pm->m_pmCurrentState.ccustate); //写入数据库
|
||||
ccuState local = m_CcuCurrentState.data;
|
||||
{
|
||||
std::lock_guard<std::mutex> lock(m_pm->m_stateMutex);
|
||||
m_pm->m_pmCurrentState.ccustate = local;
|
||||
}
|
||||
m_pm->m_db->insertData(local); //写入数据库
|
||||
msg_CcuStateFbMsg_Update_time = time;
|
||||
m_pm->m_systemData->updateSystemData(m_pm->m_pmCurrentState.ccustate);
|
||||
m_pm->m_systemData->updateSystemData(local);
|
||||
{
|
||||
std::lock_guard<std::mutex> lock(m_pm->m_systemData->m_dataMutex);
|
||||
m_pm->m_systemData->device_common_status.ccu_status.lastUpdateTime = m_pm->m_lowerCommManager->msg_CcuStateFbMsg_Update_time;
|
||||
@@ -219,29 +229,29 @@ bool LowerCommManager::updatePoweSystemStates(){
|
||||
double time;
|
||||
if(m_udpComm->popMsgFormQueue(time, m_disHighVolBusCurrentState))
|
||||
{
|
||||
// m_udpComm->popMsgFormQueue(time,m_disHighVolBusCurrentState);
|
||||
m_pm->m_pmCurrentState.bus1State = m_disHighVolBusCurrentState.data;
|
||||
m_pm->m_db->insertData(m_pm->m_pmCurrentState.bus1State); //写入数据库
|
||||
disHighVolBusState local = m_disHighVolBusCurrentState.data;
|
||||
{
|
||||
std::lock_guard<std::mutex> lock(m_pm->m_stateMutex);
|
||||
m_pm->m_pmCurrentState.bus1State = local;
|
||||
disBus1Breaker pdis1{};
|
||||
pdis1.fuelCellCircuitBreaker = (local.fuelCellCircuitBreaker == BREAK_ON) ? 1 : 0;
|
||||
pdis1.powerLithiumBatteryCircuitBreaker = (local.powerLithiumBatteryCircuitBreaker == BREAK_ON) ? 1 : 0;
|
||||
pdis1.propulsionMotorCircuitBreaker = (local.propulsionMotorCircuitBreaker == BREAK_ON) ? 1 : 0;
|
||||
pdis1.lithiumBatteryGroupInstrumentCircuitBreaker = (local.lithiumBatteryGroupInstrumentCircuitBreaker == BREAK_ON) ? 1 : 0;
|
||||
pdis1.dcDc5ModuleCircuitBreaker = (local.dcDc5ModuleCircuitBreaker == BREAK_ON) ? 1 : 0;
|
||||
pdis1.bowHighVoltageDistributionBoxCircuitBreaker = (local.bowHighVoltageDistributionBoxCircuitBreaker == BREAK_ON) ? 1 : 0;
|
||||
pdis1.sternFTDevice45CircuitBreaker = (local.sternFTDevice45CircuitBreaker == BREAK_ON) ? 1 : 0;
|
||||
pdis1.sternRudderSwitch1CircuitBreaker = (local.sternRudderSwitch1CircuitBreaker == BREAK_ON) ? 1 : 0;
|
||||
pdis1.sternRudderSwitch2CircuitBreaker = (local.sternRudderSwitch2CircuitBreaker == BREAK_ON) ? 1 : 0;
|
||||
pdis1.fbReservedCircuitBreaker = (local.fbReservedCircuitBreaker == BREAK_ON) ? 1 : 0;
|
||||
pdis1.tyzReservedCircuitBreaker = (local.tyzReservedCircuitBreaker == BREAK_ON) ? 1 : 0;
|
||||
pdis1.reservedCircuitBreaker = (local.reservedCircuitBreaker == BREAK_ON) ? 1 : 0;
|
||||
pdis1.paceholder = 0;
|
||||
m_pm->m_currentDisBreakerState.bus1Breaker = pdis1;
|
||||
}
|
||||
m_pm->m_db->insertData(local); //写入数据库
|
||||
msg_disHighVolBusFbMsg_Update_time = time;
|
||||
|
||||
disBus1Breaker* pdis1=new disBus1Breaker;
|
||||
(m_pm->m_pmCurrentState.bus1State.fuelCellCircuitBreaker == BREAK_ON) ? pdis1 -> fuelCellCircuitBreaker = 1 : pdis1 -> fuelCellCircuitBreaker = 0;
|
||||
(m_pm->m_pmCurrentState.bus1State.powerLithiumBatteryCircuitBreaker == BREAK_ON) ? pdis1 -> powerLithiumBatteryCircuitBreaker = 1 : pdis1 -> powerLithiumBatteryCircuitBreaker = 0;
|
||||
(m_pm->m_pmCurrentState.bus1State.propulsionMotorCircuitBreaker == BREAK_ON) ? pdis1 -> propulsionMotorCircuitBreaker = 1 : pdis1 -> propulsionMotorCircuitBreaker = 0;
|
||||
(m_pm->m_pmCurrentState.bus1State.lithiumBatteryGroupInstrumentCircuitBreaker == BREAK_ON) ? pdis1 -> lithiumBatteryGroupInstrumentCircuitBreaker = 1 : pdis1 -> lithiumBatteryGroupInstrumentCircuitBreaker = 0;
|
||||
(m_pm->m_pmCurrentState.bus1State.dcDc5ModuleCircuitBreaker == BREAK_ON) ? pdis1 -> dcDc5ModuleCircuitBreaker = 1 : pdis1 -> dcDc5ModuleCircuitBreaker = 0;
|
||||
(m_pm->m_pmCurrentState.bus1State.bowHighVoltageDistributionBoxCircuitBreaker == BREAK_ON) ? pdis1 -> bowHighVoltageDistributionBoxCircuitBreaker = 1 : pdis1 -> bowHighVoltageDistributionBoxCircuitBreaker = 0;
|
||||
(m_pm->m_pmCurrentState.bus1State.sternFTDevice45CircuitBreaker == BREAK_ON) ? pdis1 -> sternFTDevice45CircuitBreaker = 1 : pdis1 -> sternFTDevice45CircuitBreaker = 0;
|
||||
(m_pm->m_pmCurrentState.bus1State.sternRudderSwitch1CircuitBreaker == BREAK_ON) ? pdis1 -> sternRudderSwitch1CircuitBreaker = 1 : pdis1 -> sternRudderSwitch1CircuitBreaker = 0;
|
||||
(m_pm->m_pmCurrentState.bus1State.sternRudderSwitch2CircuitBreaker == BREAK_ON) ? pdis1 -> sternRudderSwitch2CircuitBreaker = 1 : pdis1 -> sternRudderSwitch2CircuitBreaker = 0;
|
||||
(m_pm->m_pmCurrentState.bus1State.fbReservedCircuitBreaker == BREAK_ON) ? pdis1 -> fbReservedCircuitBreaker = 1 : pdis1 -> fbReservedCircuitBreaker = 0;
|
||||
(m_pm->m_pmCurrentState.bus1State.tyzReservedCircuitBreaker == BREAK_ON) ? pdis1 -> tyzReservedCircuitBreaker = 1 : pdis1 -> tyzReservedCircuitBreaker = 0;
|
||||
(m_pm->m_pmCurrentState.bus1State.reservedCircuitBreaker == BREAK_ON) ? pdis1 -> reservedCircuitBreaker = 1 : pdis1 -> reservedCircuitBreaker = 0;
|
||||
pdis1 -> paceholder = 0;
|
||||
m_pm->m_currentDisBreakerState.bus1Breaker = *pdis1;
|
||||
delete pdis1;
|
||||
|
||||
m_pm->m_systemData->updateSystemData(m_pm->m_pmCurrentState.bus1State);
|
||||
m_pm->m_systemData->updateSystemData(local);
|
||||
{
|
||||
std::lock_guard<std::mutex> lock(m_pm->m_systemData->m_dataMutex);
|
||||
m_pm->m_systemData->device_common_status.dis_hv_c1.lastUpdateTime = m_pm->m_lowerCommManager->msg_disHighVolBusFbMsg_Update_time;
|
||||
@@ -253,22 +263,23 @@ bool LowerCommManager::updatePoweSystemStates(){
|
||||
double time;
|
||||
if(m_udpComm->popMsgFormQueue(time,m_disHighAVolBusCurrentState))
|
||||
{
|
||||
m_pm->m_pmCurrentState.bus2State = m_disHighAVolBusCurrentState.data;
|
||||
m_pm->m_db->insertData(m_pm->m_pmCurrentState.bus2State); //写入数据库
|
||||
disHighAVolBusState local = m_disHighAVolBusCurrentState.data;
|
||||
{
|
||||
std::lock_guard<std::mutex> lock(m_pm->m_stateMutex);
|
||||
m_pm->m_pmCurrentState.bus2State = local;
|
||||
disBus2Breaker pdis2{};
|
||||
pdis2.bowFTDevice123CircuitBreaker = (local.bowFTDevice123CircuitBreaker == BREAK_ON) ? 1 : 0;
|
||||
pdis2.actuatorCircuitBreaker = (local.actuatorCircuitBreaker == BREAK_ON) ? 1 : 0;
|
||||
pdis2.mastSteeringGearControlBoxCircuitBreaker = (local.mastSteeringGearControlBoxCircuitBreaker == BREAK_ON) ? 1 : 0;
|
||||
pdis2.xczCircuitBreaker = (local.xczCircuitBreaker == BREAK_ON) ? 1 : 0;
|
||||
pdis2.bowRudderControlBoxCircuitBreaker = (local.bowRudderControlBoxCircuitBreaker == BREAK_ON) ? 1 : 0;
|
||||
pdis2.openWaterCoverStartCylinderCircuitBreaker = (local.openWaterCoverStartCylinderCircuitBreaker == BREAK_ON) ? 1 : 0;
|
||||
pdis2.paceholder = 0;
|
||||
m_pm->m_currentDisBreakerState.bus2Breaker = pdis2;
|
||||
}
|
||||
m_pm->m_db->insertData(local); //写入数据库
|
||||
msg_disHighAVolBusFbMsg_Update_time = time;
|
||||
|
||||
disBus2Breaker* pdis2=new disBus2Breaker;
|
||||
(m_pm->m_pmCurrentState.bus2State.bowFTDevice123CircuitBreaker == BREAK_ON)? pdis2 -> bowFTDevice123CircuitBreaker = 1 : pdis2 -> bowFTDevice123CircuitBreaker = 0;
|
||||
(m_pm->m_pmCurrentState.bus2State.actuatorCircuitBreaker == BREAK_ON)? pdis2 -> actuatorCircuitBreaker = 1 : pdis2 -> actuatorCircuitBreaker = 0;
|
||||
(m_pm->m_pmCurrentState.bus2State.mastSteeringGearControlBoxCircuitBreaker == BREAK_ON)? pdis2 -> mastSteeringGearControlBoxCircuitBreaker = 1 : pdis2 -> mastSteeringGearControlBoxCircuitBreaker = 0;
|
||||
(m_pm->m_pmCurrentState.bus2State.xczCircuitBreaker == BREAK_ON)? pdis2 -> xczCircuitBreaker = 1 : pdis2 -> xczCircuitBreaker = 0;
|
||||
(m_pm->m_pmCurrentState.bus2State.bowRudderControlBoxCircuitBreaker == BREAK_ON)? pdis2 -> bowRudderControlBoxCircuitBreaker = 1 : pdis2 -> bowRudderControlBoxCircuitBreaker = 0;
|
||||
(m_pm->m_pmCurrentState.bus2State.openWaterCoverStartCylinderCircuitBreaker == BREAK_ON)? pdis2 -> openWaterCoverStartCylinderCircuitBreaker = 1 : pdis2 -> openWaterCoverStartCylinderCircuitBreaker = 0;
|
||||
pdis2 -> paceholder = 0;
|
||||
m_pm->m_currentDisBreakerState.bus2Breaker = *pdis2;
|
||||
delete pdis2;
|
||||
|
||||
m_pm->m_systemData->updateSystemData(m_pm->m_pmCurrentState.bus2State);
|
||||
m_pm->m_systemData->updateSystemData(local);
|
||||
{
|
||||
std::lock_guard<std::mutex> lock(m_pm->m_systemData->m_dataMutex);
|
||||
m_pm->m_systemData->device_common_status.dis_hv_c2.lastUpdateTime = m_pm->m_lowerCommManager->msg_disHighAVolBusFbMsg_Update_time;
|
||||
@@ -281,22 +292,24 @@ bool LowerCommManager::updatePoweSystemStates(){
|
||||
double time;
|
||||
if(m_udpComm->popMsgFormQueue(time,m_disHighBVolBusCurrentState))
|
||||
{
|
||||
m_pm->m_pmCurrentState.bus3State = m_disHighBVolBusCurrentState.data;
|
||||
m_pm->m_db->insertData(m_pm->m_pmCurrentState.bus3State); //写入数据库
|
||||
disLowMainBusState local = m_disHighBVolBusCurrentState.data;
|
||||
{
|
||||
std::lock_guard<std::mutex> lock(m_pm->m_stateMutex);
|
||||
m_pm->m_pmCurrentState.bus3State = local;
|
||||
disBus3Breaker pdis3{};
|
||||
pdis3.lithiumBatteryGroupInstrumentCircuitBreaker = (local.lithiumBatteryGroupInstrumentCircuitBreaker == BREAK_ON) ? 1 : 0;
|
||||
pdis3.bowLowVoltageDistributionBoxCircuitBreaker = (local.bowLowVoltageDistributionBoxCircuitBreaker == BREAK_ON) ? 1 : 0;
|
||||
pdis3.unit4InstrumentDC48VCircuitBreaker = (local.unit4InstrumentDC48VCircuitBreaker == BREAK_ON) ? 1 : 0;
|
||||
pdis3.dcC1DCDistributionPanelCircuitBreaker = (local.dcC1DCDistributionPanelCircuitBreaker == BREAK_ON) ? 1 : 0;
|
||||
pdis3.reservedCircuitBreaker1 = (local.reservedCircuitBreaker1 == BREAK_ON) ? 1 : 0;
|
||||
pdis3.reservedCircuitBreaker2 = (local.reservedCircuitBreaker2 == BREAK_ON) ? 1 : 0;
|
||||
pdis3.emergencyLithiumBatteryGroup2CircuitBreaker = (local.emergencyLithiumBatteryGroup2CircuitBreaker == BREAK_ON) ? 1 : 0;
|
||||
pdis3.paceholder = 0;
|
||||
m_pm->m_currentDisBreakerState.bus3Breaker = pdis3;
|
||||
}
|
||||
m_pm->m_db->insertData(local); //写入数据库
|
||||
msg_disHighBVolBusFbMsg_Update_time = time;
|
||||
|
||||
disBus3Breaker* pdis3=new disBus3Breaker;
|
||||
(m_pm->m_pmCurrentState.bus3State.lithiumBatteryGroupInstrumentCircuitBreaker == BREAK_ON)? pdis3 -> lithiumBatteryGroupInstrumentCircuitBreaker = 1 : pdis3 -> lithiumBatteryGroupInstrumentCircuitBreaker = 0;
|
||||
(m_pm->m_pmCurrentState.bus3State.bowLowVoltageDistributionBoxCircuitBreaker == BREAK_ON)? pdis3 -> bowLowVoltageDistributionBoxCircuitBreaker = 1 : pdis3 -> bowLowVoltageDistributionBoxCircuitBreaker = 0;
|
||||
(m_pm->m_pmCurrentState.bus3State.unit4InstrumentDC48VCircuitBreaker == BREAK_ON)? pdis3 -> unit4InstrumentDC48VCircuitBreaker = 1 : pdis3 -> unit4InstrumentDC48VCircuitBreaker = 0;
|
||||
(m_pm->m_pmCurrentState.bus3State.dcC1DCDistributionPanelCircuitBreaker == BREAK_ON)? pdis3 -> dcC1DCDistributionPanelCircuitBreaker = 1 : pdis3 -> dcC1DCDistributionPanelCircuitBreaker = 0;
|
||||
(m_pm->m_pmCurrentState.bus3State.reservedCircuitBreaker1 == BREAK_ON)? pdis3 -> reservedCircuitBreaker1 = 1 : pdis3 -> reservedCircuitBreaker1 = 0;
|
||||
(m_pm->m_pmCurrentState.bus3State.reservedCircuitBreaker2 == BREAK_ON)? pdis3 -> reservedCircuitBreaker2 = 1 : pdis3 -> reservedCircuitBreaker2 = 0;
|
||||
(m_pm->m_pmCurrentState.bus3State.emergencyLithiumBatteryGroup2CircuitBreaker == BREAK_ON)? pdis3 -> emergencyLithiumBatteryGroup2CircuitBreaker = 1 : pdis3 -> emergencyLithiumBatteryGroup2CircuitBreaker = 0;
|
||||
pdis3->paceholder = 0;
|
||||
m_pm->m_currentDisBreakerState.bus3Breaker = *pdis3;
|
||||
delete pdis3;
|
||||
m_pm->m_systemData->updateSystemData(m_pm->m_pmCurrentState.bus3State);
|
||||
m_pm->m_systemData->updateSystemData(local);
|
||||
{
|
||||
std::lock_guard<std::mutex> lock(m_pm->m_systemData->m_dataMutex);
|
||||
m_pm->m_systemData->device_common_status.dis_lv_c1.lastUpdateTime = m_pm->m_lowerCommManager->msg_disHighBVolBusFbMsg_Update_time;
|
||||
@@ -308,23 +321,25 @@ bool LowerCommManager::updatePoweSystemStates(){
|
||||
double time;
|
||||
if(m_udpComm->popMsgFormQueue(time,m_disLowBusState))
|
||||
{
|
||||
m_pm->m_pmCurrentState.bus4State = m_disLowBusState.data;
|
||||
m_pm->m_db->insertData(m_pm->m_pmCurrentState.bus4State); //写入数据库
|
||||
disLowBusState local = m_disLowBusState.data;
|
||||
{
|
||||
std::lock_guard<std::mutex> lock(m_pm->m_stateMutex);
|
||||
m_pm->m_pmCurrentState.bus4State = local;
|
||||
disBus4Breaker pdis4{};
|
||||
pdis4.unit1CircuitBreaker = (local.unit1CircuitBreaker == BREAK_ON) ? 1 : 0;
|
||||
pdis4.unit2CircuitBreaker = (local.unit2CircuitBreaker == BREAK_ON) ? 1 : 0;
|
||||
pdis4.unit3CircuitBreaker = (local.unit3CircuitBreaker == BREAK_ON) ? 1 : 0;
|
||||
pdis4.unit5CircuitBreaker = (local.unit5CircuitBreaker == BREAK_ON) ? 1 : 0;
|
||||
pdis4.bowPZDeviceCircuitBreaker = (local.bowPZDeviceCircuitBreaker == BREAK_ON) ? 1 : 0;
|
||||
pdis4.reservedCircuitBreaker1 = (local.reservedCircuitBreaker1 == BREAK_ON) ? 1 : 0;
|
||||
pdis4.reservedCircuitBreaker2 = (local.reservedCircuitBreaker2 == BREAK_ON) ? 1 : 0;
|
||||
pdis4.emergencyLithiumBatteryGroup1CircuitBreaker = (local.emergencyLithiumBatteryGroup1CircuitBreaker == BREAK_ON) ? 1 : 0;
|
||||
pdis4.paceholder = 0;
|
||||
m_pm->m_currentDisBreakerState.bus4Breaker = pdis4;
|
||||
}
|
||||
m_pm->m_db->insertData(local); //写入数据库
|
||||
msg_disLowBusFbMsg_Update_time = time;
|
||||
|
||||
disBus4Breaker* pdis4=new disBus4Breaker;
|
||||
(m_pm->m_pmCurrentState.bus4State.unit1CircuitBreaker == BREAK_ON)? pdis4 -> unit1CircuitBreaker = 1 : pdis4 -> unit1CircuitBreaker = 0;
|
||||
(m_pm->m_pmCurrentState.bus4State.unit2CircuitBreaker == BREAK_ON)? pdis4 -> unit2CircuitBreaker = 1 : pdis4 -> unit2CircuitBreaker = 0;
|
||||
(m_pm->m_pmCurrentState.bus4State.unit3CircuitBreaker == BREAK_ON)? pdis4 -> unit3CircuitBreaker = 1 : pdis4 -> unit3CircuitBreaker = 0;
|
||||
(m_pm->m_pmCurrentState.bus4State.unit5CircuitBreaker == BREAK_ON)? pdis4 -> unit5CircuitBreaker = 1 : pdis4 -> unit5CircuitBreaker = 0;
|
||||
(m_pm->m_pmCurrentState.bus4State.bowPZDeviceCircuitBreaker == BREAK_ON)? pdis4 -> bowPZDeviceCircuitBreaker = 1 : pdis4 -> bowPZDeviceCircuitBreaker = 0;
|
||||
(m_pm->m_pmCurrentState.bus4State.reservedCircuitBreaker1 == BREAK_ON)? pdis4 -> reservedCircuitBreaker1 = 1 : pdis4 -> reservedCircuitBreaker1 = 0;
|
||||
(m_pm->m_pmCurrentState.bus4State.reservedCircuitBreaker2 == BREAK_ON)? pdis4 -> reservedCircuitBreaker2 = 1 : pdis4 -> reservedCircuitBreaker2 = 0;
|
||||
(m_pm->m_pmCurrentState.bus4State.emergencyLithiumBatteryGroup1CircuitBreaker == BREAK_ON)? pdis4 -> emergencyLithiumBatteryGroup1CircuitBreaker = 1 : pdis4 -> emergencyLithiumBatteryGroup1CircuitBreaker = 0;
|
||||
pdis4 -> paceholder = 0;
|
||||
m_pm->m_currentDisBreakerState.bus4Breaker = *pdis4;
|
||||
delete pdis4;
|
||||
m_pm->m_systemData->updateSystemData(m_pm->m_pmCurrentState.bus4State);
|
||||
m_pm->m_systemData->updateSystemData(local);
|
||||
{
|
||||
std::lock_guard<std::mutex> lock(m_pm->m_systemData->m_dataMutex);
|
||||
m_pm->m_systemData->device_common_status.dis_lv_c2.lastUpdateTime = m_pm->m_lowerCommManager->msg_disLowBusFbMsg_Update_time;
|
||||
@@ -476,7 +491,7 @@ void LowerCommManager::coutMsg(const msg_CcuStateFbMsg& p, std::ostream& os){
|
||||
os << "甲醇浓度1 (ch3oh_concentration1): " << p.data.ch3oh_concentration1 * 0.01 << "% LEL\n";
|
||||
os << "甲醇浓度2 (ch3oh_concentration2): " << p.data.ch3oh_concentration2 * 0.01 << "% LEL\n";
|
||||
|
||||
for (int i = 0; i < 10; ++i)
|
||||
for (int i = 0; i < 2; ++i)
|
||||
os << "保留字段 reserved1[" << i << "]: 0x" << std::hex << p.data.reserved1[i] << "\n";
|
||||
|
||||
os << "仪表舱 氧气浓度 (cabin_ox_concentration): " << p.data.cabin_ox_concentration * 0.1 << "%\n";
|
||||
@@ -531,12 +546,18 @@ void LowerCommManager::coutMsg(const msg_CcuStateFbMsg& p, std::ostream& os){
|
||||
os << "仪表紧急状态 (ins_emergency_status): 0x" << std::hex << static_cast<int>(p.data.ins_emergency_status) << "\n";
|
||||
os << "动力紧急状态 (dyn_emergency_status): 0x" << static_cast<int>(p.data.dyn_emergency_status) << "\n";
|
||||
|
||||
for (int i = 0; i < 2; ++i)
|
||||
for (int i = 0; i < 1; ++i)
|
||||
os << "保留字段 reserved2[" << i << "]: 0x" << std::hex << static_cast<int>(p.data.reserved2[i]) << "\n";
|
||||
for (int i = 0; i < 6; ++i)
|
||||
os << "SOC门限值 ins_soc_threshold" << i+1 << ": 0x" << std::hex << static_cast<int>(p.data.ins_soc_threshold1) << "\n";
|
||||
for (int i = 0; i < 4; ++i)
|
||||
os << "功率限制 ins_power_limit" << i+1 << ": 0x" << std::hex << static_cast<int>(p.data.ins_power_limit1) << "\n";
|
||||
os << "SOC门限值 ins_soc_threshold1: 0x" << std::hex << static_cast<int>(p.data.ins_soc_threshold1) << "\n";
|
||||
os << "SOC门限值 ins_soc_threshold2: 0x" << std::hex << static_cast<int>(p.data.ins_soc_threshold2) << "\n";
|
||||
os << "SOC门限值 ins_soc_threshold3: 0x" << std::hex << static_cast<int>(p.data.ins_soc_threshold3) << "\n";
|
||||
os << "SOC门限值 dyn_soc_threshold1: 0x" << std::hex << static_cast<int>(p.data.dyn_soc_threshold1) << "\n";
|
||||
os << "SOC门限值 dyn_soc_threshold2: 0x" << std::hex << static_cast<int>(p.data.dyn_soc_threshold2) << "\n";
|
||||
os << "SOC门限值 dyn_soc_threshold3: 0x" << std::hex << static_cast<int>(p.data.dyn_soc_threshold3) << "\n";
|
||||
os << "功率限制 ins_power_limit1: 0x" << std::hex << static_cast<int>(p.data.ins_power_limit1) << "\n";
|
||||
os << "功率限制 ins_power_limit2: 0x" << std::hex << static_cast<int>(p.data.ins_power_limit2) << "\n";
|
||||
os << "功率限制 dyn_power_limit1: 0x" << std::hex << static_cast<int>(p.data.dyn_power_limit1) << "\n";
|
||||
os << "功率限制 dyn_power_limit2: 0x" << std::hex << static_cast<int>(p.data.dyn_power_limit2) << "\n";
|
||||
|
||||
os << "设备在线状态1 (device_online_flag1): 0x" << std::hex << p.data.device_online_flag1 << "\n";
|
||||
os << "设备在线状态2 (device_online_flag2): 0x" << p.data.device_online_flag2 << "\n";
|
||||
@@ -666,11 +687,11 @@ bool LowerCommManager::operate_HV_dcDc5_Breaker(char opt)
|
||||
m_udpComm->sendDisSysCmd(cmd);
|
||||
|
||||
// ok = m_pm->m_pmCurrentState.bus1State.dcDcFaultWord1&(0x02);
|
||||
ok = m_pm->m_systemData->m_dcdcStatus.workingStatus;
|
||||
ok = m_pm->m_systemData->getDcdcStatus().workingStatus;
|
||||
|
||||
MOOSPause(100);
|
||||
while ( !ok ) {
|
||||
if( m_pm->m_systemData->m_dcdcStatus.workingStatus )
|
||||
if( m_pm->m_systemData->getDcdcStatus().workingStatus )
|
||||
{
|
||||
ok = true;
|
||||
break;
|
||||
@@ -718,11 +739,11 @@ bool LowerCommManager::operate_HV_coolingSystem_Breaker(char opt)
|
||||
m_udpComm->sendDisSysCmd(cmd);
|
||||
|
||||
// ok = m_pm->m_pmCurrentState.bus1State.dcDcFaultWord1 & 0x60;
|
||||
ok = m_pm->m_systemData->m_dcdcStatus.coolingPump1Running || m_pm->m_systemData->m_dcdcStatus.coolingPump2Running;
|
||||
ok = m_pm->m_systemData->getDcdcStatus().coolingPump1Running || m_pm->m_systemData->getDcdcStatus().coolingPump2Running;
|
||||
|
||||
MOOSPause(100);
|
||||
while ( !ok ) {
|
||||
if( (m_pm->m_systemData->m_dcdcStatus.coolingPump1Running || m_pm->m_systemData->m_dcdcStatus.coolingPump2Running) )
|
||||
if( (m_pm->m_systemData->getDcdcStatus().coolingPump1Running || m_pm->m_systemData->getDcdcStatus().coolingPump2Running) )
|
||||
{
|
||||
ok = true;
|
||||
break;
|
||||
@@ -942,7 +963,12 @@ bool LowerCommManager::operateBreakerGeneric(
|
||||
m_udpComm->sendDisSysCmd(cmd);
|
||||
MOOSPause(100);
|
||||
while ( !ok ) {
|
||||
if( readState() == getBreakerOption(opt) )
|
||||
StateT cur;
|
||||
{
|
||||
std::lock_guard<std::mutex> lock(m_pm->m_stateMutex);
|
||||
cur = readState();
|
||||
}
|
||||
if( cur == getBreakerOption(opt) )
|
||||
{
|
||||
ok = true;
|
||||
break;
|
||||
|
||||
@@ -86,11 +86,14 @@ PowerManger::PowerManger()
|
||||
PowerManger::~PowerManger()
|
||||
{
|
||||
m_commThread.Stop();
|
||||
delete m_lowerCommManager; // 先停止监听线程,确保其不再调用 DB
|
||||
// 必须先停 HTTP 线程(stop() 内部 pthread_join 阻塞等待线程退出),
|
||||
// 否则 HTTP 线程每秒仍会读取 m_systemData / m_lowerCommManager / m_upperCommManager,
|
||||
// 导致 use-after-free。
|
||||
delete m_httpServer;
|
||||
delete m_lowerCommManager; // 停止监听线程,确保其不再调用 DB
|
||||
delete m_db;
|
||||
delete m_upperCommManager;
|
||||
delete m_systemData;
|
||||
delete m_httpServer;
|
||||
delete m_systemData; // 最后删除,此时无任何线程引用
|
||||
}
|
||||
|
||||
//---------------------------------------------------------
|
||||
@@ -374,10 +377,28 @@ void PowerManger::initControlCmd()
|
||||
|
||||
}
|
||||
|
||||
void PowerManger::addFaultCode(unsigned int code)
|
||||
{
|
||||
std::lock_guard<std::mutex> lock(m_stateMutex);
|
||||
faultCode.push_back(code);
|
||||
}
|
||||
|
||||
void PowerManger::clearFaultCodes()
|
||||
{
|
||||
std::lock_guard<std::mutex> lock(m_stateMutex);
|
||||
faultCode.clear();
|
||||
}
|
||||
|
||||
std::vector<unsigned int> PowerManger::getFaultCodes() const
|
||||
{
|
||||
std::lock_guard<std::mutex> lock(m_stateMutex);
|
||||
return faultCode;
|
||||
}
|
||||
|
||||
unsigned char PowerManger::getFaultLevel()
|
||||
{
|
||||
unsigned char maxLevel = 0;
|
||||
for (auto code : faultCode) {
|
||||
for (auto code : getFaultCodes()) {
|
||||
// 提取0xabcd中的b位 (右移8位后取低4位)
|
||||
unsigned char level = (code >> 8) & 0xF;
|
||||
if (level > maxLevel) {
|
||||
@@ -391,7 +412,10 @@ bool PowerManger::commLoop()
|
||||
{
|
||||
while(!m_commThread.IsQuitRequested())
|
||||
{
|
||||
m_CcuColCmd.heartbeat++;
|
||||
{
|
||||
std::lock_guard<std::mutex> lock(m_stateMutex);
|
||||
m_CcuColCmd.heartbeat++;
|
||||
}
|
||||
m_lowerCommManager->processPeriodicTasks();
|
||||
m_upperCommManager->processPeriodicTasks();
|
||||
// 延时1秒
|
||||
|
||||
@@ -87,6 +87,12 @@ class PowerManger : public AppCastingMOOSApp
|
||||
//===========================FEEDBACK======================================
|
||||
pmState m_pmCurrentState; //能源系统的当前状态(由下位机线程修改)
|
||||
disSysBreakerList m_currentDisBreakerState; //配电断路器状态
|
||||
// 跨线程共享状态保护:m_pmCurrentState / m_currentDisBreakerState / m_CcuColCmd / faultCode
|
||||
// 纪律:绝不与 SystemData::m_dataMutex 同时持有(持锁期间不调用 updateSystemData/pushSystemData)
|
||||
mutable std::mutex m_stateMutex;
|
||||
void addFaultCode(unsigned int code);
|
||||
void clearFaultCodes();
|
||||
std::vector<unsigned int> getFaultCodes() const;
|
||||
DriverTable m_currentDriverState;
|
||||
DriverTable m_subDisSysState;
|
||||
DriverTable m_subDisSysFault;
|
||||
|
||||
@@ -214,11 +214,20 @@ void UpperCommManager::processPeriodicTasks() {
|
||||
}
|
||||
|
||||
void UpperCommManager::buildSystemReport() {
|
||||
// 跨线程共享状态(listen 线程写、comm 线程读):持锁快照,避免撕裂/竞争
|
||||
pmState pmStateSnap{};
|
||||
disSysBreakerList disBreakerSnap{};
|
||||
{
|
||||
std::lock_guard<std::mutex> lock(m_pm->m_stateMutex);
|
||||
pmStateSnap = m_pm->m_pmCurrentState;
|
||||
disBreakerSnap = m_pm->m_currentDisBreakerState;
|
||||
}
|
||||
|
||||
m_pmStateMsg.state.workCondition = m_pm->workCondition;
|
||||
m_pmStateMsg.state.currentMod = m_pm->currentMod;
|
||||
m_pmStateMsg.state.powerState = m_pm->powerState;
|
||||
m_pmStateMsg.state.faultLevel = m_pm->faultLevel;
|
||||
m_pmStateMsg.state.faultCode = m_pm->faultCode;
|
||||
m_pmStateMsg.state.faultCode = m_pm->getFaultCodes();
|
||||
// cout << "m_pmStateMsg.state.faultCode.size():" << m_pmStateMsg.state.faultCode.size() << endl;
|
||||
m_pmStateMsg.state.soc = m_pm->soc;
|
||||
m_pmStateMsg.state.sustainableTime = m_pm->sustainableTime;
|
||||
@@ -229,14 +238,14 @@ void UpperCommManager::buildSystemReport() {
|
||||
m_pm->sendNotification(m_pmStateMsg.key, m_pmStateMsg.buildMsg(*(m_pm->m_systemData)));
|
||||
m_pm->sendNotification(m_fcsStateMsg.key, m_fcsStateMsg.buildMsg(*(m_pm->m_systemData)));
|
||||
m_pm->sendNotification(m_liBatStateMsg.key, m_liBatStateMsg.buildMsg(*(m_pm->m_systemData)));
|
||||
m_pm->sendNotification(m_disSysStateMsg.key, m_disSysStateMsg.buildMsg(*(m_pm->m_systemData),m_pm->m_currentDisBreakerState));
|
||||
m_pm->sendNotification(m_currentStateMsg.key, m_currentStateMsg.buildMsg(m_pm->m_pmCurrentState));
|
||||
m_pm->sendNotification(m_disSysStateMsg.key, m_disSysStateMsg.buildMsg(*(m_pm->m_systemData), disBreakerSnap));
|
||||
m_pm->sendNotification(m_currentStateMsg.key, m_currentStateMsg.buildMsg(pmStateSnap));
|
||||
|
||||
#ifdef _DEBUG
|
||||
m_pmStateMsg_fb_debug = std::make_pair(m_pmStateMsg.key, m_pmStateMsg.buildMsg(*(m_pm->m_systemData)));
|
||||
m_fcsStateMsg_st_debug = std::make_pair(m_fcsStateMsg.key, m_fcsStateMsg.buildMsg(*(m_pm->m_systemData)));
|
||||
m_liBatStateMsg_st_debug = std::make_pair(m_liBatStateMsg.key, m_liBatStateMsg.buildMsg(*(m_pm->m_systemData)));
|
||||
m_disSysStateMsg_st_debug = std::make_pair(m_disSysStateMsg.key, m_disSysStateMsg.buildMsg(*(m_pm->m_systemData),m_pm->m_currentDisBreakerState));
|
||||
m_currentStateMsg_st_debug = std::make_pair(m_currentStateMsg.key, m_currentStateMsg.buildMsg(m_pm->m_pmCurrentState));
|
||||
m_disSysStateMsg_st_debug = std::make_pair(m_disSysStateMsg.key, m_disSysStateMsg.buildMsg(*(m_pm->m_systemData), disBreakerSnap));
|
||||
m_currentStateMsg_st_debug = std::make_pair(m_currentStateMsg.key, m_currentStateMsg.buildMsg(pmStateSnap));
|
||||
#endif
|
||||
}
|
||||
|
||||
@@ -82,7 +82,7 @@ void Lifting::entry() {
|
||||
MOOSPause(3);
|
||||
{
|
||||
int count=0;
|
||||
while (!(pm->m_systemData->dyn_pos_relay_status == 0x02 && pm->m_systemData->dyn_neg_relay_status == 0x02))
|
||||
while (!(pm->m_systemData->getDynPosRelayStatus() == 0x02 && pm->m_systemData->getDynNegRelayStatus() == 0x02))
|
||||
{
|
||||
LOG_F(INFO,"动力锂电池下电中...");
|
||||
MOOSPause(3);
|
||||
|
||||
@@ -36,7 +36,7 @@ void PowerManagerFsm::react(CycleTriggeredEvent const &){
|
||||
{
|
||||
if(pm->m_depth < OVER_DEPTH)
|
||||
{
|
||||
if(pm->m_systemData->power_a_bus_status.xczCircuitBreaker == 1)
|
||||
if(pm->m_systemData->getPowerABusStatus().xczCircuitBreaker == 1)
|
||||
pm->m_lowerCommManager->operate_HVA_xczCircuit_Breaker(0);
|
||||
//舷侧阵自动下电
|
||||
MOOSPause(3);
|
||||
@@ -66,10 +66,13 @@ void PowerManagerFsm::handleCuriseWork()
|
||||
//依次接入执行机构动力电设备
|
||||
//1. 开启动力电
|
||||
//1.1 动力锂电池上电
|
||||
pm->m_CcuColCmd.powerBatCmd = BatteryCommand::Start;
|
||||
{
|
||||
std::lock_guard<std::mutex> lock(pm->m_stateMutex);
|
||||
pm->m_CcuColCmd.powerBatCmd = BatteryCommand::Start;
|
||||
}
|
||||
// 等待动力锂电池上电完成
|
||||
int count=0;
|
||||
while (!(pm->m_systemData->dyn_voltage_link > 500.0))
|
||||
while (!(pm->m_systemData->getDynVoltageLink() > 500.0))
|
||||
{
|
||||
LOG_F(INFO,"动力锂电池上电中...");
|
||||
MOOSPause(1000);
|
||||
@@ -82,27 +85,27 @@ void PowerManagerFsm::handleCuriseWork()
|
||||
count++;
|
||||
}
|
||||
//1.2 闭合动力电断路器
|
||||
if(pm->m_systemData->power_bus_status.lithiumBatteryGroupInstrumentCircuitBreaker != 1)
|
||||
if(pm->m_systemData->getPowerBusStatus().lithiumBatteryGroupInstrumentCircuitBreaker != 1)
|
||||
{
|
||||
pm->m_lowerCommManager->operate_HV_powerLithiumBattery_Breaker(1);
|
||||
MOOSPause(3);
|
||||
}
|
||||
if(pm->m_systemData->power_bus_status.dcDc5ModuleCircuitBreaker != 1)
|
||||
if(pm->m_systemData->getPowerBusStatus().dcDc5ModuleCircuitBreaker != 1)
|
||||
{
|
||||
pm->m_lowerCommManager->operate_HV_dcDc5Module_Breaker(1);
|
||||
MOOSPause(3);
|
||||
}
|
||||
if(pm->m_systemData->m_dcdcStatus.workingStatus != 1)
|
||||
if(pm->m_systemData->getDcdcStatus().workingStatus != 1)
|
||||
{
|
||||
pm->m_lowerCommManager->operate_HV_dcDc5_Breaker(1);
|
||||
MOOSPause(3);
|
||||
}
|
||||
if(!(pm->m_systemData->m_dcdcStatus.coolingPump1Running || pm->m_systemData->m_dcdcStatus.coolingPump2Running))
|
||||
if(!(pm->m_systemData->getDcdcStatus().coolingPump1Running || pm->m_systemData->getDcdcStatus().coolingPump2Running))
|
||||
{
|
||||
pm->m_lowerCommManager->operate_HV_coolingSystem_Breaker(1);
|
||||
MOOSPause(10);
|
||||
}
|
||||
if(pm->m_systemData->power_bus_status.bowHighVoltageDistributionBoxCircuitBreaker != 1)
|
||||
if(pm->m_systemData->getPowerBusStatus().bowHighVoltageDistributionBoxCircuitBreaker != 1)
|
||||
{
|
||||
pm->m_lowerCommManager->operate_HV_bowHighVoltageBox_Breaker(1);
|
||||
MOOSPause(3);
|
||||
@@ -1040,7 +1043,7 @@ void PowerManagerFsm::getNoPowerDeviceStatus(DriverTable &s)
|
||||
|
||||
void PowerManagerFsm::getBowRudderSystemStatus(DriverTable &s)
|
||||
{
|
||||
if(pm->m_systemData->power_a_bus_status.bowRudderControlBoxCircuitBreaker == 1)
|
||||
if(pm->m_systemData->getPowerABusStatus().bowRudderControlBoxCircuitBreaker == 1)
|
||||
{
|
||||
//检查艏舵电缸
|
||||
if(pm->m_subDisSysState.bowRudderDeploy == 1)
|
||||
@@ -1103,7 +1106,7 @@ void PowerManagerFsm::getBowRudderSystemStatus(DriverTable &s)
|
||||
}
|
||||
void PowerManagerFsm::getActuatorStatus(DriverTable &s)
|
||||
{
|
||||
if(pm->m_systemData->power_a_bus_status.actuatorCircuitBreaker == 1)
|
||||
if(pm->m_systemData->getPowerABusStatus().actuatorCircuitBreaker == 1)
|
||||
{
|
||||
if(pm->m_subDisSysState.bowCover1 == 1)
|
||||
{
|
||||
@@ -1220,7 +1223,7 @@ void PowerManagerFsm::getActuatorStatus(DriverTable &s)
|
||||
void PowerManagerFsm::getSternRudderStatus(DriverTable &s)
|
||||
{
|
||||
//艉舵1 2
|
||||
if(pm->m_systemData->power_bus_status.sternRudderSwitch1CircuitBreaker == 1)
|
||||
if(pm->m_systemData->getPowerBusStatus().sternRudderSwitch1CircuitBreaker == 1)
|
||||
{
|
||||
if(pm->m_subDisSysState.sternRudderServo1== 1)
|
||||
{
|
||||
@@ -1261,7 +1264,7 @@ void PowerManagerFsm::getSternRudderStatus(DriverTable &s)
|
||||
}
|
||||
}
|
||||
//艉舵3 4
|
||||
if(pm->m_systemData->power_bus_status.sternRudderSwitch2CircuitBreaker == 1)
|
||||
if(pm->m_systemData->getPowerBusStatus().sternRudderSwitch2CircuitBreaker == 1)
|
||||
{
|
||||
if(pm->m_subDisSysState.sternRudderServo3 == 1)
|
||||
{
|
||||
@@ -1305,7 +1308,7 @@ void PowerManagerFsm::getSternRudderStatus(DriverTable &s)
|
||||
|
||||
void PowerManagerFsm::getPropulsionMotorStatus(DriverTable &s)
|
||||
{
|
||||
if(pm->m_systemData->power_bus_status.propulsionMotorCircuitBreaker == 1)
|
||||
if(pm->m_systemData->getPowerBusStatus().propulsionMotorCircuitBreaker == 1)
|
||||
{
|
||||
if(pm->m_subDisSysState.thruster == 1)
|
||||
{
|
||||
@@ -1331,7 +1334,7 @@ void PowerManagerFsm::getPropulsionMotorStatus(DriverTable &s)
|
||||
void PowerManagerFsm::getBuoyancyAdjustmentStatus(DriverTable &s)
|
||||
{
|
||||
// 艉部浮调
|
||||
if(pm->m_systemData->power_bus_status.sternFTDevice45CircuitBreaker == 1)
|
||||
if(pm->m_systemData->getPowerBusStatus().sternFTDevice45CircuitBreaker == 1)
|
||||
{
|
||||
if(pm->m_subDisSysState.buoyancyAdjust4 == 1)
|
||||
{
|
||||
@@ -1373,7 +1376,7 @@ void PowerManagerFsm::getBuoyancyAdjustmentStatus(DriverTable &s)
|
||||
}
|
||||
|
||||
// 艏部浮调
|
||||
if(pm->m_systemData->power_a_bus_status.bowFTDevice123CircuitBreaker == 1)
|
||||
if(pm->m_systemData->getPowerABusStatus().bowFTDevice123CircuitBreaker == 1)
|
||||
{
|
||||
if(pm->m_subDisSysState.buoyancyAdjust1 == 1)
|
||||
{
|
||||
@@ -1435,7 +1438,7 @@ void PowerManagerFsm::getBuoyancyAdjustmentStatus(DriverTable &s)
|
||||
|
||||
void PowerManagerFsm::getSideSonarStatus(DriverTable &s)
|
||||
{
|
||||
if(pm->m_systemData->power_a_bus_status.xczCircuitBreaker == 1)
|
||||
if(pm->m_systemData->getPowerABusStatus().xczCircuitBreaker == 1)
|
||||
{
|
||||
if(pm->m_subDisSysState.sideSonar == 1)
|
||||
{
|
||||
@@ -1461,7 +1464,7 @@ void PowerManagerFsm::getSideSonarStatus(DriverTable &s)
|
||||
|
||||
void PowerManagerFsm::getFBSystemCmdStatus(DriverTable &s)
|
||||
{
|
||||
if(pm->m_systemData->power_bus_status.fbReservedCircuitBreaker == 1)
|
||||
if(pm->m_systemData->getPowerBusStatus().fbReservedCircuitBreaker == 1)
|
||||
{
|
||||
if(pm->m_subDisSysState.buoyage == 1)
|
||||
{
|
||||
@@ -1487,7 +1490,7 @@ void PowerManagerFsm::getFBSystemCmdStatus(DriverTable &s)
|
||||
|
||||
void PowerManagerFsm::getMastFoldingSystem(DriverTable &s)
|
||||
{
|
||||
if(pm->m_systemData->power_a_bus_status.mastSteeringGearControlBoxCircuitBreaker == 1)
|
||||
if(pm->m_systemData->getPowerABusStatus().mastSteeringGearControlBoxCircuitBreaker == 1)
|
||||
{
|
||||
if(pm->m_subDisSysState.mastLiftingServo == 1)
|
||||
{
|
||||
@@ -1513,7 +1516,7 @@ void PowerManagerFsm::getMastFoldingSystem(DriverTable &s)
|
||||
|
||||
void PowerManagerFsm::getOpenWaterStatus(DriverTable &s)
|
||||
{
|
||||
if(pm->m_systemData->power_a_bus_status.openWaterCoverStartCylinderCircuitBreaker == 1)
|
||||
if(pm->m_systemData->getPowerABusStatus().openWaterCoverStartCylinderCircuitBreaker == 1)
|
||||
{
|
||||
if(pm->m_subDisSysState.bowWaterInet1 == 1)
|
||||
{
|
||||
@@ -1752,12 +1755,12 @@ void PowerManagerFsm::basicNavigationFault()
|
||||
if(pm->m_subDisSysFault.sternRudderServo4 == 1)
|
||||
pm->m_systemData->insertFaultCode(0x1309);
|
||||
}
|
||||
if (pm->m_systemData->disSysFaultCode.find(7) != pm->m_systemData->disSysFaultCode.end())
|
||||
if (pm->m_systemData->hasDisSysFaultCode(7))
|
||||
{
|
||||
pm->m_systemData->insertFaultCode(0x1306);
|
||||
pm->m_systemData->insertFaultCode(0x1307);
|
||||
}
|
||||
if (pm->m_systemData->disSysFaultCode.find(8) != pm->m_systemData->disSysFaultCode.end())
|
||||
if (pm->m_systemData->hasDisSysFaultCode(8))
|
||||
{
|
||||
pm->m_systemData->insertFaultCode(0x1308);
|
||||
pm->m_systemData->insertFaultCode(0x1309);
|
||||
@@ -1765,19 +1768,19 @@ void PowerManagerFsm::basicNavigationFault()
|
||||
if(count == 0)
|
||||
{
|
||||
// 清空故障码
|
||||
if(pm->m_systemData->disSysFaultCode.find(7) == pm->m_systemData->disSysFaultCode.end())
|
||||
if(!pm->m_systemData->hasDisSysFaultCode(7))
|
||||
{
|
||||
pm->m_systemData->eraseFaultCode(0x1306);
|
||||
pm->m_systemData->eraseFaultCode(0x1307);
|
||||
}
|
||||
if(pm->m_systemData->disSysFaultCode.find(8) == pm->m_systemData->disSysFaultCode.end())
|
||||
if(!pm->m_systemData->hasDisSysFaultCode(8))
|
||||
{
|
||||
pm->m_systemData->eraseFaultCode(0x1308);
|
||||
pm->m_systemData->eraseFaultCode(0x1309);
|
||||
}
|
||||
}
|
||||
//=====处理动力电池故障======================
|
||||
if(pm->m_systemData->dyn_emergency_status != 0 )
|
||||
if(pm->m_systemData->getDynEmergencyStatus() != 0 )
|
||||
{
|
||||
pm->m_systemData->insertFaultCode(0x130B);
|
||||
}
|
||||
@@ -1788,7 +1791,7 @@ void PowerManagerFsm::basicNavigationFault()
|
||||
}
|
||||
else
|
||||
{
|
||||
if(pm->m_systemData->disSysFaultCode.find(3) == pm->m_systemData->disSysFaultCode.end())
|
||||
if(!pm->m_systemData->hasDisSysFaultCode(3))
|
||||
{
|
||||
pm->m_systemData->eraseFaultCode(0x130A);
|
||||
}
|
||||
@@ -1816,7 +1819,7 @@ void PowerManagerFsm::basicNavigationFault()
|
||||
pm->m_systemData->eraseFaultCode(0x1412);
|
||||
}
|
||||
//====处理复合管控器失效
|
||||
if(pm->m_systemData->device_common_status.ccu_status.isTimeout)
|
||||
if(pm->m_systemData->getDeviceCommonStatus().ccu_status.isTimeout)
|
||||
{
|
||||
pm->m_systemData->insertFaultCode(0x1413);
|
||||
}
|
||||
@@ -1831,63 +1834,63 @@ void PowerManagerFsm::basicNavigationFault(FaultEvent const &e)
|
||||
if((e.injectionFaultCode==1))
|
||||
{
|
||||
LOG_F(INFO, "部分深度计失效");
|
||||
pm->faultCode.push_back(0x1102);
|
||||
pm->faultCode.push_back(0x1103);
|
||||
pm->faultCode.push_back(0x1104);
|
||||
pm->addFaultCode(0x1102);
|
||||
pm->addFaultCode(0x1103);
|
||||
pm->addFaultCode(0x1104);
|
||||
}
|
||||
if((e.injectionFaultCode==2))
|
||||
{
|
||||
LOG_F(INFO, "DVL失效");
|
||||
pm->faultCode.push_back(0x1301);
|
||||
pm->addFaultCode(0x1301);
|
||||
}
|
||||
if ((e.injectionFaultCode==3))
|
||||
{
|
||||
LOG_F(INFO, "单个艉舵失效");
|
||||
pm->faultCode.push_back(0x1207);
|
||||
pm->addFaultCode(0x1207);
|
||||
}
|
||||
if ((e.injectionFaultCode==4))
|
||||
{
|
||||
LOG_F(INFO, "部分艉舵失效");
|
||||
pm->faultCode.push_back(0x1308);
|
||||
pm->faultCode.push_back(0x1307);
|
||||
pm->addFaultCode(0x1308);
|
||||
pm->addFaultCode(0x1307);
|
||||
}
|
||||
if ((e.injectionFaultCode==5))
|
||||
{
|
||||
LOG_F(INFO, "动力锂电池失效");
|
||||
pm->faultCode.push_back(0x130B);
|
||||
pm->addFaultCode(0x130B);
|
||||
}
|
||||
if ((e.injectionFaultCode==6))
|
||||
{
|
||||
LOG_F(INFO, "推进电机失效");
|
||||
pm->faultCode.push_back(0x130A);
|
||||
pm->addFaultCode(0x130A);
|
||||
}
|
||||
if ((e.injectionFaultCode==7))
|
||||
{
|
||||
LOG_F(INFO, "惯导失效");
|
||||
pm->faultCode.push_back(0x1305);
|
||||
pm->addFaultCode(0x1305);
|
||||
}
|
||||
if ((e.injectionFaultCode==8))
|
||||
{
|
||||
LOG_F(INFO, "深度失效");
|
||||
pm->faultCode.push_back(0x1302);
|
||||
pm->faultCode.push_back(0x1303);
|
||||
pm->faultCode.push_back(0x1304);
|
||||
pm->addFaultCode(0x1302);
|
||||
pm->addFaultCode(0x1303);
|
||||
pm->addFaultCode(0x1304);
|
||||
}
|
||||
if ((e.injectionFaultCode==9))
|
||||
{
|
||||
LOG_F(INFO, "仪表锂电池失效");
|
||||
pm->faultCode.push_back(0x1412);
|
||||
pm->addFaultCode(0x1412);
|
||||
}
|
||||
if ((e.injectionFaultCode==10))
|
||||
{
|
||||
LOG_F(INFO, "复合管控器失效");
|
||||
pm->faultCode.push_back(0x1413);
|
||||
pm->addFaultCode(0x1413);
|
||||
}
|
||||
}
|
||||
void PowerManagerFsm::extendedNavigationFault()
|
||||
{
|
||||
//处理艏舵故障
|
||||
if(pm->m_systemData->disSysFaultCode.find(17) != pm->m_systemData->disSysFaultCode.end())
|
||||
if(pm->m_systemData->hasDisSysFaultCode(17))
|
||||
{
|
||||
pm->m_systemData->insertFaultCode(0x2311);
|
||||
pm->m_systemData->insertFaultCode(0x2312);
|
||||
@@ -1939,22 +1942,22 @@ void PowerManagerFsm::extendedNavigationFault(FaultEvent const &e)
|
||||
if ((e.injectionFaultCode==1))
|
||||
{
|
||||
LOG_F(INFO, "艏舵展开电缸失效");
|
||||
pm->faultCode.push_back(0x2311);
|
||||
pm->addFaultCode(0x2311);
|
||||
}
|
||||
if ((e.injectionFaultCode==2))
|
||||
{
|
||||
LOG_F(INFO, "艏舵控制控制失效");
|
||||
pm->faultCode.push_back(0x2312);
|
||||
pm->addFaultCode(0x2312);
|
||||
}
|
||||
if ((e.injectionFaultCode==3))
|
||||
{
|
||||
LOG_F(INFO, "动力锂电池功率不满/失效");
|
||||
pm->faultCode.push_back(0x2323);
|
||||
pm->addFaultCode(0x2323);
|
||||
}
|
||||
if ((e.injectionFaultCode==4))
|
||||
{
|
||||
LOG_F(INFO, "燃料电池失效");
|
||||
pm->faultCode.push_back(0x2334);
|
||||
pm->addFaultCode(0x2334);
|
||||
}
|
||||
}
|
||||
void PowerManagerFsm::obstacleAvoidanceFault()
|
||||
@@ -2061,22 +2064,22 @@ void PowerManagerFsm::obstacleAvoidanceFault(FaultEvent const &e)
|
||||
LOG_F(INFO, "obstacleAvoidanceFault");
|
||||
if ((e.injectionFaultCode==1))
|
||||
{
|
||||
pm->faultCode.push_back(0x3108);
|
||||
pm->faultCode.push_back(0x3109);
|
||||
pm->addFaultCode(0x3108);
|
||||
pm->addFaultCode(0x3109);
|
||||
}
|
||||
if ((e.injectionFaultCode==2))
|
||||
{
|
||||
pm->faultCode.push_back(0x3201);
|
||||
pm->faultCode.push_back(0x3202);
|
||||
pm->faultCode.push_back(0x3203);
|
||||
pm->faultCode.push_back(0x3204);
|
||||
pm->faultCode.push_back(0x3205);
|
||||
pm->faultCode.push_back(0x3206);
|
||||
pm->faultCode.push_back(0x3207);
|
||||
pm->addFaultCode(0x3201);
|
||||
pm->addFaultCode(0x3202);
|
||||
pm->addFaultCode(0x3203);
|
||||
pm->addFaultCode(0x3204);
|
||||
pm->addFaultCode(0x3205);
|
||||
pm->addFaultCode(0x3206);
|
||||
pm->addFaultCode(0x3207);
|
||||
}
|
||||
if ((e.injectionFaultCode==3))
|
||||
{
|
||||
pm->faultCode.push_back(0x3301);
|
||||
pm->addFaultCode(0x3301);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -2089,8 +2092,8 @@ void PowerManagerFsm::buoyancyControlFault()
|
||||
+ (pm->m_subDisSysFault.buoyancyAdjust4 == 1)
|
||||
+ (pm->m_subDisSysFault.buoyancyAdjust5 == 1);
|
||||
|
||||
bool breaker7_fault = pm->m_systemData->disSysFaultCode.find(7) != pm->m_systemData->disSysFaultCode.end();
|
||||
bool breaker13_fault = pm->m_systemData->disSysFaultCode.find(13) != pm->m_systemData->disSysFaultCode.end();
|
||||
bool breaker7_fault = pm->m_systemData->hasDisSysFaultCode(7);
|
||||
bool breaker13_fault = pm->m_systemData->hasDisSysFaultCode(13);
|
||||
//===========艏部浮调====================
|
||||
if(breaker7_fault)
|
||||
{
|
||||
@@ -2256,24 +2259,24 @@ void PowerManagerFsm::buoyancyControlFault(FaultEvent const &e)
|
||||
if ((e.injectionFaultCode==1))
|
||||
{
|
||||
LOG_F(INFO, "单一浮调机构失效");
|
||||
pm->faultCode.push_back(0x4201);
|
||||
pm->addFaultCode(0x4201);
|
||||
}
|
||||
if ((e.injectionFaultCode==2))
|
||||
{
|
||||
LOG_F(INFO, "2-4及以上浮调装置失效");
|
||||
pm->faultCode.push_back(0x4301);
|
||||
pm->faultCode.push_back(0x4302);
|
||||
pm->faultCode.push_back(0x4303);
|
||||
pm->addFaultCode(0x4301);
|
||||
pm->addFaultCode(0x4302);
|
||||
pm->addFaultCode(0x4303);
|
||||
}
|
||||
if ((e.injectionFaultCode==3))
|
||||
{
|
||||
LOG_F(INFO, "功率不足满足浮调要求");
|
||||
pm->faultCode.push_back(0x4436);
|
||||
pm->addFaultCode(0x4436);
|
||||
}
|
||||
if ((e.injectionFaultCode==4))
|
||||
{
|
||||
LOG_F(INFO, "所有浮调系统失效");
|
||||
pm->faultCode.push_back(0x4401);
|
||||
pm->addFaultCode(0x4401);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2319,7 +2322,7 @@ void PowerManagerFsm::communicationSystemFault()
|
||||
else
|
||||
pm->m_systemData->eraseFaultCode(0x5301);
|
||||
|
||||
if(pm->m_subDisSysFault.mastLiftingServo == 1 || (pm->m_systemData->disSysFaultCode.find(15) != pm->m_systemData->disSysFaultCode.end()))
|
||||
if(pm->m_subDisSysFault.mastLiftingServo == 1 || (pm->m_systemData->hasDisSysFaultCode(15)))
|
||||
pm->m_systemData->insertFaultCode(0x5302);
|
||||
else
|
||||
pm->m_systemData->eraseFaultCode(0x5302);
|
||||
@@ -2331,22 +2334,22 @@ void PowerManagerFsm::communicationSystemFault(FaultEvent const &e)
|
||||
if ((e.injectionFaultCode==1))
|
||||
{
|
||||
LOG_F(INFO, "部分水下通信失效");
|
||||
pm->faultCode.push_back(0x5203);
|
||||
pm->faultCode.push_back(0x5204);
|
||||
pm->faultCode.push_back(0x5205);
|
||||
pm->addFaultCode(0x5203);
|
||||
pm->addFaultCode(0x5204);
|
||||
pm->addFaultCode(0x5205);
|
||||
}
|
||||
if ((e.injectionFaultCode==2))
|
||||
{
|
||||
LOG_F(INFO, "水下通信失效");
|
||||
pm->faultCode.push_back(0x5303);
|
||||
pm->faultCode.push_back(0x5304);
|
||||
pm->faultCode.push_back(0x5305);
|
||||
pm->addFaultCode(0x5303);
|
||||
pm->addFaultCode(0x5304);
|
||||
pm->addFaultCode(0x5305);
|
||||
}
|
||||
if ((e.injectionFaultCode==3))
|
||||
{
|
||||
LOG_F(INFO, "水面通信失效");
|
||||
pm->faultCode.push_back(0x5301);
|
||||
pm->faultCode.push_back(0x5302);
|
||||
pm->addFaultCode(0x5301);
|
||||
pm->addFaultCode(0x5302);
|
||||
}
|
||||
}
|
||||
void PowerManagerFsm::payloadSystemFault()
|
||||
@@ -2366,8 +2369,8 @@ void PowerManagerFsm::payloadSystemFault()
|
||||
+ (pm->m_subDisSysFault.bowWaterInet7 == 1)
|
||||
+ (pm->m_subDisSysFault.bowWaterInet8 == 1);
|
||||
|
||||
if((pm->m_systemData->disSysFaultCode.find(14) == pm->m_systemData->disSysFaultCode.end())
|
||||
&& (pm->m_systemData->disSysFaultCode.find(18) == pm->m_systemData->disSysFaultCode.end()))
|
||||
if((!pm->m_systemData->hasDisSysFaultCode(14))
|
||||
&& (!pm->m_systemData->hasDisSysFaultCode(18)))
|
||||
{
|
||||
if(count > 0 && count < 14)
|
||||
{
|
||||
@@ -2387,8 +2390,8 @@ void PowerManagerFsm::payloadSystemFault()
|
||||
if(pm->m_subDisSysFault.bowWaterInet8 == 1) pm->m_systemData->insertFaultCode(0x621E); else pm->m_systemData->eraseFaultCode(0x621E);
|
||||
}
|
||||
}
|
||||
if((pm->m_systemData->disSysFaultCode.find(14) != pm->m_systemData->disSysFaultCode.end())
|
||||
&& (pm->m_systemData->disSysFaultCode.find(18) == pm->m_systemData->disSysFaultCode.end()))
|
||||
if((pm->m_systemData->hasDisSysFaultCode(14))
|
||||
&& (!pm->m_systemData->hasDisSysFaultCode(18)))
|
||||
{
|
||||
pm->m_systemData->insertFaultCode(0x633F);
|
||||
}
|
||||
@@ -2400,8 +2403,8 @@ void PowerManagerFsm::payloadSystemFault()
|
||||
{
|
||||
pm->m_systemData->insertFaultCode(0x633F);
|
||||
}
|
||||
if(count == 0 && ((pm->m_systemData->disSysFaultCode.find(14) == pm->m_systemData->disSysFaultCode.end())
|
||||
&& (pm->m_systemData->disSysFaultCode.find(18) == pm->m_systemData->disSysFaultCode.end())
|
||||
if(count == 0 && ((!pm->m_systemData->hasDisSysFaultCode(14))
|
||||
&& (!pm->m_systemData->hasDisSysFaultCode(18))
|
||||
&& (pm->m_subDisSysFault.launchControler == 0))
|
||||
)
|
||||
{
|
||||
@@ -2413,7 +2416,7 @@ void PowerManagerFsm::payloadSystemFault()
|
||||
else
|
||||
pm->m_systemData->eraseFaultCode(0x6321);
|
||||
|
||||
if(pm->m_systemData->disSysFaultCode.find(16) == pm->m_systemData->disSysFaultCode.end())
|
||||
if(!pm->m_systemData->hasDisSysFaultCode(16))
|
||||
pm->m_systemData->eraseFaultCode(0x6323);
|
||||
else
|
||||
pm->m_systemData->insertFaultCode(0x6323);
|
||||
@@ -2437,50 +2440,50 @@ void PowerManagerFsm::payloadSystemFault(FaultEvent const &e)
|
||||
if ((e.injectionFaultCode==1))
|
||||
{
|
||||
LOG_F(INFO, "存在启闭机构或者敞水电缸失效");
|
||||
pm->faultCode.push_back(0x6211);
|
||||
pm->faultCode.push_back(0x6212);
|
||||
pm->faultCode.push_back(0x6213);
|
||||
pm->faultCode.push_back(0x6214);
|
||||
pm->faultCode.push_back(0x6215);
|
||||
pm->faultCode.push_back(0x6216);
|
||||
pm->faultCode.push_back(0x6217);
|
||||
pm->faultCode.push_back(0x6218);
|
||||
pm->faultCode.push_back(0x6219);
|
||||
pm->faultCode.push_back(0x621A);
|
||||
pm->faultCode.push_back(0x621B);
|
||||
pm->faultCode.push_back(0x621C);
|
||||
pm->faultCode.push_back(0x621D);
|
||||
pm->faultCode.push_back(0x621E);
|
||||
pm->addFaultCode(0x6211);
|
||||
pm->addFaultCode(0x6212);
|
||||
pm->addFaultCode(0x6213);
|
||||
pm->addFaultCode(0x6214);
|
||||
pm->addFaultCode(0x6215);
|
||||
pm->addFaultCode(0x6216);
|
||||
pm->addFaultCode(0x6217);
|
||||
pm->addFaultCode(0x6218);
|
||||
pm->addFaultCode(0x6219);
|
||||
pm->addFaultCode(0x621A);
|
||||
pm->addFaultCode(0x621B);
|
||||
pm->addFaultCode(0x621C);
|
||||
pm->addFaultCode(0x621D);
|
||||
pm->addFaultCode(0x621E);
|
||||
}
|
||||
if ((e.injectionFaultCode==2))
|
||||
{
|
||||
LOG_F(INFO, "舷侧探测失效");
|
||||
pm->faultCode.push_back(0x6321);
|
||||
pm->addFaultCode(0x6321);
|
||||
}
|
||||
if ((e.injectionFaultCode==3))
|
||||
{
|
||||
LOG_F(INFO, "舷侧主动探测失效");
|
||||
pm->faultCode.push_back(0x6323);
|
||||
pm->addFaultCode(0x6323);
|
||||
}
|
||||
if ((e.injectionFaultCode==4))
|
||||
{
|
||||
LOG_F(INFO, "TYZ失效");
|
||||
pm->faultCode.push_back(0x6322);
|
||||
pm->addFaultCode(0x6322);
|
||||
}
|
||||
if ((e.injectionFaultCode==5))
|
||||
{
|
||||
LOG_F(INFO, "光电探测失效");
|
||||
pm->faultCode.push_back(0x6332);
|
||||
pm->addFaultCode(0x6332);
|
||||
}
|
||||
if ((e.injectionFaultCode==6))
|
||||
{
|
||||
LOG_F(INFO, "电磁探测失效");
|
||||
pm->faultCode.push_back(0x6331);
|
||||
pm->addFaultCode(0x6331);
|
||||
}
|
||||
if ((e.injectionFaultCode==7))
|
||||
{
|
||||
LOG_F(INFO, "载荷失效或者全部载荷启闭机构均失效");
|
||||
pm->faultCode.push_back(0x633F);
|
||||
pm->addFaultCode(0x633F);
|
||||
}
|
||||
}
|
||||
void PowerManagerFsm::emergencySystemFault()
|
||||
@@ -2514,14 +2517,14 @@ void PowerManagerFsm::emergencySystemFault()
|
||||
else
|
||||
pm->m_systemData->eraseFaultCode(0x7301);
|
||||
|
||||
if(pm->m_systemData->power_bus_status.emergencyPowerLossSignal || pm->m_systemData->instrument_main_bus_status.emergencyPowerFailureSignal
|
||||
|| (pm->m_systemData->disSysFaultCode.find(25) != pm->m_systemData->disSysFaultCode.end()))
|
||||
if(pm->m_systemData->getPowerBusStatus().emergencyPowerLossSignal || pm->m_systemData->getInstrumentMainBusStatus().emergencyPowerFailureSignal
|
||||
|| (pm->m_systemData->hasDisSysFaultCode(25)))
|
||||
pm->m_systemData->insertFaultCode(0x7306);
|
||||
else
|
||||
pm->m_systemData->eraseFaultCode(0x7306);
|
||||
|
||||
if(pm->m_systemData->power_a_bus_status.emergencyPowerFailureSignal || pm->m_systemData->instrument_bus_status.emergencyPowerFailureSignal
|
||||
|| (pm->m_systemData->disSysFaultCode.find(33) != pm->m_systemData->disSysFaultCode.end()))
|
||||
if(pm->m_systemData->getPowerABusStatus().emergencyPowerFailureSignal || pm->m_systemData->getInstrumentBusStatus().emergencyPowerFailureSignal
|
||||
|| (pm->m_systemData->hasDisSysFaultCode(33)))
|
||||
pm->m_systemData->insertFaultCode(0x7307);
|
||||
else
|
||||
pm->m_systemData->eraseFaultCode(0x7307);
|
||||
@@ -2534,35 +2537,35 @@ void PowerManagerFsm::emergencySystemFault(FaultEvent const &e)
|
||||
{
|
||||
//备注:抛载具有自己的电池
|
||||
LOG_F(INFO, "部分抛载失效");
|
||||
pm->faultCode.push_back(0x7202);
|
||||
pm->faultCode.push_back(0x7203);
|
||||
pm->addFaultCode(0x7202);
|
||||
pm->addFaultCode(0x7203);
|
||||
}
|
||||
if ((e.injectionFaultCode==2))
|
||||
{
|
||||
LOG_F(INFO, "一个超深检测装置失效");
|
||||
pm->faultCode.push_back(0x7204);
|
||||
pm->faultCode.push_back(0x7205);
|
||||
pm->addFaultCode(0x7204);
|
||||
pm->addFaultCode(0x7205);
|
||||
}
|
||||
if ((e.injectionFaultCode==3))
|
||||
{
|
||||
LOG_F(INFO, "注水机构失效");
|
||||
pm->faultCode.push_back(0x7301);
|
||||
pm->addFaultCode(0x7301);
|
||||
}
|
||||
if ((e.injectionFaultCode==4))
|
||||
{
|
||||
LOG_F(INFO, "抛载失效");
|
||||
pm->faultCode.push_back(0x7302);
|
||||
pm->faultCode.push_back(0x7303);
|
||||
pm->addFaultCode(0x7302);
|
||||
pm->addFaultCode(0x7303);
|
||||
}
|
||||
if ((e.injectionFaultCode==5))
|
||||
{
|
||||
LOG_F(INFO, "艏部应急电源失效");
|
||||
pm->faultCode.push_back(0x7306);
|
||||
pm->addFaultCode(0x7306);
|
||||
}
|
||||
if ((e.injectionFaultCode==6))
|
||||
{
|
||||
LOG_F(INFO, "艉部应急电源失效");
|
||||
pm->faultCode.push_back(0x7307);
|
||||
pm->addFaultCode(0x7307);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2600,18 +2603,18 @@ void PowerManagerFsm::sensorSystemFault(FaultEvent const &e)
|
||||
if ((e.injectionFaultCode==1))
|
||||
{
|
||||
LOG_F(INFO, "部分CTD失效");
|
||||
pm->faultCode.push_back(0x8202);
|
||||
pm->addFaultCode(0x8202);
|
||||
}
|
||||
if ((e.injectionFaultCode==2))
|
||||
{
|
||||
LOG_F(INFO, "CTD失效");
|
||||
pm->faultCode.push_back(0x8302);
|
||||
pm->faultCode.push_back(0x8303);
|
||||
pm->addFaultCode(0x8302);
|
||||
pm->addFaultCode(0x8303);
|
||||
}
|
||||
if ((e.injectionFaultCode==3))
|
||||
{
|
||||
LOG_F(INFO, "声速仪失效");
|
||||
pm->faultCode.push_back(0x8301);
|
||||
pm->addFaultCode(0x8301);
|
||||
}
|
||||
}
|
||||
void PowerManagerFsm::react(FaultEvent const &e)
|
||||
@@ -2637,7 +2640,7 @@ void PowerManagerFsm::handelPowerCmd(){
|
||||
pm->m_systemData->setSystemInfo("INFO:收到上位机控制指令:关机");
|
||||
// MOOSPause(3);
|
||||
// int count=0;
|
||||
// while (!(pm->m_systemData->dyn_pos_relay_status == 0x02 && pm->m_systemData->dyn_neg_relay_status == 0x02))
|
||||
// while (!(pm->m_systemData->getDynPosRelayStatus() == 0x02 && pm->m_systemData->getDynNegRelayStatus() == 0x02))
|
||||
// {
|
||||
// LOG_F(INFO,"动力锂电池下电中...");
|
||||
// MOOSPause(3);
|
||||
@@ -2729,10 +2732,13 @@ void PowerManagerFsm::handelPowerCmd(){
|
||||
pm->m_lowerCommManager->operate_HV_powerLithiumBattery_Breaker(0);
|
||||
MOOSPause(1000);
|
||||
//最后 关闭动力电池
|
||||
pm->m_CcuColCmd.powerBatCmd = BatteryCommand::Stop;
|
||||
{
|
||||
std::lock_guard<std::mutex> lock(pm->m_stateMutex);
|
||||
pm->m_CcuColCmd.powerBatCmd = BatteryCommand::Stop;
|
||||
}
|
||||
{
|
||||
int count=0;
|
||||
while (!(pm->m_systemData->dyn_pos_relay_status == 0x02 && pm->m_systemData->dyn_neg_relay_status == 0x02))
|
||||
while (!(pm->m_systemData->getDynPosRelayStatus() == 0x02 && pm->m_systemData->getDynNegRelayStatus() == 0x02))
|
||||
{
|
||||
LOG_F(INFO,"动力锂电池下电中...");
|
||||
MOOSPause(1000);
|
||||
@@ -2751,7 +2757,10 @@ void PowerManagerFsm::handelPowerCmd(){
|
||||
pm->m_systemData->setSystemInfo("INFO:次级配电系统恢复待机");
|
||||
MOOSPause(3000);
|
||||
//4. 执行锂电池关机指令
|
||||
pm->m_CcuColCmd.insBatCmd = BatteryCommand::Stop;
|
||||
{
|
||||
std::lock_guard<std::mutex> lock(pm->m_stateMutex);
|
||||
pm->m_CcuColCmd.insBatCmd = BatteryCommand::Stop;
|
||||
}
|
||||
break;
|
||||
}
|
||||
case 1:
|
||||
@@ -2759,10 +2768,13 @@ void PowerManagerFsm::handelPowerCmd(){
|
||||
LOG_F(INFO, "收到上位机控制指令:动力电上电");
|
||||
pm->m_systemData->setSystemInfo("INFO:收到上位机控制指令:动力电上电");
|
||||
//1. 动力锂电池上电
|
||||
pm->m_CcuColCmd.powerBatCmd = BatteryCommand::Start;
|
||||
{
|
||||
std::lock_guard<std::mutex> lock(pm->m_stateMutex);
|
||||
pm->m_CcuColCmd.powerBatCmd = BatteryCommand::Start;
|
||||
}
|
||||
// 等待动力锂电池上电完成
|
||||
int count=0;
|
||||
while (!(pm->m_systemData->dyn_voltage_link > 500.0))
|
||||
while (!(pm->m_systemData->getDynVoltageLink() > 500.0))
|
||||
{
|
||||
LOG_F(INFO,"动力锂电池上电中...");
|
||||
MOOSPause(1000);
|
||||
@@ -2795,7 +2807,10 @@ void PowerManagerFsm::handelPowerCmd(){
|
||||
//1. 闭合动力电断路器
|
||||
pm->m_lowerCommManager->operate_HV_powerLithiumBattery_Breaker(1);
|
||||
//2. 动力锂电池上电
|
||||
pm->m_CcuColCmd.powerBatCmd = BatteryCommand::Start;
|
||||
{
|
||||
std::lock_guard<std::mutex> lock(pm->m_stateMutex);
|
||||
pm->m_CcuColCmd.powerBatCmd = BatteryCommand::Start;
|
||||
}
|
||||
break;
|
||||
}
|
||||
case 3:
|
||||
@@ -2820,7 +2835,7 @@ void PowerManagerFsm::handelPowerCmd(){
|
||||
pm->m_lowerCommManager->operate_HV_powerLithiumBattery_Breaker(0);
|
||||
MOOSPause(3);
|
||||
int count=0;
|
||||
while (!(pm->m_systemData->dyn_pos_relay_status == 0x02 && pm->m_systemData->dyn_neg_relay_status == 0x02))
|
||||
while (!(pm->m_systemData->getDynPosRelayStatus() == 0x02 && pm->m_systemData->getDynNegRelayStatus() == 0x02))
|
||||
{
|
||||
LOG_F(INFO,"动力锂电池下电中...");
|
||||
MOOSPause(3);
|
||||
@@ -2957,7 +2972,7 @@ void PowerManagerFsm::react(TestEvent const &e)
|
||||
LOG_F(INFO, "测试消息");
|
||||
if(e.type == 0){
|
||||
LOG_F(INFO, "清空故障代码");
|
||||
pm->faultCode.clear();
|
||||
pm->clearFaultCodes();
|
||||
pm->m_leakage = 0x00;
|
||||
pm->m_systemData->insfaultCode = 0x00;
|
||||
pm->m_systemData->powfaultCode = 0x00;
|
||||
@@ -2965,7 +2980,7 @@ void PowerManagerFsm::react(TestEvent const &e)
|
||||
pm->m_systemData->fc_fault_level_3 = 0;
|
||||
pm->m_systemData->fc_fault_level_2 = 0;
|
||||
pm->m_systemData->fc_fault_level_1 = 0;
|
||||
pm->m_systemData->disSysFaultCode.clear();
|
||||
pm->m_systemData->clearDisSysFaultCodes();
|
||||
cout << "清空故障代码" << endl;
|
||||
};
|
||||
// if(e.eventId == 0) return ;
|
||||
@@ -3070,7 +3085,7 @@ void PowerManagerFsm::react(TestEvent const &e)
|
||||
{
|
||||
LOG_F(INFO,"配电系统故障测试");
|
||||
// pm->m_systemData->distributeFaultCode.push_back(disfaultMap[e.eventId].code);
|
||||
pm->m_systemData->disSysFaultCode.insert(disfaultMap[e.eventId].code);
|
||||
pm->m_systemData->insertDisSysFaultCode(disfaultMap[e.eventId].code);
|
||||
}
|
||||
default:
|
||||
LOG_F(INFO, "测试消息类型错误");
|
||||
|
||||
@@ -15,10 +15,13 @@ void ShoreBasedReady::entry() {
|
||||
//依次接入执行机构动力电设备
|
||||
//1. 开启动力电
|
||||
//1.1 动力锂电池上电
|
||||
pm->m_CcuColCmd.powerBatCmd = BatteryCommand::Start;
|
||||
{
|
||||
std::lock_guard<std::mutex> lock(pm->m_stateMutex);
|
||||
pm->m_CcuColCmd.powerBatCmd = BatteryCommand::Start;
|
||||
}
|
||||
// 等待动力锂电池上电完成
|
||||
int count=0;
|
||||
while (!(pm->m_systemData->dyn_voltage_link > 500.0))
|
||||
while (!(pm->m_systemData->getDynVoltageLink() > 500.0))
|
||||
{
|
||||
LOG_F(INFO,"动力锂电池上电中...");
|
||||
MOOSPause(1000);
|
||||
|
||||
@@ -35,8 +35,8 @@ void HttpServer::handleWebSocketEvent(struct mg_connection* c, int ev, void* ev_
|
||||
c->id, (int)(intptr_t)c->fd, errno);
|
||||
// 打印socket错误信息
|
||||
char buf[256];
|
||||
strerror_r(errno, buf, sizeof(buf));
|
||||
LOG_F(ERROR, "Socket error: %s", buf);
|
||||
const char *err = strerror_r(errno, buf, sizeof(buf));
|
||||
LOG_F(ERROR, "Socket error: %s", err ? err : buf);
|
||||
} else {
|
||||
LOG_F(ERROR, "WebSocket connection closed abnormally: id=%lu fd=%d",
|
||||
c->id, (int)(intptr_t)c->fd);
|
||||
@@ -133,16 +133,19 @@ void HttpServer::handleWebSocketEvent(struct mg_connection* c, int ev, void* ev_
|
||||
fuelCellMode, fuelCellCommand, fuelCellPower,
|
||||
instrumentBattery, instrumentBatteryCharge, powerBattery, powerBatteryPower, hostStatus);
|
||||
|
||||
m_powerManger->m_CcuColCmd.fcmode = fuelCellMode;
|
||||
m_powerManger->m_CcuColCmd.fcuCmd = fuelCellCommand;
|
||||
m_powerManger->m_CcuColCmd.fcuPowerEfficiency = fuelCellPower;
|
||||
m_powerManger->m_CcuColCmd.insBatCmd = instrumentBattery;
|
||||
{
|
||||
std::lock_guard<std::mutex> lock(m_powerManger->m_stateMutex);
|
||||
m_powerManger->m_CcuColCmd.fcmode = fuelCellMode;
|
||||
m_powerManger->m_CcuColCmd.fcuCmd = fuelCellCommand;
|
||||
m_powerManger->m_CcuColCmd.fcuPowerEfficiency = fuelCellPower;
|
||||
m_powerManger->m_CcuColCmd.insBatCmd = instrumentBattery;
|
||||
m_powerManger->m_CcuColCmd.powerBatCmd = powerBattery;
|
||||
m_powerManger->m_CcuColCmd.powerBatEfficiency = powerBatteryPower;
|
||||
m_powerManger->m_CcuColCmd.masterState = hostStatus;
|
||||
m_powerManger->m_CcuColCmd.insChargeEnable = instrumentBatteryCharge;
|
||||
}
|
||||
cout << "powerBatteryPower:" << (int)instrumentBattery << endl;
|
||||
m_powerManger->m_CcuColCmd.powerBatCmd = powerBattery;
|
||||
m_powerManger->m_CcuColCmd.powerBatEfficiency = powerBatteryPower;
|
||||
m_powerManger->m_CcuColCmd.masterState = hostStatus;
|
||||
m_powerManger->m_CcuColCmd.insChargeEnable = instrumentBatteryCharge;
|
||||
cout << "m_powerManger->m_CcuColCmd.masterState:" << (int)m_powerManger->m_CcuColCmd.masterState << endl;
|
||||
cout << "m_powerManger->m_CcuColCmd.masterState:" << (int)hostStatus << endl;
|
||||
|
||||
mg_http_reply(c, 200, "Content-Type: application/json\r\n",
|
||||
"{\"success\": true, \"message\": \"电池配置提交成功\"}");
|
||||
@@ -353,6 +356,13 @@ void HttpServer::pushSystemData() {
|
||||
return;
|
||||
}
|
||||
|
||||
// 先持 m_stateMutex 快照 m_CcuColCmd(绝不与下方 m_dataMutex 同时持有,避免锁序死锁)
|
||||
ccuColCmd ccuCmd;
|
||||
if (m_powerManger) {
|
||||
std::lock_guard<std::mutex> stateLock(m_powerManger->m_stateMutex);
|
||||
ccuCmd = m_powerManger->m_CcuColCmd;
|
||||
}
|
||||
|
||||
std::lock_guard<std::mutex> dataLock(m_systemData->m_dataMutex);
|
||||
|
||||
// 序列化系统数据为JSON
|
||||
@@ -772,15 +782,15 @@ void HttpServer::pushSystemData() {
|
||||
j["debug"]["m_liBatStateMsg_st_debug"]["content"] = Json::Value(m_powerManger->m_upperCommManager->m_liBatStateMsg_st_debug.second);
|
||||
#endif
|
||||
|
||||
j["ccuColCmd"]["fcmode"] = Json::Value(m_powerManger->m_CcuColCmd.fcmode);
|
||||
j["ccuColCmd"]["fcuCmd"] = Json::Value(m_powerManger->m_CcuColCmd.fcuCmd);
|
||||
j["ccuColCmd"]["fcuPowerEfficiency"] = Json::Value(m_powerManger->m_CcuColCmd.fcuPowerEfficiency);
|
||||
j["ccuColCmd"]["insChargeEnable"] = Json::Value(m_powerManger->m_CcuColCmd.insChargeEnable);
|
||||
j["ccuColCmd"]["insBatCmd"] = Json::Value(m_powerManger->m_CcuColCmd.insBatCmd);
|
||||
j["ccuColCmd"]["powerBatCmd"] = Json::Value(m_powerManger->m_CcuColCmd.powerBatCmd);
|
||||
j["ccuColCmd"]["powerBatEfficiency"] = Json::Value(m_powerManger->m_CcuColCmd.powerBatEfficiency);
|
||||
j["ccuColCmd"]["heartbeat"] = Json::Value(m_powerManger->m_CcuColCmd.heartbeat);
|
||||
j["ccuColCmd"]["masterState"] = Json::Value(m_powerManger->m_CcuColCmd.masterState);
|
||||
j["ccuColCmd"]["fcmode"] = Json::Value(ccuCmd.fcmode);
|
||||
j["ccuColCmd"]["fcuCmd"] = Json::Value(ccuCmd.fcuCmd);
|
||||
j["ccuColCmd"]["fcuPowerEfficiency"] = Json::Value(ccuCmd.fcuPowerEfficiency);
|
||||
j["ccuColCmd"]["insChargeEnable"] = Json::Value(ccuCmd.insChargeEnable);
|
||||
j["ccuColCmd"]["insBatCmd"] = Json::Value(ccuCmd.insBatCmd);
|
||||
j["ccuColCmd"]["powerBatCmd"] = Json::Value(ccuCmd.powerBatCmd);
|
||||
j["ccuColCmd"]["powerBatEfficiency"] = Json::Value(ccuCmd.powerBatEfficiency);
|
||||
j["ccuColCmd"]["heartbeat"] = Json::Value(ccuCmd.heartbeat);
|
||||
j["ccuColCmd"]["masterState"] = Json::Value(ccuCmd.masterState);
|
||||
|
||||
// 时间戳
|
||||
j["timestamp"] = Json::Value((Json::UInt64)(std::chrono::duration_cast<std::chrono::milliseconds>(
|
||||
|
||||
@@ -37,6 +37,7 @@ public:
|
||||
* @return uint8_t 故障等级,00H-无故障, 10H-一级, 20H-二级, 30H-三级, 40H-四级
|
||||
*/
|
||||
uint8_t getFaultCodeLevel() const {
|
||||
std::lock_guard<std::mutex> lock(sysFaultCodesMutex);
|
||||
uint8_t maxLevel = 0;
|
||||
// 遍历 sysFaultCodes 集合中的每个故障码
|
||||
for (auto code : sysFaultCodes) {
|
||||
@@ -536,6 +537,7 @@ public:
|
||||
bool leakStatus[8] = {false};
|
||||
|
||||
unsigned char generateLeakageCode() {
|
||||
std::lock_guard<std::mutex> lock(m_dataMutex);
|
||||
unsigned char code = 0;
|
||||
if(leakStatus[LEAKAGE_BOW_EMERGENCY]) code |= 0x01;
|
||||
if(leakStatus[LEAKAGE_BOW_HIGH_VOLTAGE]) code |= 0x02;
|
||||
@@ -615,6 +617,65 @@ public:
|
||||
};
|
||||
~SystemData(){};
|
||||
|
||||
//============== 跨线程读访问器(锁内拷贝,避免与更新线程竞争)==============
|
||||
float getDynVoltageLink() const {
|
||||
std::lock_guard<std::mutex> lock(m_dataMutex);
|
||||
return dyn_voltage_link;
|
||||
}
|
||||
uint8_t getDynPosRelayStatus() const {
|
||||
std::lock_guard<std::mutex> lock(m_dataMutex);
|
||||
return dyn_pos_relay_status;
|
||||
}
|
||||
uint8_t getDynNegRelayStatus() const {
|
||||
std::lock_guard<std::mutex> lock(m_dataMutex);
|
||||
return dyn_neg_relay_status;
|
||||
}
|
||||
uint8_t getDynEmergencyStatus() const {
|
||||
std::lock_guard<std::mutex> lock(m_dataMutex);
|
||||
return dyn_emergency_status;
|
||||
}
|
||||
DcdcStatus getDcdcStatus() const {
|
||||
std::lock_guard<std::mutex> lock(m_dataMutex);
|
||||
return m_dcdcStatus;
|
||||
}
|
||||
decltype(power_bus_status) getPowerBusStatus() const {
|
||||
std::lock_guard<std::mutex> lock(m_dataMutex);
|
||||
return power_bus_status;
|
||||
}
|
||||
decltype(power_a_bus_status) getPowerABusStatus() const {
|
||||
std::lock_guard<std::mutex> lock(m_dataMutex);
|
||||
return power_a_bus_status;
|
||||
}
|
||||
decltype(instrument_main_bus_status) getInstrumentMainBusStatus() const {
|
||||
std::lock_guard<std::mutex> lock(m_dataMutex);
|
||||
return instrument_main_bus_status;
|
||||
}
|
||||
decltype(instrument_bus_status) getInstrumentBusStatus() const {
|
||||
std::lock_guard<std::mutex> lock(m_dataMutex);
|
||||
return instrument_bus_status;
|
||||
}
|
||||
DeviceCommonStatus getDeviceCommonStatus() const {
|
||||
std::lock_guard<std::mutex> lock(m_dataMutex);
|
||||
return device_common_status;
|
||||
}
|
||||
// 配电故障码集合(std::set 非原子,必须加锁访问)
|
||||
bool hasDisSysFaultCode(unsigned int code) const {
|
||||
std::lock_guard<std::mutex> lock(faultCodeMutex);
|
||||
return disSysFaultCode.find(code) != disSysFaultCode.end();
|
||||
}
|
||||
void insertDisSysFaultCode(unsigned int code) {
|
||||
std::lock_guard<std::mutex> lock(faultCodeMutex);
|
||||
disSysFaultCode.insert(code);
|
||||
}
|
||||
void clearDisSysFaultCodes() {
|
||||
std::lock_guard<std::mutex> lock(faultCodeMutex);
|
||||
disSysFaultCode.clear();
|
||||
}
|
||||
std::set<unsigned int> getDisSysFaultCodes() const {
|
||||
std::lock_guard<std::mutex> lock(faultCodeMutex);
|
||||
return disSysFaultCode;
|
||||
}
|
||||
|
||||
void updateCommonStatus(double time_out=30){
|
||||
std::lock_guard<std::mutex> lock(m_dataMutex);
|
||||
//更新时间
|
||||
@@ -754,10 +815,9 @@ public:
|
||||
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];
|
||||
}
|
||||
//保留字段:ccuState 中 reserved2 仅声明 1 字节(协议预留 2 字节),只拷贝已有元素,避免越界读
|
||||
reserved2[0] = data.reserved2[0];
|
||||
reserved2[1] = 0;
|
||||
|
||||
//SOC门限值
|
||||
ins_soc_threshold1 = data.ins_soc_threshold1;
|
||||
|
||||
@@ -470,17 +470,13 @@ bool udpComm::sendDisSysCmd(const disHighVolBusCmd cmd)
|
||||
msgBuf = reinterpret_cast<unsigned char *>(msg);
|
||||
cc = calculateChecksum(msgBuf,sizeof(msg_disHVBCmd),sizeof(cChecksum));
|
||||
msg->checkCode = cc;
|
||||
try
|
||||
{
|
||||
sendMsg(msgBuf,sizeof(msg_disHVBCmd));
|
||||
}
|
||||
catch(const std::exception& e)
|
||||
{
|
||||
std::cerr << e.what() << '\n';
|
||||
bool sendResult = sendMsg(msgBuf, sizeof(msg_disHVBCmd));
|
||||
if (!sendResult) {
|
||||
LOG_F(ERROR, "sendDisSysCmd(disHighVolBusCmd) send failed");
|
||||
}
|
||||
if (m_commLogger) m_commLogger->onFrame(1, DIS_HVBUS_CMD_ID, "disHighVolBusCmd", msgBuf, sizeof(msg_disHVBCmd), true);
|
||||
delete msg;
|
||||
return true;
|
||||
return sendResult;
|
||||
}
|
||||
|
||||
bool udpComm::sendDisSysCmd(const disHighAVolBusCmd cmd)
|
||||
@@ -498,17 +494,13 @@ bool udpComm::sendDisSysCmd(const disHighAVolBusCmd cmd)
|
||||
msgBuf = reinterpret_cast<unsigned char *>(msg);
|
||||
cc = calculateChecksum(msgBuf,sizeof(msg_disHVBACmd),sizeof(cChecksum));
|
||||
msg->checkCode = cc;
|
||||
try
|
||||
{
|
||||
sendMsg(msgBuf,sizeof(msg_disHVBACmd));
|
||||
}
|
||||
catch(const std::exception& e)
|
||||
{
|
||||
std::cerr << e.what() << '\n';
|
||||
bool sendResult = sendMsg(msgBuf, sizeof(msg_disHVBACmd));
|
||||
if (!sendResult) {
|
||||
LOG_F(ERROR, "sendDisSysCmd(disHighAVolBusCmd) send failed");
|
||||
}
|
||||
if (m_commLogger) m_commLogger->onFrame(1, DIS_HVBUSA_CMD_ID, "disHighAVolBusCmd", msgBuf, sizeof(msg_disHVBACmd), true);
|
||||
delete msg;
|
||||
return true;
|
||||
return sendResult;
|
||||
}
|
||||
|
||||
bool udpComm::sendDisSysCmd(const disHighBVolBusCmd cmd)
|
||||
@@ -526,18 +518,13 @@ bool udpComm::sendDisSysCmd(const disHighBVolBusCmd cmd)
|
||||
msgBuf = reinterpret_cast<unsigned char *>(msg);
|
||||
cc = calculateChecksum(msgBuf,sizeof(msg_disHVBBCmd),sizeof(cChecksum));
|
||||
msg->checkCode = cc;
|
||||
try
|
||||
{
|
||||
// cout << "=========" <<(int)sizeof(msg_disHVBBCmd) << endl;
|
||||
sendMsg(msgBuf,sizeof(msg_disHVBBCmd));
|
||||
}
|
||||
catch(const std::exception& e)
|
||||
{
|
||||
std::cerr << e.what() << '\n';
|
||||
bool sendResult = sendMsg(msgBuf, sizeof(msg_disHVBBCmd));
|
||||
if (!sendResult) {
|
||||
LOG_F(ERROR, "sendDisSysCmd(disHighBVolBusCmd) send failed");
|
||||
}
|
||||
if (m_commLogger) m_commLogger->onFrame(1, DIS_HVBUSB_CMD_ID, "disLowMainBusCmd", msgBuf, sizeof(msg_disHVBBCmd), true);
|
||||
delete msg;
|
||||
return true;
|
||||
return sendResult;
|
||||
}
|
||||
|
||||
bool udpComm::sendDisSysCmd(const disLowBusCmd cmd)
|
||||
@@ -556,18 +543,13 @@ bool udpComm::sendDisSysCmd(const disLowBusCmd cmd)
|
||||
cc = calculateChecksum(msgBuf,sizeof(msg_disLVBCmd),sizeof(cChecksum));
|
||||
// msg->checkCode = static_cast<cChecksum>(cc & 0xFF);
|
||||
msg->checkCode = cc;
|
||||
cout << "cc======disLowBusCmd=============================" << (int) msg->checkCode << endl;
|
||||
try
|
||||
{
|
||||
sendMsg(msgBuf,sizeof(msg_disLVBCmd));
|
||||
}
|
||||
catch(const std::exception& e)
|
||||
{
|
||||
std::cerr << e.what() << '\n';
|
||||
bool sendResult = sendMsg(msgBuf, sizeof(msg_disLVBCmd));
|
||||
if (!sendResult) {
|
||||
LOG_F(ERROR, "sendDisSysCmd(disLowBusCmd) send failed");
|
||||
}
|
||||
if (m_commLogger) m_commLogger->onFrame(1, DIS_LVBUS_CMD_ID, "disLowBusCmd", msgBuf, sizeof(msg_disLVBCmd), true);
|
||||
delete msg;
|
||||
return true;
|
||||
return sendResult;
|
||||
}
|
||||
|
||||
bool udpComm::sendCcuColCmd(const ccuColCmd cmd)
|
||||
|
||||
@@ -137,6 +137,7 @@ public:
|
||||
// std::string buildMsg(SystemData data,disSysBreakerList currentDisBreakerState)
|
||||
std::string buildMsg(const SystemData& data,disSysBreakerList currentDisBreakerState)
|
||||
{
|
||||
std::lock_guard<std::mutex> lock(data.m_dataMutex);
|
||||
//构建配电系统状态报告
|
||||
Json::Value dis;
|
||||
// disBus1Breaker dis1 = currentDisBreakerState.bus1Breaker;
|
||||
|
||||
@@ -27,6 +27,7 @@ public:
|
||||
// std::string buildMsg(SystemData data)
|
||||
std::string buildMsg(const SystemData& data)
|
||||
{
|
||||
std::lock_guard<std::mutex> lock(data.m_dataMutex);
|
||||
//TODO:根据最新协议修改
|
||||
Json::Value fcs;
|
||||
// suffix = getTypeName(typeid(ccustate.fcuState).name());
|
||||
|
||||
@@ -18,6 +18,7 @@ public:
|
||||
// std::string buildMsg(SystemData data)
|
||||
std::string buildMsg(const SystemData& data)
|
||||
{
|
||||
std::lock_guard<std::mutex> lock(data.m_dataMutex);
|
||||
//TODO:根据最新协议修改
|
||||
Json::Value lbs;
|
||||
//构建锂电池状态报告
|
||||
|
||||
Reference in New Issue
Block a user