完善了次级配电的功能

This commit is contained in:
zjk
2025-07-04 09:53:56 +08:00
parent ba8cd0383a
commit 4116397f3e
10 changed files with 538 additions and 1783 deletions
+3 -1
View File
@@ -165,7 +165,9 @@ void UpperCommManager::processPeriodicTasks() {
m_pm->sendNotification(m_equStateMsg.key, strJson); m_pm->sendNotification(m_equStateMsg.key, strJson);
//发送次级配电指令 修改后的代码 //发送次级配电指令 修改后的代码
// strJson = getSubDisCmd(m_pm->m_subDisSysCmd); // strJson = getSubDisCmd(m_pm->m_subDisSysCmd);
strJson = m_secdistStateMsg.buildMsg(m_pm->m_subDisSysCmd); // TODO : 修改指令逻辑,当状态一致时发送保持指令
// strJson = m_secdistStateMsg.buildMsg(m_pm->m_subDisSysCmd);
strJson = m_secdistStateMsg.buildMsg(m_pm->m_subDisSysCmd,m_pm->m_subDisSysState,2);
m_pm->sendNotification(m_secdistStateMsg.key_cmd, strJson); m_pm->sendNotification(m_secdistStateMsg.key_cmd, strJson);
//发送仪表电状态 //发送仪表电状态
m_pm->sendNotification(m_equInsStateMsg.key,m_equInsStateMsg.buildMsg(m_pm->m_subDisSysState)); m_pm->sendNotification(m_equInsStateMsg.key,m_equInsStateMsg.buildMsg(m_pm->m_subDisSysState));
+1 -1
View File
@@ -36,7 +36,7 @@ using namespace std;
//决策消息 //决策消息
#define DB_TO_PM_DEEPTH "uDevice_depth_st" #define DB_TO_PM_DEEPTH "uDevice_depth_st"
#define DB_TO_PM_MISSION "uPlan_taskStart_cmd" // #define DB_TO_PM_MISSION "uPlan_taskStart_cmd"
#define DB_TO_PM_TASKSTOP "uPlan_planStop_cmd" #define DB_TO_PM_TASKSTOP "uPlan_planStop_cmd"
//外部通信消息 //外部通信消息
File diff suppressed because it is too large Load Diff
+37 -12
View File
@@ -162,8 +162,7 @@ public:
//锂电池故障字段 //锂电池故障字段
unsigned char powfaultCode; unsigned char powfaultCode;
unsigned char insfaultCode; unsigned char insfaultCode;
//配电系统故障码
std::set<unsigned int> disSysFaultCode;
// MOOSD 状态 // MOOSD 状态
bool moosd_status; bool moosd_status;
@@ -477,6 +476,7 @@ public:
SystemData(){ SystemData(){
//初始化变量全部为0 //初始化变量全部为0
memset(this, 0, sizeof(SystemData)); memset(this, 0, sizeof(SystemData));
disSysFaultCode.clear();
}; };
~SystemData(){}; ~SystemData(){};
@@ -656,16 +656,19 @@ public:
//心跳计数器 //心跳计数器
heartbeat = data.heartbeat; heartbeat = data.heartbeat;
} }
// std::mutex faultCodeMutex; // 添加互斥锁 std::set<unsigned int> disSysFaultCode;
mutable std::mutex faultCodeMutex;
void updateBreakerFault(unsigned char& breakerStatus, unsigned char rawStatus, unsigned int faultCode) void updateBreakerFault(unsigned char& breakerStatus, unsigned char rawStatus, unsigned int faultCode)
{ {
// std::lock_guard<std::mutex> lock(faultCodeMutex); std::lock_guard<std::mutex> lock(faultCodeMutex);
breakerStatus = rawStatus == 0x55 ? 1 : (rawStatus == 0xAA ? 0 : 2); unsigned char newStatus = rawStatus == 0x55 ? 1 : (rawStatus == 0xAA ? 0 : 2);
// if(breakerStatus == 2) { breakerStatus = newStatus; // 保证状态更新也是原子的
// disSysFaultCode.insert(faultCode);
// } else { if(newStatus == 2) {
// disSysFaultCode.erase(faultCode); disSysFaultCode.insert(faultCode);
// } } else {
disSysFaultCode.erase(faultCode);
}
} }
void updateSystemData(disHighVolBusState data){ void updateSystemData(disHighVolBusState data){
updateBreakerFault(power_bus_status.fuelCellCircuitBreaker, data.fuelCellCircuitBreaker, 1); updateBreakerFault(power_bus_status.fuelCellCircuitBreaker, data.fuelCellCircuitBreaker, 1);
@@ -699,7 +702,15 @@ public:
// if(power_bus_status.meterPowerLossSignal == 1) disSysFaultCode.insert(36); else disSysFaultCode.erase(36); // if(power_bus_status.meterPowerLossSignal == 1) disSysFaultCode.insert(36); else disSysFaultCode.erase(36);
power_bus_status.emergencyPowerLossSignal = data.emergencyPowerLossSignal == 0x55 ? 0 : 1; power_bus_status.emergencyPowerLossSignal = data.emergencyPowerLossSignal == 0x55 ? 0 : 1;
// if(power_bus_status.emergencyPowerLossSignal == 1) disSysFaultCode.insert(37); else disSysFaultCode.erase(37); // if(power_bus_status.emergencyPowerLossSignal == 1) disSysFaultCode.insert(37); else disSysFaultCode.erase(37);
{
std::lock_guard<std::mutex> lock(faultCodeMutex);
if(power_bus_status.emergencyPowerLossSignal == 1) disSysFaultCode.insert(37); else disSysFaultCode.erase(37);
if(power_bus_status.meterPowerLossSignal == 1) disSysFaultCode.insert(36); else disSysFaultCode.erase(36);
if(power_bus_status.aBusInsulationStatus == 1) disSysFaultCode.insert(35); else disSysFaultCode.erase(35);
if(power_bus_status.powerBusInsulationStatus == 1) disSysFaultCode.insert(34); else disSysFaultCode.erase(34);
}
//温度 //温度
power_bus_status.dcDcTemperature = data.dcDcTemperature-40; power_bus_status.dcDcTemperature = data.dcDcTemperature-40;
@@ -740,6 +751,11 @@ public:
power_a_bus_status.emergencyPowerFailureSignal = data.emergencyPowerFailureSignal == 0x55 ? 0 : 1; power_a_bus_status.emergencyPowerFailureSignal = data.emergencyPowerFailureSignal == 0x55 ? 0 : 1;
// if(power_a_bus_status.emergencyPowerFailureSignal == 1) disSysFaultCode.insert(39); else disSysFaultCode.erase(39); // if(power_a_bus_status.emergencyPowerFailureSignal == 1) disSysFaultCode.insert(39); else disSysFaultCode.erase(39);
{
std::lock_guard<std::mutex> lock(faultCodeMutex);
if(power_a_bus_status.emergencyPowerFailureSignal == 1) disSysFaultCode.insert(39); else disSysFaultCode.erase(39);
if(power_a_bus_status.instrumentPowerFailureSignal == 1) disSysFaultCode.insert(38); else disSysFaultCode.erase(38);
}
//浸水报警 //浸水报警
power_a_bus_status.waterIngressionAlarm = data.waterIngressionAlarm; power_a_bus_status.waterIngressionAlarm = data.waterIngressionAlarm;
@@ -775,6 +791,12 @@ public:
//绝缘状态 //绝缘状态
instrument_main_bus_status.instrumentBusbarInsulationLow = data.instrumentBusbarInsulationLow == 0x55 ? 0 : 1; instrument_main_bus_status.instrumentBusbarInsulationLow = data.instrumentBusbarInsulationLow == 0x55 ? 0 : 1;
// if(instrument_main_bus_status.instrumentBusbarInsulationLow == 1) disSysFaultCode.insert(42); else disSysFaultCode.erase(43); // if(instrument_main_bus_status.instrumentBusbarInsulationLow == 1) disSysFaultCode.insert(42); else disSysFaultCode.erase(43);
{
std::lock_guard<std::mutex> lock(faultCodeMutex);
if(instrument_main_bus_status.instrumentBusbarInsulationLow == 1) disSysFaultCode.insert(42); else disSysFaultCode.erase(43);
if(instrument_main_bus_status.emergencyPowerFailureSignal == 1) disSysFaultCode.insert(41); else disSysFaultCode.erase(42);
if(instrument_main_bus_status.instrumentPowerFailureSignal == 1) disSysFaultCode.insert(40); else disSysFaultCode.erase(41);
}
//电压电流参数 //电压电流参数
instrument_main_bus_status.instrumentBusbarVoltage = data.instrumentBusbarVoltage * 0.1; instrument_main_bus_status.instrumentBusbarVoltage = data.instrumentBusbarVoltage * 0.1;
@@ -807,6 +829,11 @@ public:
instrument_bus_status.emergencyPowerFailureSignal = data.emergencyPowerFailureSignal == 0x55 ? 0 : 1; instrument_bus_status.emergencyPowerFailureSignal = data.emergencyPowerFailureSignal == 0x55 ? 0 : 1;
// if(instrument_bus_status.emergencyPowerFailureSignal == 1) disSysFaultCode.insert(45); else disSysFaultCode.erase(45); // if(instrument_bus_status.emergencyPowerFailureSignal == 1) disSysFaultCode.insert(45); else disSysFaultCode.erase(45);
{
std::lock_guard<std::mutex> lock(faultCodeMutex);
if(instrument_bus_status.emergencyPowerFailureSignal == 1) disSysFaultCode.insert(45); else disSysFaultCode.erase(45);
if(instrument_bus_status.powerFailureSignal == 1) disSysFaultCode.insert(44); else disSysFaultCode.erase(44);
}
//浸水报警 //浸水报警
instrument_bus_status.waterIngressionAlarm = data.waterIngressionAlarm; instrument_bus_status.waterIngressionAlarm = data.waterIngressionAlarm;
@@ -823,6 +850,4 @@ public:
instrument_bus_status.emergency1BusbarVoltage = data.emergency1BusbarVoltage * 0.1; instrument_bus_status.emergency1BusbarVoltage = data.emergency1BusbarVoltage * 0.1;
} }
}; };
#endif #endif
+44 -3
View File
@@ -4,6 +4,7 @@
#include <json/json.h> #include <json/json.h>
#include "../driver.h" #include "../driver.h"
#include "../logc/loguru.hpp" #include "../logc/loguru.hpp"
#include <cstring>
class uDevice_secdistStateMsg class uDevice_secdistStateMsg
{ {
@@ -329,7 +330,7 @@ public:
state.bowThrow = driver.bowThrow; state.bowThrow = driver.bowThrow;
state.depth2 = driver.depth2; state.depth2 = driver.depth2;
state.thruster = driver.thruster; state.thruster = driver.thruster;
state.haulingMachine = 0; // No corresponding field in DriverTable state.haulingMachine = 2; // No corresponding field in DriverTable
state.buoyancyAdjust4 = driver.buoyancyAdjust4; state.buoyancyAdjust4 = driver.buoyancyAdjust4;
state.buoyancyAdjust5 = driver.buoyancyAdjust5; state.buoyancyAdjust5 = driver.buoyancyAdjust5;
state.sternRudderServo1 = driver.sternRudderServo1; state.sternRudderServo1 = driver.sternRudderServo1;
@@ -337,7 +338,7 @@ public:
state.sternRudderServo3 = driver.sternRudderServo3; state.sternRudderServo3 = driver.sternRudderServo3;
state.sternRudderServo4 = driver.sternRudderServo4; state.sternRudderServo4 = driver.sternRudderServo4;
state.ctd2 = driver.ctd2; state.ctd2 = driver.ctd2;
state.commDevStern = 0; // No corresponding field in DriverTable state.commDevStern = 2; // No corresponding field in DriverTable
state.inOutLetWater3 = driver.inputWaterSensor3; state.inOutLetWater3 = driver.inputWaterSensor3;
// UNIT5 // UNIT5
@@ -350,7 +351,7 @@ public:
// driver.overDeep1 // driver.overDeep1
// driver.overDeep2 // driver.overDeep2
// driver.ntp // driver.ntp
state.dragSonar = 0; // Assuming dragSonar is same as lowFreqSonar state.dragSonar = 2; // Assuming dragSonar is same as lowFreqSonar
return true; return true;
@@ -449,6 +450,46 @@ public:
converToDriverTable(s,driver); converToDriverTable(s,driver);
return true; return true;
}; };
std::string buildMsg(DriverTable driver, DriverTable driver_state){
DeviceSecdistState s;
DriverTable driverCopy = driver;
for (size_t i = 0; i < sizeof(DriverTable); ++i) {
unsigned char* driverCopyPtr = reinterpret_cast<unsigned char*>(&driverCopy) + i;
unsigned char* statePtr = reinterpret_cast<unsigned char*>(&driver_state) + i;
if (*driverCopyPtr == *statePtr) {
*driverCopyPtr = 2;
}
}
converFromDriverTable(s, driverCopy);
// std::cout << (int)s.depth1 << std::endl;
// std::cout << buildSecdistStateToJson(s) << std::endl;
return buildSecdistStateToJson(s);
};
std::string buildMsg(DriverTable driver, DriverTable driver_state, unsigned int nCheck){
static size_t callCount = 0; // 静态变量,记录函数调用次数
DeviceSecdistState s;
DriverTable driverCopy = driver;
if (nCheck > 0 && callCount % nCheck == 0)
{
for (size_t i = 0; i < sizeof(DriverTable); ++i) {
unsigned char* driverCopyPtr = reinterpret_cast<unsigned char*>(&driverCopy) + i;
unsigned char* statePtr = reinterpret_cast<unsigned char*>(&driver_state) + i;
if (*driverCopyPtr == *statePtr) {
*driverCopyPtr = 2;
}
}
}
else {
memset(&driverCopy, 2, sizeof(DriverTable));
}
callCount ++;
converFromDriverTable(s, driverCopy);
// std::cout << (int)s.depth1 << std::endl;
// std::cout << buildSecdistStateToJson(s) << std::endl;
return buildSecdistStateToJson(s);
};
}; };
+2 -2
View File
@@ -4,14 +4,14 @@
#include "../pmSysvariable.h" #include "../pmSysvariable.h"
#include "../logc/loguru.hpp" #include "../logc/loguru.hpp"
//决策消息 //决策消息
#define DB_TO_PM_MISSION "uPlan_taskStart_cmd" #define DB_TO_PM_MISSION "uPlan_taskStart_st"
class uPlan_taskStartMsg class uPlan_taskStartMsg
{ {
private: private:
/* data */ /* data */
public: public:
std::string key = "uPlan_taskStart_cmd"; std::string key = "uPlan_taskStart_st";
uPlan_taskStartMsg(/* args */){}; uPlan_taskStartMsg(/* args */){};
~uPlan_taskStartMsg(){}; ~uPlan_taskStartMsg(){};
+9 -5
View File
@@ -133,8 +133,9 @@ public:
} }
} }
}m_state_of_bus_lv_a; }m_state_of_bus_lv_a;
std::string buildMsg(SystemData data,disSysBreakerList currentDisBreakerState) // std::string buildMsg(SystemData data,disSysBreakerList currentDisBreakerState)
std::string buildMsg(const SystemData& data,disSysBreakerList currentDisBreakerState)
{ {
//构建配电系统状态报告 //构建配电系统状态报告
Json::Value dis; Json::Value dis;
@@ -182,11 +183,14 @@ public:
m_state_of_bus_lv_a.set_emergency_lithium_battery_group_1_breaker((data.instrument_bus_status.emergencyLithiumBatteryGroup1CircuitBreaker == 1)); m_state_of_bus_lv_a.set_emergency_lithium_battery_group_1_breaker((data.instrument_bus_status.emergencyLithiumBatteryGroup1CircuitBreaker == 1));
dis["LVolBusBreaker_uint16"] = m_state_of_bus_lv.relay_states.to_ulong(); dis["LVolBusBreaker_uint16"] = m_state_of_bus_lv.relay_states.to_ulong();
//TODO: 构建配电系统故障码 //构建配电系统故障码
Json::Value faultCodeDis_array = Json::Value(Json::arrayValue); Json::Value faultCodeDis_array = Json::Value(Json::arrayValue);
for(auto val : data.disSysFaultCode)
{ {
faultCodeDis_array.append(val); std::lock_guard<std::mutex> lock(data.faultCodeMutex);
for(auto val : data.disSysFaultCode)
{
faultCodeDis_array.append(val);
}
} }
dis["faultCode_array"] = faultCodeDis_array; dis["faultCode_array"] = faultCodeDis_array;
+2 -1
View File
@@ -24,7 +24,8 @@ public:
unsigned int errorCode : 8; // 错误代码 unsigned int errorCode : 8; // 错误代码
} state; } state;
std::string buildMsg(SystemData data) // std::string buildMsg(SystemData data)
std::string buildMsg(const SystemData& data)
{ {
//TODO:根据最新协议修改 //TODO:根据最新协议修改
Json::Value fcs; Json::Value fcs;
+2 -2
View File
@@ -15,8 +15,8 @@ public:
~uPower_liBatStateMsg() {}; ~uPower_liBatStateMsg() {};
std::string key = "uPower_liBatState_st"; std::string key = "uPower_liBatState_st";
// std::string buildMsg(SystemData data)
std::string buildMsg(SystemData data) std::string buildMsg(const SystemData& data)
{ {
//TODO:根据最新协议修改 //TODO:根据最新协议修改
Json::Value lbs; Json::Value lbs;
+2
View File
@@ -56,6 +56,8 @@ class PowerManagerApp:
# 上位机端口 # 上位机端口
self.udp_control_port = 5001 self.udp_control_port = 5001
self.udp_control_host = "192.168.0.223" self.udp_control_host = "192.168.0.223"
# self.udp_control_host = "127.0.0.1"
# 下位机端口 # 下位机端口
# self.udp_ip = "127.0.0.1" # self.udp_ip = "127.0.0.1"
self.udp_ip = "192.168.0.140" self.udp_ip = "192.168.0.140"