From 5b8f0b1421f8feeab46ec69d749e995fb0b7b5b9 Mon Sep 17 00:00:00 2001 From: zjk <1553836110@qq.com> Date: Tue, 1 Sep 2026 12:58:33 +0800 Subject: [PATCH] =?UTF-8?q?=E9=94=82=E7=94=B5=E6=B1=A0=E6=94=B9=E7=94=A8?= =?UTF-8?q?=20BCU-MBMS=20CAN=20=E5=8D=8F=E8=AE=AE=E6=8C=89=E8=8A=82?= =?UTF-8?q?=E7=82=B9=E8=A7=A3=E6=9E=90=20+=20bcu=5Fnode=20=E8=A7=A3?= =?UTF-8?q?=E6=9E=90=E6=95=B0=E6=8D=AE=E8=90=BD=E5=BA=93=20+=20=E6=9D=BF?= =?UTF-8?q?=E5=8D=A1=E5=AF=B9=E6=97=B6=E8=84=9A=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 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) --- bin/pPowerManger.moos | 2 + docs/04KT38电池BCU-MBMS通信(CAN)定义.docx | Bin 0 -> 22737 bytes docs/BMS_协议字段定义.xlsx | Bin 10931 -> 0 bytes ...控制器与复合管控器的通信协议20260824.docx | Bin 0 -> 70388 bytes docs/配电系统CAN通讯协议.xlsx | Bin 0 -> 42808 bytes docs/锂电池协议20230324.docx | Bin 45747 -> 0 bytes missions/h100.moos | 2 + missions/pPowerManger.moos | 2 + scripts/sync-board-time.sh | 176 ++++++++++++++++++ src/pCCU/CCU.cpp | 25 ++- src/pCCU/CCU.h | 2 +- src/pCCU/core/CoordFsm.cpp | 6 +- src/pCCU/core/CoordFsm.hpp | 6 +- src/pCCU/core/PowerCoordinator.cpp | 2 +- src/pCCU/core/SnapshotBuilder.cpp | 86 +++++++-- src/pCCU/core/SystemData.h | 28 ++- src/pCCU/protocol/CanBms.cpp | 146 ++++++++++++--- src/pCCU/protocol/CanBms.h | 165 ++++++++++++---- src/pCCU/store/DbStore.cpp | 122 +++++++++++- src/pCCU/store/DbStore.h | 11 ++ src/pCCU/web/pages/index.h | 122 +++++++++--- src/pPowerManger/LowerCommManager.cpp | 10 + src/pPowerManger/LowerCommManager.h | 3 + src/pPowerManger/PowerManger.cpp | 20 +- src/pPowerManger/PowerManger.h | 1 + src/pPowerManger/pPowerManger.moos | 2 + test/pccu/pccuTest.cpp | 125 +++++++++---- 27 files changed, 894 insertions(+), 170 deletions(-) create mode 100644 docs/04KT38电池BCU-MBMS通信(CAN)定义.docx delete mode 100644 docs/BMS_协议字段定义.xlsx create mode 100644 docs/配电控制器与复合管控器的通信协议20260824.docx create mode 100644 docs/配电系统CAN通讯协议.xlsx delete mode 100644 docs/锂电池协议20230324.docx create mode 100755 scripts/sync-board-time.sh diff --git a/bin/pPowerManger.moos b/bin/pPowerManger.moos index 2de7531..882b3f8 100644 --- a/bin/pPowerManger.moos +++ b/bin/pPowerManger.moos @@ -6,4 +6,6 @@ ProcessConfig = pPowerManger CommsTick = 4 log_level = INFO log_file = /path/to/your/logfile.log + // 本地输入端口(接收 CCU 数据);不配置则默认 5001 + // iport = 5001 } \ No newline at end of file diff --git a/docs/04KT38电池BCU-MBMS通信(CAN)定义.docx b/docs/04KT38电池BCU-MBMS通信(CAN)定义.docx new file mode 100644 index 0000000000000000000000000000000000000000..6392599e2926ef287f615954f2e27459150981b7 GIT binary patch literal 22737 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 literal 0 HcmV?d00001 diff --git a/docs/BMS_协议字段定义.xlsx b/docs/BMS_协议字段定义.xlsx deleted file mode 100644 index a840f9919ccef5ce5eb70c656e41eeaf4e3420eb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10931 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 iMqL8?%cAnl9DW4S%IsO<$`pHwAOjTtg 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 m82~{1hv~n#&itM5H#x_j2S<6>JHSxC8o diff --git a/missions/h100.moos b/missions/h100.moos index b836fe1..2d22ddf 100644 --- a/missions/h100.moos +++ b/missions/h100.moos @@ -20,6 +20,8 @@ ProcessConfig = pPowerManger // CCU 地址(pPowerManger -> pCCU 的 UDP 链路);不配置则默认 127.0.0.1:7000 ccuhost = 127.0.0.1 ccuport = 7000 + // 本地输入端口(接收 CCU 数据);不配置则默认 5001 + // iport = 5001 } ProcessConfig = pPowerMangerHost diff --git a/missions/pPowerManger.moos b/missions/pPowerManger.moos index 60c307b..b67ccaa 100644 --- a/missions/pPowerManger.moos +++ b/missions/pPowerManger.moos @@ -5,4 +5,6 @@ ProcessConfig = pPowerManger // CCU 地址;不配置则默认 127.0.0.1:7000 // ccuhost = 127.0.0.1 // ccuport = 7000 + // 本地输入端口(接收 CCU 数据);不配置则默认 5001 + // iport = 5001 } \ No newline at end of file diff --git a/scripts/sync-board-time.sh b/scripts/sync-board-time.sh new file mode 100755 index 0000000..d9c91a5 --- /dev/null +++ b/scripts/sync-board-time.sh @@ -0,0 +1,176 @@ +#!/bin/bash +#======================================================================= +# FILE: scripts/sync-board-time.sh +# DESC: 校正 223 板卡(RK3588,默认 192.168.0.223)的系统时间:以 +# 本机时间(或 --time 指定时间)为基准,经 SSH 设置板卡系统时 +# 钟,并尽力写入硬件时钟 (RTC)。板卡网络隔离无 NTP,用本脚本对时。 +# +# 用法: +# ./scripts/sync-board-time.sh # 用本机时间校正板卡 +# ./scripts/sync-board-time.sh status # 只查看时间与偏差 +# ./scripts/sync-board-time.sh --time "2026-09-01 12:00:00" +# # 用指定时间校正(本地时区) +# +# 参数: +# --host 目标主机(默认 192.168.0.223) +# --user 登录用户(默认 root) +# --time 手动指定基准时间(date 可解析的格式,按本地时区解释) +# --keep-ntp 不执行 timedatectl set-ntp false +# --no-rtc 不写硬件时钟(跳过 hwclock --systohc) +# -h, --help 显示帮助 +# +# 说明: +# - 需要 root 登录与免密 SSH(deploy.sh setup-ssh)。 +# - 对时经 SSH 往返时延 (RTT) 折半补偿,精度约 ±0.1s(受网络抖动影响)。 +# - 板卡若无可用 RTC,hwclock 失败仅告警;重启后时间可能回跳。 +# - 对时会调整系统时钟,运行中的服务日志时间戳会跳变,属正常现象。 +#======================================================================= + +set -uo pipefail + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" + +HOST="192.168.0.223" +USER="root" +SET_TIME="" +KEEP_NTP=0 +NO_RTC=0 + +info() { printf '\033[1;36m[time]\033[0m %s\n' "$*"; } +ok() { printf '\033[1;32m[time]\033[0m %s\n' "$*"; } +warn() { printf '\033[1;33m[time]\033[0m %s\n' "$*"; } +err() { printf '\033[1;31m[time]\033[0m %s\n' "$*"; } + +usage() { + sed -n '2,26p' "${BASH_SOURCE[0]}" | sed 's/^# \{0,1\}//' + exit 0 +} + +#------------------------------------------------------------------- +# 参数解析 +#------------------------------------------------------------------- +ACTION="" +while [ $# -gt 0 ]; do + case "$1" in + --host) [ $# -ge 2 ] || { err "--host 需要参数"; exit 1; }; HOST="$2"; shift 2 ;; + --user) [ $# -ge 2 ] || { err "--user 需要参数"; exit 1; }; USER="$2"; shift 2 ;; + --time) [ $# -ge 2 ] || { err "--time 需要参数"; exit 1; }; SET_TIME="$2"; shift 2 ;; + --keep-ntp) KEEP_NTP=1; shift ;; + --no-rtc) NO_RTC=1; shift ;; + status|help|-h|--help) ACTION="$1"; shift ;; + "") shift ;; + *) err "未知参数: $1(见 help)"; exit 1 ;; + esac +done +[ -n "${ACTION}" ] || ACTION="sync" + +SSH_TARGET="${USER}@${HOST}" +SSH="ssh -o BatchMode=yes -o ConnectTimeout=5" + +#------------------------------------------------------------------- +# 读取板卡时间并测 RTT +# 输出: "|<板卡可读时间> "(t0/t1 为本机采样时刻) +#------------------------------------------------------------------- +read_board_time() { + local t0 t1 out + t0="$(date +%s.%N)" + out="$(${SSH} "${SSH_TARGET}" 'date "+%s.%N|%F %T %Z"' 2>/dev/null)" || { + err "无法免密 SSH 到 ${SSH_TARGET}(先执行: ./scripts/deploy.sh setup-ssh)" >&2 + return 1 + } + t1="$(date +%s.%N)" + printf '%s %.3f %.3f\n' "${out}" "${t0}" "${t1}" +} + +# 从 read_board_time 输出解析: set -- 后取 $1/$2/$3 +parse_board_time() { + B_EPOCH="${1%%|*}" + B_DATE="${1#*|}" + T0="$2" + T1="$3" + MID="$(awk -v t0="${T0}" -v t1="${T1}" 'BEGIN{printf "%.3f", t0 + (t1-t0)/2}')" + DIFF="$(awk -v b="${B_EPOCH}" -v m="${MID}" 'BEGIN{printf "%+.3f", b - m}')" +} + +#------------------------------------------------------------------- +# 命令: status +#------------------------------------------------------------------- +cmd_status() { + local out + out="$(read_board_time)" || return 1 + parse_board_time ${out} + local rtt + rtt="$(awk -v t0="${T0}" -v t1="${T1}" 'BEGIN{printf "%.3f", t1-t0}')" + printf '本机时间: %s (RTT %.3fs)\n' "$(date -d "@${MID}" '+%F %T')" "${rtt}" + printf '板卡时间: %s\n' "${B_DATE}" + printf '偏差: 板卡比本机快 %s 秒\n' "${DIFF}" +} + +#------------------------------------------------------------------- +# 命令: sync(默认) +#------------------------------------------------------------------- +cmd_sync() { + local out target board_reply + + # 前置检查:SSH 连通 + 板卡 root 权限 + out="$(read_board_time)" || return 1 + parse_board_time ${out} + if ! ${SSH} "${SSH_TARGET}" '[ "$(id -u)" = 0 ]' 2>/dev/null; then + err "板卡登录用户需要 root 权限(当前 --user ${USER})" + return 1 + fi + ok "SSH 连接正常: ${SSH_TARGET}" + info "当前偏差: 板卡比本机快 ${DIFF} 秒" + + # 关闭 NTP 自动同步(板卡网络隔离本就无 NTP 源,防止干扰手动对时) + if [ "${KEEP_NTP}" = "0" ]; then + info "关闭板卡 NTP 自动同步 (timedatectl set-ntp false) ..." + ${SSH} "${SSH_TARGET}" "command -v timedatectl >/dev/null 2>&1 && timedatectl set-ntp false || true" + fi + + # 计算目标时间:手动指定值直接用;否则取本机时间 + RTT/2 补偿 + if [ -n "${SET_TIME}" ]; then + target="$(date -d "${SET_TIME}" '+%s.%N' 2>/dev/null)" || { + err "无法解析时间: ${SET_TIME}"; return 1; + } + info "基准时间(手动): ${SET_TIME}" + else + local t2 + t2="$(date +%s.%N)" + target="$(awk -v t2="${t2}" -v t0="${T0}" -v t1="${T1}" 'BEGIN{printf "%.3f", t2 + (t1-t0)/2}')" + info "基准时间(本机 + RTT/2 补偿)" + fi + info "设置板卡系统时间 -> $(date -d "@${target}" '+%F %T') ..." + + board_reply="$(${SSH} "${SSH_TARGET}" "date -s @${target} 2>&1")" || { + err "date -s 失败: ${board_reply}" + return 1 + } + ok "板卡返回: ${board_reply}" + + # 写硬件时钟(无 RTC 时仅告警) + if [ "${NO_RTC}" = "0" ]; then + info "同步硬件时钟 (hwclock --systohc) ..." + if ${SSH} "${SSH_TARGET}" "hwclock --systohc" 2>/dev/null; then + ok "RTC 已同步" + else + warn "hwclock 失败(板卡可能无 RTC 或驱动未加载),重启后时间可能回跳" + fi + fi + + # 校验 + out="$(read_board_time)" || return 1 + parse_board_time ${out} + info "校正后偏差: 板卡比本机快 ${DIFF} 秒" + ok "板卡时间: ${B_DATE}" +} + +#------------------------------------------------------------------- +# 命令入口 +#------------------------------------------------------------------- +case "${ACTION}" in + sync) cmd_sync ;; + status) cmd_status ;; + help|-h|--help) usage ;; + *) usage ;; +esac diff --git a/src/pCCU/CCU.cpp b/src/pCCU/CCU.cpp index 1e53b57..39498cc 100644 --- a/src/pCCU/CCU.cpp +++ b/src/pCCU/CCU.cpp @@ -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(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(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; } diff --git a/src/pCCU/CCU.h b/src/pCCU/CCU.h index f997eb6..3a29f14 100644 --- a/src/pCCU/CCU.h +++ b/src/pCCU/CCU.h @@ -23,7 +23,7 @@ namespace ccu { // 订阅 pCanBridge 透传的 CAN_0x* 消息 -> 解析锂电池 BMS 报文 // (docs/BMS_协议字段定义.xlsx:总电压/SOC/电流/故障码等)-> SystemData 快照 // (BMS CAN 协议未定义控制报文,电池侧远程控制暂不可用) -// 收发全部帧落库 SQLite;网页周期推送 JSON 快照。 +// 收发全部帧落库 SQLite(锂电池 BMS 解析数据另存 bcu_node 表);网页周期推送 JSON 快照。 //============================================================================ class CCU : public AppCastingMOOSApp { diff --git a/src/pCCU/core/CoordFsm.cpp b/src/pCCU/core/CoordFsm.cpp index ab98a62..e110ea2 100644 --- a/src/pCCU/core/CoordFsm.cpp +++ b/src/pCCU/core/CoordFsm.cpp @@ -25,7 +25,7 @@ void CoordNormalState::react(TickEvent const &e) { // // 读取最新状态: // sys()->fcStatus() 燃料电池状态 - // sys()->bmsStatus() 锂电池 BMS 状态(总电压/SOC/电流/故障码,CAN) + // sys()->bcuNode(addr) 锂电池 BCU 节点状态(电压/SOC/电流/告警,CAN) // sys()->pmControl() 主机最新操控指令 // // 下发操作: @@ -61,7 +61,7 @@ void CoordBusyState::exit() { void CoordBusyState::react(TickEvent const &e) { // TODO(策略填写):操作进行中的周期监视(进度/超时统计、是否需要中止)。 - // 状态可通过 sys()->bmsStatus() / sys()->fcStatus() 获取。 + // 状态可通过 sys()->bcuNode(addr) / sys()->fcStatus() 获取。 (void)e; } @@ -88,7 +88,7 @@ void CoordFaultState::exit() { void CoordFaultState::react(TickEvent const &e) { // TODO(策略填写):故障处理与恢复判断(周期检查故障是否消除, // 消除后 transit() 回正常运行态)。 - // 可用:sys()->fcStatus().fc_fault_level、sys()->bmsStatus().faultCode 等。 + // 可用:sys()->fcStatus().fc_fault_level、sys()->bcuNode(addr).alarmBits 等。 (void)e; } diff --git a/src/pCCU/core/CoordFsm.hpp b/src/pCCU/core/CoordFsm.hpp index dbc287a..b0e12d1 100644 --- a/src/pCCU/core/CoordFsm.hpp +++ b/src/pCCU/core/CoordFsm.hpp @@ -67,12 +67,12 @@ struct PmControlEvent : tinyfsm::Event { }; // 协调操作步骤完成/超时:由协调动作引擎产生(预留)。 -// status 携带完成时刻的 BMS 状态快照(SOC/电压/电流/故障码,可判故障) +// status 携带完成时刻的 BCU 节点状态快照(SOC/电压/电流/告警,可判故障) struct StepDoneEvent : tinyfsm::Event { bool confirmed; // true=确认完成;false=超时未确认 - BmsStatusValue status; // 完成时刻 BMS 状态快照 + BcuNodeStatus status; // 完成时刻 BCU 节点状态快照 StepDoneEvent() : confirmed(false) {} - StepDoneEvent(bool ok, const BmsStatusValue& s) : confirmed(ok), status(s) {} + StepDoneEvent(bool ok, const BcuNodeStatus& s) : confirmed(ok), status(s) {} }; //---- 状态机 --------------------------------------------------------------- diff --git a/src/pCCU/core/PowerCoordinator.cpp b/src/pCCU/core/PowerCoordinator.cpp index 345a41f..5f949a6 100644 --- a/src/pCCU/core/PowerCoordinator.cpp +++ b/src/pCCU/core/PowerCoordinator.cpp @@ -33,7 +33,7 @@ bool PowerCoordinator::sendFcControl(const FcControlValue& fcCmd) { // // 可用输入(通过 m_sys 读取最新状态): // - m_sys->fcStatus() : 燃料电池最新状态 -// - m_sys->bmsStatus() : 锂电池 BMS 最新状态(总电压/SOC/电流/故障码, +// - m_sys->bcuNode(addr) : 锂电池 BCU 节点最新状态(电压/SOC/电流/告警, // CAN 经 pCanBridge 透传,protocol/CanBms.h) // - m_sys->pmControl() : 控制主机最新操控指令 // diff --git a/src/pCCU/core/SnapshotBuilder.cpp b/src/pCCU/core/SnapshotBuilder.cpp index 3fcc37c..6d05031 100644 --- a/src/pCCU/core/SnapshotBuilder.cpp +++ b/src/pCCU/core/SnapshotBuilder.cpp @@ -1,6 +1,7 @@ #include "SnapshotBuilder.h" #include "../store/DbStore.h" #include "../protocol/CanBms.h" +#include "MOOS/libMOOS/Utils/MOOSUtilityFunctions.h" #include "json/json.h" #include #include @@ -209,19 +210,72 @@ JsonVal pmFbJson(const PmParamSetFbValue& v) { return j; } -// 锂电池 BMS 状态(CAN,docs/BMS_协议字段定义.xlsx)-> JSON -JsonVal bmsStatusJson(const BmsStatusValue& v) { +// 锂电池 BCU 节点(CAN,docs/04KT38电池BCU-MBMS通信(CAN)定义.docx)-> JSON +// 同一节点(0x10XX00YY 中 XX)的全部报文字段归并在一个对象内, +// 告警位由附录1 表解析出中文含义放入 alarms 数组。 +// nowSec 为当前 MOOSTime,用于计算节点数据最后更新距今的秒数 age。 +JsonVal bcuNodeJson(uint8_t addr, const BcuNodeStatus& v, double nowSec) { JsonVal j(Json::objectValue); - j["totalVoltage"] = JsonVal(v.totalVoltage); // V - j["soc"] = JsonVal(v.soc); // % - j["faultCode"] = JsonVal(v.faultCode); // 故障码 - j["statusBits"] = JsonVal(v.statusBits); // 状态位 - j["maxCurrentLimit"] = JsonVal(v.maxCurrentLimit); // A - j["totalCurrent"] = JsonVal(v.totalCurrent); // A(放电为正) - j["maxCellVoltage"] = JsonVal(v.maxCellVoltage); // V - j["totalVoltageChk"] = JsonVal(v.totalVoltageChk); // V(校验) - j["valid"] = JsonVal(v.valid); - j["lastRx"] = JsonVal(v.lastRxTime); + j["addr"] = JsonVal(addr); + j["valid"] = JsonVal(v.valid); + j["lastRx"] = JsonVal(v.lastRxTime); + j["age"] = JsonVal(nowSec - v.lastRxTime); // 距最后收到该节点报文的秒数 + j["rx"] = JsonVal(static_cast(v.rxMask)); + + // 0x10XX0000:电压 / 电流 / SOC / 告警码 / 自检 + j["totalVoltage"] = JsonVal(v.totalVoltage); + j["current"] = JsonVal(v.current); + j["soc"] = JsonVal(v.soc); + j["alarmCode"] = JsonVal(v.alarmCode); + j["selfCheck"] = JsonVal(v.selfCheck); + + // 0x10XX0001:单体电压 + j["maxCellVoltage"] = JsonVal(v.maxCellVoltage); + j["maxCellVoltageNo"] = JsonVal(v.maxCellVoltageNo); + j["minCellVoltage"] = JsonVal(v.minCellVoltage); + j["minCellVoltageNo"] = JsonVal(v.minCellVoltageNo); + j["avgCellVoltage"] = JsonVal(v.avgCellVoltage); + + // 0x10XX0002:单体温度 + j["maxCellTemp"] = JsonVal(v.maxCellTemp); + j["maxCellTempNo"] = JsonVal(v.maxCellTempNo); + j["minCellTemp"] = JsonVal(v.minCellTemp); + j["minCellTempNo"] = JsonVal(v.minCellTempNo); + j["avgCellTemp"] = JsonVal(v.avgCellTemp); + + // 0x10XX0003:继电器 + j["posRelay"] = JsonVal(v.posRelay); + j["negRelay"] = JsonVal(v.negRelay); + + // 0x10XX0006:绝缘 / 端口电压 + j["posInsulationKohm"] = JsonVal(v.posInsulationKohm); + j["negInsulationKohm"] = JsonVal(v.negInsulationKohm); + j["portVoltage"] = JsonVal(v.portVoltage); + j["posRelayOuterVoltage"] = JsonVal(v.posRelayOuterVoltage); + + // 0x10XX0010:告警位(原始 hex + 附录1 解释) + JsonVal bits(Json::arrayValue); + for (int i = 0; i < 6; ++i) + bits.append(JsonVal(static_cast(v.alarmBits[i]))); + j["alarmBits"] = bits; + + JsonVal alarms(Json::arrayValue); + const char* texts[32]; + int n = bcuAlarmTexts(v, texts, 32); + for (int i = 0; i < n; ++i) + alarms.append(JsonVal(texts[i])); + j["alarms"] = alarms; + j["alarmCount"] = JsonVal(n); + return j; +} + +// 全部 BCU 节点 -> JSON(只输出收到过报文的节点,按地址升序) +JsonVal bcuNodesJson(const BcuNodeStatus nodes[kBcuNodeCount], double nowSec) { + JsonVal j(Json::arrayValue); + for (int i = 0; i < kBcuNodeCount; ++i) { + if (nodes[i].valid) + j.append(bcuNodeJson(static_cast(i + kBcuAddrMin), nodes[i], nowSec)); + } return j; } @@ -353,8 +407,10 @@ std::string SnapshotBuilder::build() const { root["pmParam"] = pmParamJson(m_sys->pmParamSet()); root["pmFb"] = pmFbJson(m_sys->pmParamFb()); root["pmStatus"] = pmStatusJson(m_sys->pmStatus()); - // 锂电池 BMS(CAN,经 pCanBridge 透传) - root["bms"] = bmsStatusJson(m_sys->bmsStatus()); + // 锂电池 BCU 节点(CAN,经 pCanBridge 透传,按节点分组) + BcuNodeStatus nodes[kBcuNodeCount]; + m_sys->bcuNodes(nodes); + root["bms"] = bcuNodesJson(nodes, MOOSTime(false)); root["fcStatusCount"] = JsonVal(static_cast(m_sys->fcStatusCount())); root["pmControlCount"] = JsonVal(static_cast(m_sys->pmControlCount())); root["fcControlCount"] = JsonVal(static_cast(m_sys->fcControlCount())); @@ -368,7 +424,7 @@ std::string SnapshotBuilder::build() const { root["pmParam"] = JsonVal(Json::objectValue); root["pmFb"] = JsonVal(Json::objectValue); root["pmStatus"] = JsonVal(Json::objectValue); - root["bms"] = JsonVal(Json::objectValue); + root["bms"] = JsonVal(Json::arrayValue); } JsonVal links(Json::objectValue); diff --git a/src/pCCU/core/SystemData.h b/src/pCCU/core/SystemData.h index 410df57..5bbdee5 100644 --- a/src/pCCU/core/SystemData.h +++ b/src/pCCU/core/SystemData.h @@ -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 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 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 lock(m_mutex); + for (int i = 0; i < kBcuNodeCount; ++i) out[i] = m_bcuNodes[i]; } unsigned long bmsStatusCount() const { std::lock_guard 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; diff --git a/src/pCCU/protocol/CanBms.cpp b/src/pCCU/protocol/CanBms.cpp index 9bc00e6..133820a 100644 --- a/src/pCCU/protocol/CanBms.cpp +++ b/src/pCCU/protocol/CanBms.cpp @@ -14,41 +14,143 @@ inline int16_t rdS16BE(const uint8_t* p) { return static_cast(rdU16BE(p)); } +// 有符号 8 位(温度) +inline int8_t rdS8(uint8_t b) { return static_cast(b); } + +// 设置功能码已收位 +inline void markRx(BcuNodeStatus& n, uint8_t func) { + n.rxMask |= (1u << (func & 31)); +} + } // namespace -bool decodeCanBmsFrame(uint32_t canId, const uint8_t* data, int dlc, BmsStatusValue& v) { +//============================================================================ +// 附录1:0x10XX0010 告警位定义(04KT38电池BCU-MBMS通信(CAN)定义.docx) +//============================================================================ +const BcuAlarmDesc kBcuAlarmTable[] = { + // byte0:2 级告警 + {0, 0, "BCU绝缘2级"}, + {0, 1, "BCU最高温度过高2级"}, + {0, 2, "BCU最低温度过低2级"}, + {0, 3, "BCU单体电压不均衡2级"}, + {0, 4, "BCU单体温度不均衡2级"}, + {0, 5, "BCU放电过流2级"}, + {0, 6, "BCU单体电压过高2级"}, + {0, 7, "BCU单体电压过低2级"}, + // byte1 + {1, 0, "BCU总电压过高2级"}, + {1, 1, "BCU总电压过低2级"}, + {1, 2, "BCU烟雾报警1级"}, + {1, 3, "烟雾报警器不在线"}, + {1, 4, "烟雾报警器上报自身故障"}, + {1, 5, "BCU单包绝缘3级"}, + {1, 6, "BCU最高温度过高3级"}, + {1, 7, "BCU最低温度过低3级"}, + // byte2 + {2, 0, "单体电压不均衡3级"}, + {2, 1, "单体温度不均衡3级"}, + {2, 2, "单包放电过流3级"}, + {2, 3, "BCU单体电压过高3级"}, + {2, 4, "BCU单体电压过低3级"}, + {2, 5, "BCU总电压过高3级"}, + {2, 6, "BCU总电压过低3级"}, + {2, 7, "BCU单体温度传感器检测故障"}, + // byte3 + {3, 0, "BCU正极继电器失效"}, + {3, 1, "BCU负极继电器失效"}, + {3, 3, "单包BMS内部通讯故障"}, + {3, 4, "BCU电流传感器故障"}, + {3, 5, "BCU电压传感器故障"}, + {3, 7, "BCU高压回路连接异常"}, + // byte4 + {4, 1, "烟雾报警2级"}, + {4, 4, "烟雾报警3级"}, + {4, 6, "烟雾报警4级"}, + {4, 7, "回馈电流过大2级"}, + // byte5 + {5, 0, "回馈电流过大3级"}, + {5, 1, "充电电流过大3级"}, + {0xFF, 0, nullptr}, // 表尾 +}; + +int bcuAlarmTexts(const BcuNodeStatus& node, const char* texts[], int cap) { + if (!texts || cap <= 0) return 0; + int count = 0; + for (int i = 0; kBcuAlarmTable[i].text; ++i) { + const BcuAlarmDesc& d = kBcuAlarmTable[i]; + if (d.byteIdx < sizeof(node.alarmBits) && + (node.alarmBits[d.byteIdx] >> d.bitIdx) & 0x01) { + if (count >= cap) break; + texts[count++] = d.text; + } + } + return count; +} + +bool decodeCanBcuFrame(uint32_t canId, const uint8_t* data, int dlc, + uint8_t& nodeAddr, BcuNodeStatus& node) { if (!data || dlc <= 0) return false; + uint8_t addr = bcuAddrOf(canId); + if (!addr || !isCanBcuId(canId)) return false; + + nodeAddr = addr; + // 缩放用除法(而非乘 0.1/0.001),保证结果与十进制字面量严格一致。 - switch (canId) { - case CAN_BMS_ID_STATUS: // 0x10010000:总电压 / SOC / 故障码 / 状态位 + switch (bcuFuncOf(canId)) { + case BCU_FUNC_BASE: // 0x10XX0000:电压 / 电流 / SOC / 告警码 / 自检 if (dlc >= 8) { - v.totalVoltage = rdU16BE(data + 0) / 10.0; // 0.1V - v.soc = rdU16BE(data + 4) / 10.0; // 0.1% - v.faultCode = data[6]; - v.statusBits = data[7]; + node.totalVoltage = rdU16BE(data + 0) / 10.0; // 0.1V + node.current = rdS16BE(data + 2) / 10.0 - 600.0; // 0.1A,偏移-600A + node.soc = rdU16BE(data + 4) / 10.0; // 0.1% + node.alarmCode = data[6]; + node.selfCheck = data[7]; + markRx(node, BCU_FUNC_BASE); } break; - case CAN_BMS_ID_CURRENT: - // 0x10010005:最大电流限制 / 总电流 / 最高单体电压 - // 注:xlsx 表中"总电流"标注为 3 字节(s24),但与其自身示例 - // (总电流 00 00 => 0.0A、最高单体电压 0x0EA8 => 3.752V, - // 对应实车帧 07 d0 | 00 00 | 0e a8 | 00 00)矛盾——s24@2 会与 - // 单体电压@4 重叠。按示例与实测采用 2 字节 s16(负电流示例 - // 0xFF06 => -25.0A 亦为 2 字节补码)。 - if (dlc >= 2) v.maxCurrentLimit = rdU16BE(data + 0) / 10.0; // 0.1A - if (dlc >= 4) v.totalCurrent = rdS16BE(data + 2) / 10.0; // 0.1A,放电为正 - if (dlc >= 6) v.maxCellVoltage = rdU16BE(data + 4) / 1000.0; // 0.001V + case BCU_FUNC_CELL_V: // 0x10XX0001:最高/最低/平均单体电压 + if (dlc >= 2) node.maxCellVoltage = rdU16BE(data + 0) / 1000.0; // 1mV + if (dlc >= 3) node.maxCellVoltageNo = data[2]; + if (dlc >= 5) node.minCellVoltage = rdU16BE(data + 3) / 1000.0; // 1mV + if (dlc >= 6) node.minCellVoltageNo = data[5]; + if (dlc >= 8) node.avgCellVoltage = rdU16BE(data + 6) / 1000.0; // 1mV + markRx(node, BCU_FUNC_CELL_V); break; - case CAN_BMS_ID_VOLT_CHK: // 0x10010006:总电压(校验) - if (dlc >= 6) { - v.totalVoltageChk = rdU16BE(data + 4) / 10.0; // 0.1V - } + case BCU_FUNC_CELL_T: // 0x10XX0002:最高/最低/平均单体温度 + if (dlc >= 1) node.maxCellTemp = rdS8(data[0]) - 40.0; // 偏移-40℃ + if (dlc >= 2) node.maxCellTempNo = data[1]; + if (dlc >= 3) node.minCellTemp = rdS8(data[2]) - 40.0; // 偏移-40℃ + if (dlc >= 4) node.minCellTempNo = data[3]; + if (dlc >= 5) node.avgCellTemp = rdS8(data[4]) - 40.0; // 偏移-40℃(文档写偏移0, + // 但实测固件与最高/最低一致均带-40偏移,见0x10020002: + // 原始68/69减40后为28/29℃,落在最低28~最高30区间内) + markRx(node, BCU_FUNC_CELL_T); break; - default: + case BCU_FUNC_RELAY: // 0x10XX0003:正/负极继电器状态 + if (dlc >= 1) node.posRelay = data[0]; + if (dlc >= 2) node.negRelay = data[1]; + markRx(node, BCU_FUNC_RELAY); + break; + + case BCU_FUNC_ISU: // 0x10XX0006:绝缘阻值 / 端口电压 + if (dlc >= 2) node.posInsulationKohm = rdU16BE(data + 0); // 1kΩ + if (dlc >= 4) node.negInsulationKohm = rdU16BE(data + 2); // 1kΩ + if (dlc >= 6) node.portVoltage = rdU16BE(data + 4) / 10.0; // 0.1V + if (dlc >= 8) node.posRelayOuterVoltage = rdU16BE(data + 6) / 10.0; // 0.1V + markRx(node, BCU_FUNC_ISU); + break; + + case BCU_FUNC_ALARM: // 0x10XX0010:告警位(附录1) + for (int i = 0; i < 6 && i < dlc; ++i) node.alarmBits[i] = data[i]; + if (dlc >= 7) node.alarmExtraByte6 = data[6]; + if (dlc >= 8) node.alarmExtraByte7 = data[7]; + markRx(node, BCU_FUNC_ALARM); + break; + + default: // Reserve(0x10XX0004/0005 等)不解析 return false; } return true; diff --git a/src/pCCU/protocol/CanBms.h b/src/pCCU/protocol/CanBms.h index cb120c0..98e5182 100644 --- a/src/pCCU/protocol/CanBms.h +++ b/src/pCCU/protocol/CanBms.h @@ -6,58 +6,141 @@ namespace ccu { //============================================================================ -// CAN BMS 协议(锂电池 BMS 报文,经 USBCAN-8E-U/CANET 上 CAN 总线) -// 依据:docs/BMS_协议字段定义.xlsx +// 锂电池 BCU-MBMS CAN 协议(docs/04KT38电池BCU-MBMS通信(CAN)定义.docx) // // 数据来源:pCanBridge 透传的 MOOS 消息 // 变量名 CAN_0x%08X = CAN ID(扩展帧),m_sVal = 二进制数据域, // m_dfVal2 = 原始帧信息字节。本模块只负责按报文 ID 解析数据域字段。 // -// 报文(均为扩展帧,字段大端,起始字节相对 8 字节数据域): -// 0x10010000 总电压 u16@0 ÷10 V -// SOC u16@4 ÷10 % -// 故障码 u8 @6 ×1 -// 状态位 u8 @7 ×1 -// 0x10010005 最大电流限制 u16@0 ÷10 A -// 总电流 s16@2 ÷10 A(补码,放电为正;xlsx 表标注 -// 3 字节与其示例/实测冲突,按 2 字节实现, -// 详见 CanBms.cpp 注释) -// 最高单体电压 u16@4 ÷1000 V -// 0x10010006 总电压(校验) u16@4 ÷10 V +// 【节点地址】一个 MBMS 下最多挂 54 个 BCU,CAN ID 中间的 XX(01h~36h) +// 为 BCU 节点地址编号,其余位固定: +// 0x10XX00YY BCU 主动上报消息(YY=功能码 00/01/02/03/06/10) +// 0x10XX81FF MBMS 下发指令(继电器控制,pCCU 只收不发,不解析) +// +// 【上报报文】均为扩展帧,字段大端,BYTE1~8 对应数据域 byte0~7: +// 0x10XX0000 (200ms) 累加电压 u16@0 ÷10 V +// 回路电流 s16@2 ÷10-600 A(偏移 -600A,放电为正) +// SOC u16@4 ÷10 % +// 告警码 u8 @6(循环上报,协议未附码表,原样显示) +// 自检状态 u8 @7 +// 0x10XX0001 (200ms) 最高单体电压 u16@0 mV,编号 u8@2 +// 最低单体电压 u16@3 mV,编号 u8@5 +// 单体平均电压 u16@6 mV +// 0x10XX0002 (1000ms) 最高单体温度 s8@0(偏移 -40℃),编号 u8@1 +// 最低单体温度 s8@2(偏移 -40℃),编号 u8@3 +// 单体平均温度 s8@4(偏移 -40℃,协议文档写"偏移0" +// 有误:实测原始值减 40 后才落在最低~最高区间内) +// 0x10XX0003 (200ms) 正极继电器状态 u8@0(1 闭合 / 0 断开) +// 负极继电器状态 u8@1(1 闭合 / 0 断开) +// 0x10XX0006 (200ms) 正极绝缘阻抗 u16@0 kΩ +// 负极绝缘阻抗 u16@2 kΩ +// 正负极端口电压 u16@4 ÷10 V +// 正极继电器外侧电压 u16@6 ÷10 V +// 0x10XX0010 (200ms) byte0~5 告警位(bit 定义见附录1, +// kBcuAlarmTable,可经 bcuAlarmTexts() 取告警描述) +// 0x10XX0004/0005 Reserve(调试预留,不解析) //============================================================================ -// BMS 报文 ID(扩展帧 CAN ID) -enum CanBmsId : uint32_t { - CAN_BMS_ID_STATUS = 0x10010000, // 总电压 / SOC / 故障码 / 状态位 - CAN_BMS_ID_CURRENT = 0x10010005, // 最大电流限制 / 总电流 / 最高单体电压 - CAN_BMS_ID_VOLT_CHK = 0x10010006, // 总电压(校验) +// BCU 节点地址范围:01h~36h(1~54) +static const int kBcuAddrMin = 0x01; +static const int kBcuAddrMax = 0x36; +static const int kBcuNodeCount = kBcuAddrMax - kBcuAddrMin + 1; + +// BCU 上报报文功能码(CAN ID 低字节 YY) +enum BcuFunc : uint8_t { + BCU_FUNC_BASE = 0x00, // 0x10XX0000 电压 / 电流 / SOC / 告警码 / 自检 + BCU_FUNC_CELL_V = 0x01, // 0x10XX0001 单体电压 + BCU_FUNC_CELL_T = 0x02, // 0x10XX0002 单体温度 + BCU_FUNC_RELAY = 0x03, // 0x10XX0003 继电器状态 + BCU_FUNC_ISU = 0x06, // 0x10XX0006 绝缘阻值 / 端口电压 + BCU_FUNC_ALARM = 0x10, // 0x10XX0010 告警位(附录1) }; -// BMS 最新状态(各报文字段按 ID 部分更新,最终合成完整快照) -struct BmsStatusValue { - double totalVoltage = 0; // 总电压 V(0x10010000) - double soc = 0; // SOC %(0x10010000) - int faultCode = 0; // 故障码(0x10010000 @6) - int statusBits = 0; // 状态位(0x10010000 @7) - double maxCurrentLimit = 0; // 最大电流限制 A(0x10010005) - double totalCurrent = 0; // 总电流 A,放电为正(0x10010005,s24 补码) - double maxCellVoltage = 0; // 最高单体电压 V(0x10010005) - double totalVoltageChk = 0; // 总电压校验 V(0x10010006) - double lastRxTime = 0; // 最近收到任一 BMS 报文的时刻(MOOSTime) - bool valid = false; // 是否收到过 BMS 报文 -}; - -// 解析一帧 CAN 数据域;命中 BMS 报文 ID 返回 true 并把字段合并进 v -// (部分更新语义:每个 ID 只更新自己的字段)。 -// data 为数据域首指针(有效长度 dlc 字节),data/dlc 非法或非 BMS ID 返回 false。 -bool decodeCanBmsFrame(uint32_t canId, const uint8_t* data, int dlc, BmsStatusValue& v); - -// 是否为 BMS 报文 ID -inline bool isCanBmsId(uint32_t canId) { - return canId == CAN_BMS_ID_STATUS || canId == CAN_BMS_ID_CURRENT || - canId == CAN_BMS_ID_VOLT_CHK; +// 从 CAN ID 提取 BCU 节点地址(0x10XX00YY -> XX);非 BCU 报文格式返回 0 +inline uint8_t bcuAddrOf(uint32_t canId) { + if ((canId & 0xFF00FF00u) != 0x10000000u) return 0; + uint8_t addr = static_cast((canId >> 16) & 0xFF); + return (addr >= kBcuAddrMin && addr <= kBcuAddrMax) ? addr : 0; } +// 从 CAN ID 提取功能码(0x10XX00YY -> YY) +inline uint8_t bcuFuncOf(uint32_t canId) { + return static_cast(canId & 0xFF); +} + +// 是否为 BCU 主动上报报文 ID(0x10XX00YY,YY 为已定义功能码) +inline bool isCanBcuId(uint32_t canId) { + uint8_t addr = bcuAddrOf(canId); + if (!addr) return false; + switch (bcuFuncOf(canId)) { + case BCU_FUNC_BASE: + case BCU_FUNC_CELL_V: + case BCU_FUNC_CELL_T: + case BCU_FUNC_RELAY: + case BCU_FUNC_ISU: + case BCU_FUNC_ALARM: + return true; + default: + return false; + } +} + +// 单个 BCU 节点最新状态(各报文字段按功能码部分更新,最终合成完整快照) +struct BcuNodeStatus { + // 0x10XX0000 基本信息 + double totalVoltage = 0; // 累加电压 V + double current = 0; // 回路电流 A(放电为正,偏移 -600A 已折算) + double soc = 0; // SOC % + int alarmCode = 0; // 告警码(原始值,协议未附码表) + int selfCheck = 0; // 自检状态(原始值) + // 0x10XX0001 单体电压 + double maxCellVoltage = 0; // 最高单体电压 V + int maxCellVoltageNo = 0; // 最高单体电压编号 + double minCellVoltage = 0; // 最低单体电压 V + int minCellVoltageNo = 0; // 最低单体电压编号 + double avgCellVoltage = 0; // 单体平均电压 V + // 0x10XX0002 单体温度 + double maxCellTemp = 0; // 最高单体温度 ℃ + int maxCellTempNo = 0; // 最高单体温度编号 + double minCellTemp = 0; // 最低单体温度 ℃ + int minCellTempNo = 0; // 最低单体温度编号 + double avgCellTemp = 0; // 单体平均温度 ℃ + // 0x10XX0003 继电器(1 闭合 / 0 断开) + int posRelay = 0; + int negRelay = 0; + // 0x10XX0006 绝缘 / 端口电压 + double posInsulationKohm = 0; // 正极绝缘阻抗 kΩ + double negInsulationKohm = 0; // 负极绝缘阻抗 kΩ + double portVoltage = 0; // 正负极端口电压 V + double posRelayOuterVoltage = 0; // 正极继电器外侧电压 V + // 0x10XX0010 告警位(附录1,byte0~5) + uint8_t alarmBits[6] = {0, 0, 0, 0, 0, 0}; + // 0x10XX0010 附加字节(协议未详列,原样保留) + int alarmExtraByte6 = 0; + int alarmExtraByte7 = 0; + + // 元数据 + uint32_t rxMask = 0; // 收到过的功能码位图(bit = BcuFunc) + double lastRxTime = 0; // 最近收到该节点任一报文的时刻(MOOSTime) + bool valid = false; // 是否收到过该节点报文 +}; + +// 解析一帧 CAN 数据域;命中 BCU 上报报文返回 true,nodeAddr 为节点地址(1~54), +// 字段按功能码部分更新合并进 node。data/dlc 非法或非 BCU 报文返回 false。 +bool decodeCanBcuFrame(uint32_t canId, const uint8_t* data, int dlc, + uint8_t& nodeAddr, BcuNodeStatus& node); + +// 附录1:0x10XX0010 告警位定义表(byteIdx/bitIdx -> 告警描述),表尾以 byteIdx=0xFF 结束 +struct BcuAlarmDesc { + uint8_t byteIdx; + uint8_t bitIdx; + const char* text; +}; +extern const BcuAlarmDesc kBcuAlarmTable[]; + +// 收集节点当前置位的告警描述;返回条数(不超过 cap,texts 填描述指针) +int bcuAlarmTexts(const BcuNodeStatus& node, const char* texts[], int cap); + } // namespace ccu #endif // PCCU_CAN_BMS_H diff --git a/src/pCCU/store/DbStore.cpp b/src/pCCU/store/DbStore.cpp index 96e8b74..b42a131 100644 --- a/src/pCCU/store/DbStore.cpp +++ b/src/pCCU/store/DbStore.cpp @@ -65,7 +65,45 @@ bool DbStore::open() { ");")) return false; exec("CREATE INDEX IF NOT EXISTS idx_comm_log_time ON comm_log(time);"); - return prepareInsert(); + // bcu_node:锂电池 BCU 节点解析数据(每收到一帧 BMS 报文落一行, + // 记录该节点合并后的最新状态;BMS/CAN 协议字段固定故用结构化表) + if (!exec( + "CREATE TABLE IF NOT EXISTS bcu_node (" + " id INTEGER PRIMARY KEY AUTOINCREMENT," + " time REAL NOT NULL," + " addr INTEGER NOT NULL," // BCU 节点地址 1~54 + " func INTEGER NOT NULL," // 触发本行的报文功能码 + " total_voltage REAL," // 累加电压 V + " current REAL," // 回路电流 A(放电为正) + " soc REAL," // SOC % + " alarm_code INTEGER," // 告警码(原始值) + " self_check INTEGER," // 自检状态(原始值) + " max_cell_voltage REAL," // 最高单体电压 V + " max_cell_voltage_no INTEGER," + " min_cell_voltage REAL," // 最低单体电压 V + " min_cell_voltage_no INTEGER," + " avg_cell_voltage REAL," // 单体平均电压 V + " max_cell_temp REAL," // 最高单体温度 ℃ + " max_cell_temp_no INTEGER," + " min_cell_temp REAL," // 最低单体温度 ℃ + " min_cell_temp_no INTEGER," + " avg_cell_temp REAL," // 单体平均温度 ℃ + " pos_relay INTEGER," // 正极继电器 1闭合/0断开 + " neg_relay INTEGER," // 负极继电器 1闭合/0断开 + " pos_insulation REAL," // 正极绝缘阻抗 kΩ + " neg_insulation REAL," // 负极绝缘阻抗 kΩ + " port_voltage REAL," // 正负极端口电压 V + " pos_relay_outer_voltage REAL," // 正极继电器外侧电压 V + " alarm_bits TEXT," // 告警位 byte0~5 十六进制 + " alarm_extra_byte6 INTEGER," + " alarm_extra_byte7 INTEGER," + " rx_mask INTEGER," // 收到过的功能码位图 + " last_rx_time REAL" // 节点最近收帧时刻(MOOSTime) + ");")) return false; + exec("CREATE INDEX IF NOT EXISTS idx_bcu_node_time ON bcu_node(time);"); + exec("CREATE INDEX IF NOT EXISTS idx_bcu_node_addr ON bcu_node(addr);"); + + return prepareInsert() && prepareBcuInsert(); } bool DbStore::prepareInsert() { @@ -79,12 +117,33 @@ bool DbStore::prepareInsert() { return true; } +bool DbStore::prepareBcuInsert() { + const char* sql = + "INSERT INTO bcu_node (time, addr, func, total_voltage, current, soc, " + "alarm_code, self_check, " + "max_cell_voltage, max_cell_voltage_no, min_cell_voltage, min_cell_voltage_no, avg_cell_voltage, " + "max_cell_temp, max_cell_temp_no, min_cell_temp, min_cell_temp_no, avg_cell_temp, " + "pos_relay, neg_relay, pos_insulation, neg_insulation, port_voltage, pos_relay_outer_voltage, " + "alarm_bits, alarm_extra_byte6, alarm_extra_byte7, rx_mask, last_rx_time) " + "VALUES (?1,?2,?3,?4,?5,?6,?7,?8,?9,?10,?11,?12,?13,?14,?15,?16,?17,?18," + "?19,?20,?21,?22,?23,?24,?25,?26,?27,?28,?29);"; + if (sqlite3_prepare_v2(m_db, sql, -1, &m_stmtBcuInsert, nullptr) != SQLITE_OK) { + m_lastError = sqlite3_errmsg(m_db); + return false; + } + return true; +} + void DbStore::close() { std::lock_guard lock(m_mutex); if (m_stmtInsert) { sqlite3_finalize(m_stmtInsert); m_stmtInsert = nullptr; } + if (m_stmtBcuInsert) { + sqlite3_finalize(m_stmtBcuInsert); + m_stmtBcuInsert = nullptr; + } if (m_db) { sqlite3_close(m_db); m_db = nullptr; @@ -119,6 +178,55 @@ void DbStore::onRawFrame(int direction, uint16_t msgId, const std::string& link, } } +void DbStore::insertBcuNode(uint8_t addr, uint8_t func, const BcuNodeStatus& v) { + std::lock_guard lock(m_mutex); + if (!m_db || !m_stmtBcuInsert) return; + + char bits[16]; + std::snprintf(bits, sizeof(bits), "%02X%02X%02X%02X%02X%02X", + v.alarmBits[0], v.alarmBits[1], v.alarmBits[2], + v.alarmBits[3], v.alarmBits[4], v.alarmBits[5]); + + sqlite3_reset(m_stmtBcuInsert); + sqlite3_clear_bindings(m_stmtBcuInsert); + // 时间:与 comm_log 一致用 unix 时间(秒) + int i = 1; + sqlite3_bind_double(m_stmtBcuInsert, i++, static_cast(::time(nullptr))); + sqlite3_bind_int(m_stmtBcuInsert, i++, addr); + sqlite3_bind_int(m_stmtBcuInsert, i++, func); + sqlite3_bind_double(m_stmtBcuInsert, i++, v.totalVoltage); + sqlite3_bind_double(m_stmtBcuInsert, i++, v.current); + sqlite3_bind_double(m_stmtBcuInsert, i++, v.soc); + sqlite3_bind_int(m_stmtBcuInsert, i++, v.alarmCode); + sqlite3_bind_int(m_stmtBcuInsert, i++, v.selfCheck); + sqlite3_bind_double(m_stmtBcuInsert, i++, v.maxCellVoltage); + sqlite3_bind_int(m_stmtBcuInsert, i++, v.maxCellVoltageNo); + sqlite3_bind_double(m_stmtBcuInsert, i++, v.minCellVoltage); + sqlite3_bind_int(m_stmtBcuInsert, i++, v.minCellVoltageNo); + sqlite3_bind_double(m_stmtBcuInsert, i++, v.avgCellVoltage); + sqlite3_bind_double(m_stmtBcuInsert, i++, v.maxCellTemp); + sqlite3_bind_int(m_stmtBcuInsert, i++, v.maxCellTempNo); + sqlite3_bind_double(m_stmtBcuInsert, i++, v.minCellTemp); + sqlite3_bind_int(m_stmtBcuInsert, i++, v.minCellTempNo); + sqlite3_bind_double(m_stmtBcuInsert, i++, v.avgCellTemp); + sqlite3_bind_int(m_stmtBcuInsert, i++, v.posRelay); + sqlite3_bind_int(m_stmtBcuInsert, i++, v.negRelay); + sqlite3_bind_double(m_stmtBcuInsert, i++, v.posInsulationKohm); + sqlite3_bind_double(m_stmtBcuInsert, i++, v.negInsulationKohm); + sqlite3_bind_double(m_stmtBcuInsert, i++, v.portVoltage); + sqlite3_bind_double(m_stmtBcuInsert, i++, v.posRelayOuterVoltage); + sqlite3_bind_text(m_stmtBcuInsert, i++, bits, -1, SQLITE_TRANSIENT); + sqlite3_bind_int(m_stmtBcuInsert, i++, v.alarmExtraByte6); + sqlite3_bind_int(m_stmtBcuInsert, i++, v.alarmExtraByte7); + sqlite3_bind_int64(m_stmtBcuInsert, i++, static_cast(v.rxMask)); + sqlite3_bind_double(m_stmtBcuInsert, i++, v.lastRxTime); + + int rc = sqlite3_step(m_stmtBcuInsert); + if (rc != SQLITE_DONE) { + m_lastError = sqlite3_errmsg(m_db); + } +} + std::vector DbStore::queryRecent(const std::string& link, int direction, uint16_t msgId, int limit) { std::lock_guard lock(m_mutex); @@ -175,4 +283,16 @@ long long DbStore::count() const { return n; } +long long DbStore::countBcu() const { + std::lock_guard lock(m_mutex); + if (!m_db) return 0; + sqlite3_stmt* stmt = nullptr; + if (sqlite3_prepare_v2(m_db, "SELECT COUNT(*) FROM bcu_node;", -1, &stmt, nullptr) != SQLITE_OK) + return 0; + long long n = 0; + if (sqlite3_step(stmt) == SQLITE_ROW) n = sqlite3_column_int64(stmt, 0); + sqlite3_finalize(stmt); + return n; +} + } // namespace ccu \ No newline at end of file diff --git a/src/pCCU/store/DbStore.h b/src/pCCU/store/DbStore.h index 8291426..1016ff6 100644 --- a/src/pCCU/store/DbStore.h +++ b/src/pCCU/store/DbStore.h @@ -6,6 +6,7 @@ #include #include #include "../comm/LinkManager.h" +#include "../protocol/CanBms.h" struct sqlite3; struct sqlite3_stmt; @@ -19,6 +20,9 @@ namespace ccu { // - 以“原始帧日志”为主表(comm_log),收发全部数据按帧落库, // 协议字段变化不会导致建表失败。 // - 提供按 link / direction / msg_id 的查询接口供网页展示。 +// - 锂电池 BMS/CAN 协议字段固定,另设解析数据表 bcu_node: +// 每收到一帧 BMS 报文,把该 BCU 节点的合成状态落一行 +// (电压/电流/SOC/单体电压温度/继电器/绝缘/告警位)。 // 复用仓库内 src/pPowerManger/sqlit3/sqlite3.c 与 sqlite3.h。 //============================================================================ @@ -48,19 +52,26 @@ public: void onRawFrame(int direction, uint16_t msgId, const std::string& link, const std::vector& data, bool checksumOk) override; + // 锂电池解析数据落库(bcu_node 表):addr=节点地址(1~54), + // func=本次触发落库的 BCU 报文功能码,v=合并后的节点最新状态 + void insertBcuNode(uint8_t addr, uint8_t func, const BcuNodeStatus& v); + // 查询最近 N 条记录(可限定链路/方向/消息id;limit<=0 表示默认 100) std::vector queryRecent(const std::string& link, int direction, uint16_t msgId, int limit); long long count() const; + long long countBcu() const; private: bool exec(const char* sql); bool prepareInsert(); + bool prepareBcuInsert(); std::string m_dbPath; sqlite3* m_db = nullptr; sqlite3_stmt* m_stmtInsert = nullptr; + sqlite3_stmt* m_stmtBcuInsert = nullptr; mutable std::mutex m_mutex; std::string m_lastError; }; diff --git a/src/pCCU/web/pages/index.h b/src/pCCU/web/pages/index.h index aa2c999..78ecef2 100644 --- a/src/pCCU/web/pages/index.h +++ b/src/pCCU/web/pages/index.h @@ -65,6 +65,9 @@ th{color:var(--dim);font-weight:500;} .lvl4{background:rgba(248,81,73,.38);color:#ff7b72;border:1px solid #f85149;} .fc-bad{color:#f85149;font-weight:700;background:rgba(248,81,73,.12);padding:1px 6px;border-radius:4px;} .fc-ok{color:#3fb950;} +/* 卡片内分组小标题 */ +.sub{font-size:11px;color:#79c0ff;margin:10px 0 2px;border-bottom:1px solid #22304a;padding-bottom:2px;} +.sub:first-child{margin-top:0;} @@ -97,6 +100,7 @@ let activeTab = 'fcStatus'; function dot(ok){ return ok ? 'dot-ok' : (ok === undefined ? 'dot-warn' : 'dot-bad'); } function row(k, v){ return '

