Files
H100PowerManger/src/pCCU/core/SystemData.h
T
zjk 0639b5904d pCCU 新增真实CCU配电桥接(rcu链路原帧透传+网页显示)并适配板卡端口拓扑
- protocol/DisProtocol: 配电协议8条消息(指令0x0001~4/反馈0x0005~8, Sum8),复用pmSysvariable结构体+static_assert核对
- ChecksumPolicy 新增 Sum8;Frame 支持 1 字节校验和
- MessageRegistry 支持 (id+帧总长) 二维查找:配电指令与PM操控指令共用id按帧长区分(帧头length字段不可信)
- LinkManager: 按实际帧长分发 + sendRaw原帧透传 + 非本协议帧头落库节流告警;UdpEndpoint sendTo 加锁
- comm/RcuLinkManager: 真实CCU链路;core/DisBridge: 配电桥接器(反馈转pPowerManger+解码显示,指令转真实CCU,0x0004仅显示不转发)
- 网页新增"真实CCU"页签全字段展示;SnapshotBuilder realCcu 节 + rcu 链路描述
- h100.moos: 端口腾挪(真实CCU固定上报5001归pCCU,pPowerManger iport=5002),rcu_remote=192.168.0.140:7000
- 测试: pccuTest 新增配电/Sum8/长度分发/RCU注册表用例(176项);集成测试新增桥接字节一致+不误转发用例
2026-09-01 15:06:11 +08:00

212 lines
7.5 KiB
C++

