锂电池改用 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:
zjk
2026-09-01 12:58:33 +08:00
parent 88bed850ee
commit 5b8f0b1421
27 changed files with 894 additions and 170 deletions
+16 -9
View File
@@ -197,20 +197,26 @@ void CCU::handleCanMessage(CMOOSMsg& msg) {
unsigned char* d = msg.GetBinaryData();
if (!d) return;
// 合并语义:取当前快照 -> 解码部分更新 -> 写回
BmsStatusValue v = m_sysData->bmsStatus();
if (decodeCanBmsFrame(canId, d, static_cast<int>(n), v)) {
v.valid = true;
v.lastRxTime = MOOSTime(false);
m_sysData->updateBmsStatus(v);
// 合并语义:先取该节点当前快照 -> 解码部分更新 -> 写回
// (每个功能码报文只更新自己的字段,不能整体覆盖)
uint8_t addr = bcuAddrOf(canId);
if (!addr) return;
BcuNodeStatus node = m_sysData->bcuNode(addr);
if (decodeCanBcuFrame(canId, d, static_cast<int>(n), addr, node)) {
node.valid = true;
node.lastRxTime = MOOSTime(false);
m_sysData->updateBcuNode(addr, node);
// 锂电池解析数据落库(bcu_node 表,每帧一行,含节点最新合成状态)
if (m_db) m_db->insertBcuNode(addr, bcuFuncOf(canId), node);
// 节流日志:1s 一条,便于联调观察
double now = MOOSTime();
if (now - m_lastBmsLog >= 1.0) {
m_lastBmsLog = now;
LOG_F(INFO, "[BMS/CAN] u=%.1fV i=%.1fA soc=%.1f%% fault=%d status=%d cellMax=%.3fV",
v.totalVoltage, v.totalCurrent, v.soc,
v.faultCode, v.statusBits, v.maxCellVoltage);
LOG_F(INFO, "[BMS/CAN] 节点%d u=%.1fV i=%.1fA soc=%.1f%% alarm=%02X self=%d vMax=%.3fV",
addr, node.totalVoltage, node.current, node.soc,
node.alarmCode, node.selfCheck, node.maxCellVoltage);
}
}
}
@@ -479,6 +485,7 @@ bool CCU::buildReport() {
}
if (m_db) {
m_msgs << "数据库记录数:" << m_db->count() << "\n";
m_msgs << "数据库BMS记录数:" << m_db->countBcu() << "\n";
}
return true;
}