'+k+''+v+'
'; } +function sub(t){ return '
'+t+'
'; } function hex(v){ return '0x' + (v & 0xFF).toString(16).toUpperCase().padStart(2,'0'); } function hex16(v){ return '0x' + (v & 0xFFFF).toString(16).toUpperCase().padStart(4,'0'); } function hex32(v){ return '0x' + (v >>> 0).toString(16).toUpperCase().padStart(8,'0'); } @@ -128,16 +132,32 @@ function statusText(s){ } function flameText(f){ return {0:'无效',1:'火焰报警',2:'探测器故障'}[f] || ('未知('+hex(f)+')'); } -//------------------ 锂电池 BMS(CAN) 解析 ------------------ -// 报文定义见 docs/BMS_协议字段定义.xlsx: -// 0x10010000 总电压/SOC/故障码/状态位 -// 0x10010005 最大电流限制/总电流/最高单体电压 -// 0x10010006 总电压(校验) -// 故障码高亮:0 显示绿色正常,非 0 显示红色 -function bmsFault(c){ return c===0 ? ''+c+' 正常' - : ''+c+''; } -// 数据新鲜度(10s 内视为在线) -function bmsOnline(t){ return (Date.now()/1000 - t) < 10; } +//------------------ 锂电池 BCU 节点(CAN) 解析 ------------------ +// 报文定义见 docs/04KT38电池BCU-MBMS通信(CAN)定义.docx: +// 0x10XX0000 累加电压/回路电流/SOC/告警码/自检状态 +// 0x10XX0001 单体电压 0x10XX0002 单体温度 0x10XX0003 继电器 +// 0x10XX0006 绝缘阻值/端口电压 0x10XX0010 告警位(附录1) +// XX(01h~36h) 为 BCU 节点地址:同一节点的全部报文归入同一张卡片; +// 告警含义由服务器端按附录1 解析为中文列表(alarms 字段) +function pad2(v){ return (v & 0xFF).toString(16).toUpperCase().padStart(2,'0'); } +function relayText(v){ return v===1 ? '闭合' : '断开'; } +// 告警码(0x10XX0000 BYTE7,协议未附码表,显示原始值) +function bmsFault(c){ return c===0 ? ''+hex(c)+'' + : ''+hex(c)+''; } +// 数据新鲜度:10s 内视为在线。优先用后端算好的 age(距最后收到该节点 +// 报文的秒数,不依赖浏览器与板卡时钟同步),无 age 时退回 lastRx 比对本地时钟 +function bmsOnline(n){ + if(!n) return undefined; + if(typeof n.age === 'number') return n.age < 10; + if(typeof n.lastRx === 'number') return (Date.now()/1000 - n.lastRx) < 10; + return undefined; +} +// 最后更新时间文本(a:距最后收到报文的秒数) +function ageText(a){ + if(a < 90) return a.toFixed(1)+' 秒前'; + if(a < 3600) return Math.floor(a/60)+' 分 '+Math.floor(a%60)+' 秒前'; + return Math.floor(a/3600)+' 时 '+Math.floor((a%3600)/60)+' 分前'; +} // 带解析的值:hex 码 + 括号解析 function parsed(v, text){ return hex(v)+' ('+text+')'; } // 故障码高亮:0 显示绿色正常,非 0 显示红色 @@ -303,7 +323,10 @@ function linkCard(s){ '收:'+l.fc.rx+' 发:'+l.fc.tx+' 误:'+l.fc.err); h+=row('PM 链路', '收:'+l.pm.rx+' 发:'+l.pm.tx+' 误:'+l.pm.err); - h+=row('CAN 链路 (pCanBridge)', 'CAN帧:'+s.canFrameCount+' BMS帧:'+s.bmsStatusCount); h+=row('FC 状态接收计数', s.fcStatusCount); h+=row('PM 指令接收计数', s.pmControlCount); @@ -373,22 +396,59 @@ function pmFbCard(d){ return card('设定结果', h); } -//------------------ 锂电池 BMS(CAN) 卡片 ------------------ +//------------------ 锂电池 BCU 节点(CAN) 卡片 ------------------ +// 每个节点(CAN ID 0x10XX00YY 中的 XX)一张卡片, +// 同一节点的 0000/0001/0002/0003/0006/0010 各报文归并在卡片内分组展示 function bmsCard(d){ - if(!d || !d.valid) return card('锂电池BMS (CAN)', + const nodes = (d && d.length) ? d : []; + if(!nodes.length) return card('锂电池BMS (CAN)', '
数据状态等待报文...
'); - let h=''; - h+=row('总电压', d.totalVoltage.toFixed(1)+' V'); - h+=row('总电流', d.totalCurrent.toFixed(1)+' A'); - h+=row('SOC', d.soc.toFixed(1)+' %'); - h+=row('最大电流限制', d.maxCurrentLimit.toFixed(1)+' A'); - h+=row('最高单体电压', d.maxCellVoltage.toFixed(3)+' V'); - h+=row('总电压(校验帧)', d.totalVoltageChk.toFixed(1)+' V'); - h+=row('故障码', bmsFault(d.faultCode)); - h+=row('状态位', hex(d.statusBits)); - h+=row('数据状态', bmsOnline(d.lastRx) - ? '在线' : '超时'); - return card('锂电池BMS (CAN)', h); + let html=''; + for(const n of nodes){ + const addrTxt = 'BCU节点 '+pad2(n.addr)+'h (#'+n.addr+')'; + let h=''; + // 概要(0x10XX0000) + h+=sub('概要 0x10'+pad2(n.addr)+'0000'); + h+=row('累加电压', n.totalVoltage.toFixed(1)+' V'); + h+=row('回路电流', n.current.toFixed(1)+' A'); + h+=row('SOC', n.soc.toFixed(1)+' %'); + h+=row('告警码', bmsFault(n.alarmCode)); + h+=row('自检状态', hex(n.selfCheck)); + // 单体电压(0x10XX0001) + h+=sub('单体电压 0x10'+pad2(n.addr)+'0001'); + h+=row('最高单体电压', n.maxCellVoltage.toFixed(3)+' V (#'+n.maxCellVoltageNo+')'); + h+=row('最低单体电压', n.minCellVoltage.toFixed(3)+' V (#'+n.minCellVoltageNo+')'); + h+=row('单体平均电压', n.avgCellVoltage.toFixed(3)+' V'); + // 单体温度(0x10XX0002) + h+=sub('单体温度 0x10'+pad2(n.addr)+'0002'); + h+=row('最高单体温度', n.maxCellTemp.toFixed(0)+' ℃ (#'+n.maxCellTempNo+')'); + h+=row('最低单体温度', n.minCellTemp.toFixed(0)+' ℃ (#'+n.minCellTempNo+')'); + h+=row('单体平均温度', n.avgCellTemp.toFixed(0)+' ℃'); + // 继电器(0x10XX0003) + h+=sub('继电器 0x10'+pad2(n.addr)+'0003'); + h+=row('正极继电器', relayText(n.posRelay)); + h+=row('负极继电器', relayText(n.negRelay)); + // 绝缘/端口电压(0x10XX0006) + h+=sub('绝缘/端口 0x10'+pad2(n.addr)+'0006'); + h+=row('正极绝缘阻抗', n.posInsulationKohm.toFixed(0)+' kΩ'); + h+=row('负极绝缘阻抗', n.negInsulationKohm.toFixed(0)+' kΩ'); + h+=row('正负极端口电压', n.portVoltage.toFixed(1)+' V'); + h+=row('正极继电器外侧电压', n.posRelayOuterVoltage.toFixed(1)+' V'); + // 告警(0x10XX0010,附录1 解析) + h+=sub('告警明细 0x10'+pad2(n.addr)+'0010'); + if(n.alarms && n.alarms.length){ + h+=row('告警(' + n.alarms.length + '条)', + n.alarms.map(function(a){ return ''+a+''; }).join('
')); + }else{ + h+=row('告警', '无'); + } + // 最后更新时间(判断该节点消息是否持续正常发送) + const online = bmsOnline(n); + h+=row('最后更新', (online ? '' : '') + + ageText(n.age || 0) + (online ? ' (在线)' : ' (超时)') + ''); + html+=card(addrTxt, h); + } + return html; } function pmStatusCard(d){ @@ -482,12 +542,16 @@ function render(snap){ +tankCard(snap.fc)+cabinCard(snap.fc)+'', pmCmd: pageHeader(0x0001,'PM操控指令','PM→CCU')+'
'+cmdCard(snap.pmCmd)+'
', pmParam: pageHeader(0x0002,'PM参数设定','PM→CCU')+'
'+pmParamCard(snap.pmParam)+'
', - // 锂电池 BMS(CAN 总线,经 pCanBridge 透传) + // 锂电池 BCU 节点(CAN 总线,经 pCanBridge 透传,按节点分组展示) bms: '
'+bmsCard(snap.bms)+ '

报文来源 (CAN ID)

'+ - row('0x10010000','总电压 / SOC / 故障码 / 状态位')+ - row('0x10010005','最大电流限制 / 总电流 / 最高单体电压')+ - row('0x10010006','总电压(校验)')+ + row('0x10XX0000','累加电压 / 回路电流 / SOC / 告警码 / 自检状态')+ + row('0x10XX0001','最高/最低/平均单体电压及编号')+ + row('0x10XX0002','最高/最低/平均单体温度及编号')+ + row('0x10XX0003','正/负极继电器状态')+ + row('0x10XX0006','正/负极绝缘阻抗 / 端口电压 / 继电器外侧电压')+ + row('0x10XX0010','告警位(附录1,按位解析显示告警含义)')+ + row('XX','BCU 节点地址 01h~36h,同一节点的报文归入同一卡片')+ row('订阅消息','pCanBridge 发布的 CAN_0x* 二进制报文')+'
', fcCmd: pageHeader(0x0001,'FC控制指令','CCU→FC')+'
'+fcCmdCard(snap.fcCmd)+'
', // 0x0004 PM 状态报文(CCU→PM):含锂电池/应急电池数据 diff --git a/src/pPowerManger/LowerCommManager.cpp b/src/pPowerManger/LowerCommManager.cpp index f6f4ea7..e6d343f 100644 --- a/src/pPowerManger/LowerCommManager.cpp +++ b/src/pPowerManger/LowerCommManager.cpp @@ -75,6 +75,16 @@ bool LowerCommManager::initUdpComm(){ return true; } +void LowerCommManager::setLocalPort(long port){ + if (port <= 0 || port == m_port) return; + m_port = port; + if (m_udpComm && m_udpComm->udpScoket) { + // 套接字构造时即记录接收端口,改端口须重建(此时尚未 bind,重建安全) + delete m_udpComm->udpScoket; + m_udpComm->udpScoket = new XPCUdpSocket(m_port); + } +} + void LowerCommManager::setCcuAddress(const std::string& host, long port){ m_ccuHost = host; m_ccuPort = port; diff --git a/src/pPowerManger/LowerCommManager.h b/src/pPowerManger/LowerCommManager.h index eb24c4c..8b010cc 100644 --- a/src/pPowerManger/LowerCommManager.h +++ b/src/pPowerManger/LowerCommManager.h @@ -35,6 +35,9 @@ public: // 设置 CCU 地址(moos 配置读取后调用;须在监听/发送线程启动前调用) void setCcuAddress(const std::string& host, long port); + // 设置本地输入端口(CCU -> pPowerManger,moos 配置读取后调用;须在 bind/监听线程启动前调用) + void setLocalPort(long port); + // 设置原始帧日志回调(转发给 udpComm,可为空) void setCommLogger(ICommLogger* logger); diff --git a/src/pPowerManger/PowerManger.cpp b/src/pPowerManger/PowerManger.cpp index 5a5e031..34be737 100644 --- a/src/pPowerManger/PowerManger.cpp +++ b/src/pPowerManger/PowerManger.cpp @@ -51,6 +51,8 @@ PowerManger::PowerManger() // CCU 地址默认值,可在 moos 文件中用 ccuhost/ccuport 覆盖 m_ccuHost = CCUHOST; m_ccuPort = CCUPORT; + // 本地输入端口(接收 CCU 数据)默认值,可在 moos 文件中用 iport 覆盖 + m_localPort = IPORT; m_pmCurrentState = {}; m_currentDisBreakerState = {}; @@ -69,7 +71,7 @@ PowerManger::PowerManger() //初始化下位机通信 m_lowerCommManager = new LowerCommManager(this,IPORT,m_ccuPort,m_ccuHost); - m_lowerCommManager->initUdpComm(); + // UDP 端口 bind 延迟到 OnStartUp 读取配置后进行,保证 iport/ccuhost/ccuport 配置生效 //初始化上位机通信 m_upperCommManager = new UpperCommManager(this); @@ -195,6 +197,7 @@ bool PowerManger::OnStartUp() std::string logPath; // 日志文件路径,不配置则默认当前目录 pPowerManger.log std::string ccuHost; // CCU 地址,不配置则沿用默认值 long ccuPort = 0; // CCU 端口,不配置则沿用默认值 + long localPort = 0; // 本地输入端口(CCU->pPowerManger),不配置则沿用默认值 STRING_LIST::iterator p; for(p=sParams.begin(); p!=sParams.end(); p++) { @@ -226,6 +229,10 @@ bool PowerManger::OnStartUp() ccuPort = atoi(value.c_str()); handled = true; } + else if(param == "iport") { + localPort = atoi(value.c_str()); + handled = true; + } if(!handled) reportUnhandledConfigWarning(orig); @@ -251,6 +258,17 @@ bool PowerManger::OnStartUp() m_lowerCommManager->setCcuAddress(m_ccuHost, m_ccuPort); LOG_F(INFO, "CCU 地址: %s:%ld", m_ccuHost.c_str(), m_ccuPort); + // 应用 moos 文件中的本地输入端口配置(接收 CCU 数据),须在 bind 前生效 + if (localPort > 0) m_localPort = localPort; + m_lowerCommManager->setLocalPort(m_localPort); + LOG_F(INFO, "本地输入端口(CCU->pPowerManger): %ld", m_localPort); + + // 配置生效后再 bind 本地 UDP 输入端口 + if (!m_lowerCommManager->initUdpComm()) { + LOG_F(ERROR, "UDP bind failed on port %ld", m_localPort); + reportRunWarning("UDP bind failed on local input port"); + } + // 注入原始帧日志回调(RX/TX 双向落库) m_lowerCommManager->setCommLogger(m_db); // 数据库就绪后再启动下位机监听线程 diff --git a/src/pPowerManger/PowerManger.h b/src/pPowerManger/PowerManger.h index aa45bf4..c8087b5 100644 --- a/src/pPowerManger/PowerManger.h +++ b/src/pPowerManger/PowerManger.h @@ -125,6 +125,7 @@ class PowerManger : public AppCastingMOOSApp bool isDeviceCmdEmpty() const; //===========================CONFIG======================================== long m_lPort; + long m_localPort; // 本地输入端口(CCU->pPowerManger),moos 配置项 iport std::string m_ccuHost; // CCU 地址,moos 配置项 ccuhost long m_ccuPort; // CCU 端口,moos 配置项 ccuport unsigned int m_nReceiveBufferSizeKB; diff --git a/src/pPowerManger/pPowerManger.moos b/src/pPowerManger/pPowerManger.moos index 8a8f717..a0d1e83 100644 --- a/src/pPowerManger/pPowerManger.moos +++ b/src/pPowerManger/pPowerManger.moos @@ -11,4 +11,6 @@ ProcessConfig = pPowerManger // CCU 地址;不配置则默认 127.0.0.1:7000 // ccuhost = 127.0.0.1 // ccuport = 7000 + // 本地输入端口(接收 CCU 数据);不配置则默认 5001 + // iport = 5001 } \ No newline at end of file diff --git a/test/pccu/pccuTest.cpp b/test/pccu/pccuTest.cpp index eb5a5c7..c50f31b 100644 --- a/test/pccu/pccuTest.cpp +++ b/test/pccu/pccuTest.cpp @@ -289,50 +289,105 @@ static void testDbStore() { } //-------------------------------------------------------------------------- -// 9. CAN BMS 报文解码(docs/BMS_协议字段定义.xlsx,测试向量为实车抓包数据) +// 9. CAN BCU 报文解码(docs/04KT38电池BCU-MBMS通信(CAN)定义.docx, +// 测试向量为实车抓包数据与协议文档示例值) static void testCanBmsDecode() { - BmsStatusValue v; + uint8_t addr = 0; - // 0x10010000:14 da 17 70 00 c9 31 01(实车抓包) - // 总电压 0x14DA=5338 -> 533.8V;SOC 0x00C9=201 -> 20.1% - // 故障码 0x31=49;状态位 0x01 + // 0x10010000(节点01,实车抓包):14 da 17 70 00 c9 31 01 + // 累加电压 0x14DA=5338 -> 533.8V;回路电流 0x1770=6000 -> 600.0-600=0.0A + // SOC 0x00C9=201 -> 20.1%;告警码 0x31;自检状态 0x01 + BcuNodeStatus n1; const uint8_t d0[8] = {0x14,0xDA,0x17,0x70,0x00,0xC9,0x31,0x01}; - CHECK(decodeCanBmsFrame(0x10010000, d0, 8, v)); - CHECK(v.totalVoltage == 533.8); - CHECK(v.soc == 20.1); - CHECK(v.faultCode == 0x31); - CHECK(v.statusBits == 0x01); + CHECK(decodeCanBcuFrame(0x10010000, d0, 8, addr, n1)); + CHECK(addr == 1); + CHECK(n1.totalVoltage == 533.8); + CHECK(n1.current == 0.0); + CHECK(n1.soc == 20.1); + CHECK(n1.alarmCode == 0x31); + CHECK(n1.selfCheck == 0x01); - // 文档示例帧:14 d9 => 533.7V - const uint8_t d0doc[8] = {0x14,0xD9,0x17,0x70,0x00,0xC9,0x31,0x01}; - CHECK(decodeCanBmsFrame(0x10010000, d0doc, 8, v)); - CHECK(v.totalVoltage == 533.7); + // 回路电流:充电 -25A -> raw 0x1676=5750 -> 575.0-600=-25.0A + const uint8_t d0n[8] = {0x14,0xDA,0x16,0x76,0x00,0xC9,0x31,0x00}; + decodeCanBcuFrame(0x10010000, d0n, 8, addr, n1); + CHECK(n1.current == -25.0); - // 0x10010005:07 d0 00 00 0e a8 00 00 - // 最大电流限制 0x07D0=2000 -> 200.0A;总电流 00 00 00 -> 0.0A - // 最高单体电压 0x0EA8=3752 -> 3.752V - const uint8_t d5[8] = {0x07,0xD0,0x00,0x00,0x0E,0xA8,0x00,0x00}; - CHECK(decodeCanBmsFrame(0x10010005, d5, 8, v)); - CHECK(v.maxCurrentLimit == 200.0); - CHECK(v.totalCurrent == 0.0); - CHECK(v.maxCellVoltage == 3.752); + // 0x10010001(节点01)单体电压:0e a8 05 0e a0 03 0e a4 + // 最高 0x0EA8=3752 -> 3.752V (#5);最低 0x0EA0=3744 -> 3.744V (#3) + // 平均 0x0EA4=3748 -> 3.748V;部分更新,概要字段保留 + const uint8_t dv[8] = {0x0E,0xA8,0x05,0x0E,0xA0,0x03,0x0E,0xA4}; + CHECK(decodeCanBcuFrame(0x10010001, dv, 8, addr, n1)); + CHECK(n1.maxCellVoltage == 3.752); + CHECK(n1.maxCellVoltageNo == 5); + CHECK(n1.minCellVoltage == 3.744); + CHECK(n1.minCellVoltageNo == 3); + CHECK(n1.avgCellVoltage == 3.748); + CHECK(n1.totalVoltage == 533.8); // 同节点部分更新,前一帧字段不被清除 + CHECK(n1.rxMask == ((1u << BCU_FUNC_BASE) | (1u << BCU_FUNC_CELL_V))); - // 总电流负数:s16 补码 FF 06 = -250 -> -25.0A(xlsx 负数示例) - const uint8_t d5n[8] = {0x07,0xD0,0xFF,0x06,0x0E,0xA8,0x00,0x00}; - CHECK(decodeCanBmsFrame(0x10010005, d5n, 8, v)); - CHECK(v.totalCurrent == -25.0); + // 0x10010002(节点01)单体温度:3c 01 2d 02 33 + // 最高 0x3C=60-40=20℃ (#1);最低 0x2D=45-40=5℃ (#2);平均 0x33=51-40=11℃ + // (实测固件平均温度与最高/最低一致均带 -40℃ 偏移,协议文档"偏移0"有误: + // 实车 0x10020002 原始 68/69 减 40 后为 28/29℃,落在最低28~最高30区间内) + const uint8_t dt[8] = {0x3C,0x01,0x2D,0x02,0x33,0x00,0x00,0x00}; + CHECK(decodeCanBcuFrame(0x10010002, dt, 8, addr, n1)); + CHECK(n1.maxCellTemp == 20.0); + CHECK(n1.maxCellTempNo == 1); + CHECK(n1.minCellTemp == 5.0); + CHECK(n1.minCellTempNo == 2); + CHECK(n1.avgCellTemp == 11.0); - // 0x10010006:07 d0 07 d0 14 da 00 00 -> 总电压校验 0x14DA=533.8V - const uint8_t d6[8] = {0x07,0xD0,0x07,0xD0,0x14,0xDA,0x00,0x00}; - CHECK(decodeCanBmsFrame(0x10010006, d6, 8, v)); - CHECK(v.totalVoltageChk == 533.8); + // 0x10010003(节点01)继电器:01 01 -> 正/负极均闭合 + const uint8_t dr[8] = {0x01,0x01,0x00,0x00,0x00,0x00,0x00,0x00}; + CHECK(decodeCanBcuFrame(0x10010003, dr, 8, addr, n1)); + CHECK(n1.posRelay == 1 && n1.negRelay == 1); - // 非 BMS 报文 ID 不命中 + // 0x10010006(节点01,实车抓包):07 d0 07 d0 14 da 00 00 + // 正/负极绝缘 2000kΩ;端口电压 0x14DA -> 533.8V;外侧电压 0.0V + const uint8_t di[8] = {0x07,0xD0,0x07,0xD0,0x14,0xDA,0x00,0x00}; + CHECK(decodeCanBcuFrame(0x10010006, di, 8, addr, n1)); + CHECK(n1.posInsulationKohm == 2000.0); + CHECK(n1.negInsulationKohm == 2000.0); + CHECK(n1.portVoltage == 533.8); + CHECK(n1.posRelayOuterVoltage == 0.0); + + // 0x10010010(节点01)告警位:byte0=0x01 -> BCU绝缘2级;byte1=0x04 -> 烟雾报警1级 + const uint8_t da[8] = {0x01,0x04,0x00,0x00,0x00,0x00,0x00,0x00}; + CHECK(decodeCanBcuFrame(0x10010010, da, 8, addr, n1)); + CHECK(n1.alarmBits[0] == 0x01 && n1.alarmBits[1] == 0x04); + const char* texts[8] = {nullptr}; + int cnt = bcuAlarmTexts(n1, texts, 8); + CHECK(cnt == 2); + CHECK(cnt > 0 && std::string(texts[0]) == "BCU绝缘2级"); + CHECK(cnt > 1 && std::string(texts[1]) == "BCU烟雾报警1级"); + // 无告警 + const uint8_t dz[8] = {0,0,0,0,0,0,0,0}; + decodeCanBcuFrame(0x10010010, dz, 8, addr, n1); + CHECK(bcuAlarmTexts(n1, texts, 8) == 0); + + // 节点分离:0x10020000(节点02)解析到独立状态 + BcuNodeStatus n2; + const uint8_t d02[8] = {0x0D,0x40,0x17,0x70,0x01,0x2C,0x00,0x00}; + CHECK(decodeCanBcuFrame(0x10020000, d02, 8, addr, n2)); + CHECK(addr == 2); + CHECK(n2.totalVoltage == 339.2); + CHECK(n2.soc == 30.0); + CHECK(n1.alarmCode == 0x31); // 节点01 快照不受节点02 帧影响 + + // 非 BCU 报文 / 预留功能码 / 地址越界 / 下发指令 均不命中 const uint8_t dx[8] = {0,0,0,0,0,0,0,0}; - CHECK(!decodeCanBmsFrame(0x10010035, dx, 8, v)); - CHECK(!decodeCanBmsFrame(0x10010000, nullptr, 0, v)); - CHECK(isCanBmsId(0x10010000) && isCanBmsId(0x10010005) && isCanBmsId(0x10010006)); - CHECK(!isCanBmsId(0x10010001)); + CHECK(!decodeCanBcuFrame(0x10010035, dx, 8, addr, n1)); // 未定义功能码 + CHECK(!decodeCanBcuFrame(0x10010004, dx, 8, addr, n1)); // Reserve + CHECK(!decodeCanBcuFrame(0x10010005, dx, 8, addr, n1)); // Reserve + CHECK(!decodeCanBcuFrame(0x10370000, dx, 8, addr, n1)); // 地址 0x37 越界 + CHECK(!decodeCanBcuFrame(0x10000000, dx, 8, addr, n1)); // 地址 0 非法 + CHECK(!decodeCanBcuFrame(0x100181FF, dx, 8, addr, n1)); // MBMS 下发指令 + CHECK(!decodeCanBcuFrame(0x10010000, nullptr, 0, addr, n1)); + CHECK(isCanBcuId(0x10010000) && isCanBcuId(0x10010001) && + isCanBcuId(0x10010002) && isCanBcuId(0x10010003) && + isCanBcuId(0x10010006) && isCanBcuId(0x10010010)); + CHECK(!isCanBcuId(0x10010004) && !isCanBcuId(0x10010005) && + !isCanBcuId(0x100181FF) && !isCanBcuId(0x10370000)); } //--------------------------------------------------------------------------