#ifndef PCCU_SYSTEM_DATA_H
#define PCCU_SYSTEM_DATA_H
#include <mutex>
#include <atomic>
#include "../protocol/FcProtocol.h"
#include "../protocol/PmProtocol.h"
#include "../protocol/CanBms.h"
#include "../protocol/DisProtocol.h"
namespace ccu {
//============================================================================
// RealCcuState:真实 CCU 设备的桥接数据缓存(配电协议)。
//
// 数据来源:RCU 链路(真实CCU -> pCCU),由 DisBridge 在转发的同时
// 解码写入;网页快照读取展示。各 lastRx 时间由写入方更新(MOOSTime),
// 供在线判定与新鲜度展示。
//============================================================================
struct RealCcuState {
// 四条配电母线最新反馈(valid 表示收到过对应反馈帧)
disHighVolBusState hvBus{}; bool hvValid = false;
disHighAVolBusState hvaBus{}; bool hvaValid = false;
disLowMainBusState hvbBus{}; bool hvbValid = false;
disLowBusState lvBus{}; bool lvValid = false;
double hvLastRx = 0, hvaLastRx = 0, hvbLastRx = 0, lvLastRx = 0;
// 最近收到的配电指令(pPowerManger 下发、已转发真实CCU,用于展示)
disHighVolBusCmd lastHvCmd{};
disHighAVolBusCmd lastHvaCmd{};
disLowMainBusCmd lastHvbCmd{};
disLowBusCmd lastLvCmd{};
bool cmdValid = false;
double lastCmdRx = 0;
// 真实CCU 状态报文 0x0004(仅解码显示,不转发)
PmStatusValue ccuStatus{};
bool ccuStatusValid = false;
double ccuStatusLastRx = 0;
// 桥接统计
unsigned long fbCount = 0; // 收到配电反馈帧数
unsigned long fwdFbOk = 0; // 反馈转发 pPowerManger 成功帧数
unsigned long fwdFbErr = 0; // 反馈转发失败帧数
unsigned long cmdCount = 0; // 收到配电指令帧数
unsigned long fwdCmdOk = 0; // 指令转发真实CCU 成功帧数
unsigned long fwdCmdErr = 0; // 指令转发失败帧数
};
//============================================================================
// SystemData:跨线程共享的最新状态快照。
//
// - 接收线程(FC 链路)写 FcStatus 快照
// - MOOS 主线程(OnNewMail)写 BCU 节点快照(CAN 经 pCanBridge 透传)
// - CCU 主循环(Iterate)读快照并整合编码为 PM 状态报文发送
// - 网页线程读快照展示
// 通过互斥锁保护读写。
//============================================================================
class SystemData {
public:
// 更新/获取燃料电池最新状态
void updateFcStatus(const FcStatusValue& v) {
std::lock_guard<std::mutex> lock(m_mutex);
m_fcStatus = v;
m_fcStatusCount++;
}
FcStatusValue fcStatus() const {
std::lock_guard<std::mutex> lock(m_mutex);
return m_fcStatus;
}
unsigned long fcStatusCount() const {
std::lock_guard<std::mutex> lock(m_mutex);
return m_fcStatusCount;
}
// 更新/获取最新 PM 操控指令(用于转发到 FC)
void updatePmControl(const PmControlValue& v) {
std::lock_guard<std::mutex> lock(m_mutex);
m_pmControl = v;
m_pmControlCount++;
}
PmControlValue pmControl() const {
std::lock_guard<std::mutex> lock(m_mutex);
return m_pmControl;
}
unsigned long pmControlCount() const {
std::lock_guard<std::mutex> lock(m_mutex);
return m_pmControlCount;
}
// 更新/获取最新 PM 参数设定(预留,用于未来转发/应用)
void updatePmParamSet(const PmParamSetValue& v) {
std::lock_guard<std::mutex> lock(m_mutex);
m_pmParamSet = v;
}
PmParamSetValue pmParamSet() const {
std::lock_guard<std::mutex> lock(m_mutex);
return m_pmParamSet;
}
// 更新/获取最新转发给 FC 的控制指令
void updateFcControl(const FcControlValue& v) {
std::lock_guard<std::mutex> lock(m_mutex);
m_fcControl = v;
m_fcControlCount++;
}
FcControlValue fcControl() const {
std::lock_guard<std::mutex> lock(m_mutex);
return m_fcControl;
}
unsigned long fcControlCount() const {
std::lock_guard<std::mutex> lock(m_mutex);
return m_fcControlCount;
}
// 更新/获取最新发送给 PM 的状态报文(整合后的)
void updatePmStatus(const PmStatusValue& v) {
std::lock_guard<std::mutex> lock(m_mutex);
m_pmStatus = v;
m_pmStatusCount++;
}
PmStatusValue pmStatus() const {
std::lock_guard<std::mutex> lock(m_mutex);
return m_pmStatus;
}
unsigned long pmStatusCount() const {
std::lock_guard<std::mutex> lock(m_mutex);
return m_pmStatusCount;
}
// 更新/获取最新发送给 PM 的参数反馈
void updatePmParamFb(const PmParamSetFbValue& v) {
std::lock_guard<std::mutex> lock(m_mutex);
m_pmParamFb = v;
}
PmParamSetFbValue pmParamFb() const {
std::lock_guard<std::mutex> lock(m_mutex);
return m_pmParamFb;
}
//-------- 锂电池 BCU 节点(CAN 总线,经 pCanBridge 透传) --------
// 更新单个 BCU 节点状态(每帧部分更新,由调用方先取出快照再合并)
void updateBcuNode(uint8_t addr, const BcuNodeStatus& v) {
std::lock_guard<std::mutex> lock(m_mutex);
if (addr >= kBcuAddrMin && addr <= kBcuAddrMax) {
m_bcuNodes[addr - kBcuAddrMin] = v;
m_bmsStatusCount++;
}
}
// 读取单个 BCU 节点快照(地址非法返回 valid=false 的空快照)
BcuNodeStatus bcuNode(uint8_t addr) const {
std::lock_guard<std::mutex> lock(m_mutex);
if (addr >= kBcuAddrMin && addr <= kBcuAddrMax)
return m_bcuNodes[addr - kBcuAddrMin];
return BcuNodeStatus();
}
// 读取全部节点快照(数组下标 = 地址-1)
void bcuNodes(BcuNodeStatus out[kBcuNodeCount]) const {
std::lock_guard<std::mutex> lock(m_mutex);
for (int i = 0; i < kBcuNodeCount; ++i) out[i] = m_bcuNodes[i];
}
unsigned long bmsStatusCount() const {
std::lock_guard<std::mutex> lock(m_mutex);
return m_bmsStatusCount;
}
// CAN 链路收帧计数(含非 BMS 报文,用于链路状态展示)
void incCanFrameCount() {
std::lock_guard<std::mutex> lock(m_mutex);
m_canFrameCount++;
}
unsigned long canFrameCount() const {
std::lock_guard<std::mutex> lock(m_mutex);
return m_canFrameCount;
}
//-------- 真实 CCU 桥接数据(配电协议,RCU 链路) --------
// 整体更新真实CCU 快照(DisBridge 在接收线程先取副本->修改->写回)
void updateRealCcu(const RealCcuState& v) {
std::lock_guard<std::mutex> lock(m_mutex);
m_realCcu = v;
}
RealCcuState realCcu() const {
std::lock_guard<std::mutex> lock(m_mutex);
return m_realCcu;
}
private:
mutable std::mutex m_mutex;
FcStatusValue m_fcStatus;
PmControlValue m_pmControl;
PmParamSetValue m_pmParamSet;
FcControlValue m_fcControl;
PmStatusValue m_pmStatus;
PmParamSetFbValue m_pmParamFb;
BcuNodeStatus m_bcuNodes[kBcuNodeCount]; // 下标 = 节点地址-1
RealCcuState m_realCcu;
unsigned long m_fcStatusCount = 0;
unsigned long m_pmControlCount = 0;
unsigned long m_fcControlCount = 0;
unsigned long m_pmStatusCount = 0;
unsigned long m_bmsStatusCount = 0;
unsigned long m_canFrameCount = 0;
};
} // namespace ccu
#endif // PCCU_SYSTEM_DATA_H