锂电池改用 BCU-MBMS CAN 协议按节点解析 + bcu_node 解析数据落库 + 板卡对时脚本
- pCCU/CanBms:按《04KT38电池BCU-MBMS通信(CAN)定义》重写解码, BmsStatus 单状态模型改为 BcuNodeStatus 多节点模型(0x10XX00YY, 节点地址 01~36h),支持 0x0000 电压/电流/SOC/告警码、0x0001 单体 电压、0x0002 单体温度、0x0003 继电器、0x0006 绝缘/端口电压、 0x0010 告警位(附录1 中文码表)六类报文 - 平均单体温度偏移修正:协议文档 BYTE5 写"偏移0"有误,实测固件与 最高/最低一致均带 -40℃ 偏移(实车 0x10020002 原始 68/69 减 40 后 为 28/29℃,落在最低28~最高30区间内,按文档直读则超出物理范围) - pCCU/DbStore:新增 bcu_node 解析数据表,锂电池 BMS 报文每帧落一行 节点合成状态(原 comm_log 仅原始帧,BMS/CAN 帧此前不落 pCCU 库), buildReport 增加 BMS 记录数 - 快照/网页:BCU 按节点分组展示(告警位解析中文含义、数据 age), PM 状态报文锂电池/应急电池卡片 - pPowerManger:新增 iport 本地输入端口配置(UDP bind 延迟到 OnStartUp 读取配置后执行,保证 iport/ccuhost/ccuport 生效), 各 mission 文件补充注释 - test:CAN BCU 解码用例按新协议/新偏移更新(实车抓包 + 文档示例值), 133 项全部通过 - docs:删除旧 BMS 协议(xlsx/20230324docx),归档 04KT38 BCU-MBMS CAN 定义、配电控制器通信协议 20260824、配电系统 CAN 通讯协议 - scripts:新增 sync-board-time.sh,223 板卡(RK3588)时间校正 (本机为基准 + RTT 折半补偿对时,尽力写 RTC,支持 status/--time)
This commit is contained in:
@@ -13,7 +13,7 @@ namespace ccu {
|
||||
// SystemData:跨线程共享的最新状态快照。
|
||||
//
|
||||
// - 接收线程(FC 链路)写 FcStatus 快照
|
||||
// - MOOS 主线程(OnNewMail)写 BMS 快照(CAN 经 pCanBridge 透传)
|
||||
// - MOOS 主线程(OnNewMail)写 BCU 节点快照(CAN 经 pCanBridge 透传)
|
||||
// - CCU 主循环(Iterate)读快照并整合编码为 PM 状态报文发送
|
||||
// - 网页线程读快照展示
|
||||
// 通过互斥锁保护读写。
|
||||
@@ -101,17 +101,27 @@ public:
|
||||
return m_pmParamFb;
|
||||
}
|
||||
|
||||
//-------- 锂电池 BMS(CAN 总线,经 pCanBridge 透传) --------
|
||||
//-------- 锂电池 BCU 节点(CAN 总线,经 pCanBridge 透传) --------
|
||||
|
||||
// 更新最新 BMS 状态(每帧部分更新,由调用方先取出快照再合并)
|
||||
void updateBmsStatus(const BmsStatusValue& v) {
|
||||
// 更新单个 BCU 节点状态(每帧部分更新,由调用方先取出快照再合并)
|
||||
void updateBcuNode(uint8_t addr, const BcuNodeStatus& v) {
|
||||
std::lock_guard<std::mutex> lock(m_mutex);
|
||||
m_bmsStatus = v;
|
||||
m_bmsStatusCount++;
|
||||
if (addr >= kBcuAddrMin && addr <= kBcuAddrMax) {
|
||||
m_bcuNodes[addr - kBcuAddrMin] = v;
|
||||
m_bmsStatusCount++;
|
||||
}
|
||||
}
|
||||
BmsStatusValue bmsStatus() const {
|
||||
// 读取单个 BCU 节点快照(地址非法返回 valid=false 的空快照)
|
||||
BcuNodeStatus bcuNode(uint8_t addr) const {
|
||||
std::lock_guard<std::mutex> lock(m_mutex);
|
||||
return m_bmsStatus;
|
||||
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);
|
||||
@@ -136,7 +146,7 @@ private:
|
||||
FcControlValue m_fcControl;
|
||||
PmStatusValue m_pmStatus;
|
||||
PmParamSetFbValue m_pmParamFb;
|
||||
BmsStatusValue m_bmsStatus;
|
||||
BcuNodeStatus m_bcuNodes[kBcuNodeCount]; // 下标 = 节点地址-1
|
||||
unsigned long m_fcStatusCount = 0;
|
||||
unsigned long m_pmControlCount = 0;
|
||||
unsigned long m_fcControlCount = 0;
|
||||
|
||||
Reference in New Issue
Block a user