锂电池改用 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:
+16
-9
@@ -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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user