EMS 代码检索入口
下次想问「某某功能在哪实现」,从这里开始。 本目录是对
docs/knowledge/代码解析/下 191 份逐文件分析文档的反查层。
一、三种查法(按推荐顺序)
1. 一句话查功能 → 直接问 AI
帮我找削峰填谷在哪实现
AI 会读本目录的表格定位。你不需要记路径。
2. 自己用检索脚本(最快)
在本目录下执行:
node 工具/查找.js -F 电池加热 # ⭐首选:功能 → 函数,直接给 定义文件:行号(含 .h 声明行号)
node 工具/查找.js 削峰填谷 # 综合查:功能定位 + 功能索引 + 函数 + 类型宏 + 全局变量
node 工具/查找.js -g 并机地址 # 只查功能反查表(口语问法也能命中)
node 工具/查找.js -f bat_heat # 只查函数名(给 文件:行号)
node 工具/查找.js -t SOC_CALIBRATION # 只查类型/宏
node 工具/查找.js -v g_t_logic_info # 只查全局变量
node 工具/查找.js -d 超时 # 全文搜所有分析文档(最全但慢)
node 工具/查找.js -p midware/bms/bms.c # 由源文件路径得到文档路径
匹配规则(2026-10-15 起):查询会被切成「整串 + 空白分词 + ASCII 词 + 中文二元组」, 命中词按 idf 加权(语料里越罕见的词权重越高)排序,不再要求整串精确包含。 所以
-g 并机地址现在能正确返回「并机 SCI 通信常量(主机/从机地址)」这类行 —— 以前它一条都搜不到,因为索引里没有「并机地址」这个连续子串。 中英混合写法(SOC校准、CAN并机、DRM需求响应)也能正确拆分,can不会误命中cancel。 若最佳结果覆盖不足你问题的三成,工具会明确说"未找到有效匹配",不会拿噪音糊弄你。
2.1 「功能定位表」是什么
功能定位.tsv 由 工具/生成功能定位.js 生成,是本目录最有用的产物:
把 7 份功能索引的 3195 条(功能问法,符号)解析出来,交叉符号索引补上 定义文件:行号,
并把功能索引里的章节标题一并留档(否则「DRM需求响应」这类问法会命不中 DRM 的行)。
源码改动后要重跑:
node 工具/生成功能定位.js # 不要忘了这个,-F 模式依赖它
关键词不区分大小写,多个关键词空格分隔表示与。
3. 直接翻表
| 想知道什么 | 看哪个文件 |
|---|---|
| 某功能由哪些函数实现 | 功能索引/*.md(第一列写的是"你会怎么问") |
| 某函数在哪个文件第几行 | 函数索引.tsv(2364 条) |
| 某宏/结构体/枚举在哪定义 | 类型与宏索引.tsv(2787 条) |
| 某全局变量在哪定义、什么类型 | 全局变量索引.tsv(505 条) |
| 某文件的整体职责、状态机、协议帧 | ../<路径>/<文件名>.md |
二、顶层路由表:先想清楚功能属于哪一块
| 你想找的东西 | 去这个功能索引 |
|---|---|
| 功率怎么分配、充放电限值、调度策略 | logic.md |
| 峰谷套利(削峰填谷)、时间段充放电、强制充电 | logic.md |
| AC 侧 / DC 侧功率控制、三相不平衡、并网取电限值 | logic.md |
| 英国 G100、德国 §14a EnWG、奥地利 WLV | logic.md |
| 澳洲 CSIP-AUS / DNSP 调度 / ramp 斜坡 | logic.md |
| 调频 FCAS/FFR、云端功率调度指令 | logic.md + net.md |
| SOC 校准、智能化控制、光伏优先 | logic.md |
| 油机(柴油发电机)启停 | logic.md |
| Backup 后备、UPS、EPO 紧急停机 | logic.md + midware-platform.md |
| 安装接线自检 | logic.md |
| 与云端 EMS 服务器通信、上报报文、下行指令 | net.md |
| 固件升级总流程(EMS/逆变器/电表/BMS/桩/AFCI) | net.md |
| 各设备升级的适配层与分包重试 | net.md + midware-device.md |
| 某厂商逆变器协议、寄存器表、帧格式 | midware-inverter.md |
| 逆变器安规参数下发、CEI021 自检、曲线(P-V/Q-V 等) | midware-inverter.md |
| 并机(主机/从机、CAN/SCI 通道) | midware-inverter.md |
| 逆变器通信超时降级、通信丢失判定 | midware-inverter.md |
| 电表型号识别、电参量、相序自适应、CT | midware-device.md |
| BMS 协议、电池加热、CAN 下行指令 | midware-device.md |
| 充电桩(一代 EVC / 二代 EVC-II) | midware-device.md |
| AFCI 电弧保护、故障日志上传 | midware-device.md |
| 备电盒 BackupBox、油机控制器读数 | midware-device.md |
| Modbus RTU/TCP 从站、寄存器地址映射 | midware-platform.md |
| SunSpec 协议 | midware-platform.md |
| 干接点继电器、DRM 需求响应 | midware-platform.md |
| 以太网 W5500 通道、DHCP/DNS/Socket | midware-platform.md |
| 无线通讯棒 WIFI/4G、P1 抄表 | midware-platform.md |
| 电量统计、RTC 系统时间 | midware-platform.md |
| 产线测试 ATE、调试通道 | midware-platform.md |
| AES / MD5 / 自研加密、CRC、JSON | common-data-user.md |
| HEX / S19 固件文件解析 | common-data-user.md |
| 串口在线调试 USMART | common-data-user.md |
| 故障码定义、故障告警日志、网络事件日志 | common-data-user.md |
| 系统配置存储、断点续传、Flash 页管理 | common-data-user.md |
| 启动流程、任务创建、固件版本号 | common-data-user.md |
| 按键、LCD 显示、LED 指示灯 | hmi.md |
| 密码认证、菜单导航、参数编辑下发 | hmi.md |
三、目录说明
索引/
├── README.md ← 本文件:检索入口 + 路由表
├── 功能索引/ ← 核心:自然语言功能 → 源文件(共 1776 行表格)
│ ├── logic.md 逻辑调度(18 文件)
│ ├── net.md 网络应用(20 文件)
│ ├── midware-inverter.md 逆变器协议(42 文件)
│ ├── midware-device.md 电表/BMS/充电桩/AFCI(28 文件)
│ ├── midware-platform.md 接口/以太网/调试/辅助(36 文件)
│ ├── common-data-user.md 工具库/数据/入口(35 文件)
│ └── hmi.md 人机界面(12 文件)
├── 函数索引.tsv 2364 条:函数名 \t 源文件 \t 行号 \t 模块 \t 文件总行数
├── 类型与宏索引.tsv 2787 条:名称 \t 种类 \t 源文件 \t 行号
├── 全局变量索引.tsv 505 条:变量名 \t 源文件 \t 行号 \t 声明
└── 工具/
├── 查找.js 检索脚本
└── 生成索引.js 重新生成三个 TSV(源码变动后重跑)
TSV 是制表符分隔的纯文本,可直接 grep:
grep -i "bms" 函数索引.tsv | head
grep "g_t_inv_info" 全局变量索引.tsv
四、注意事项
符号索引由脚本机械抽取(工具/生成索引.js):用"顶层大括号配对"把文件切成一串顶层声明,再按声明头分类。
校验过的准确性:
- 22 个已知文件的函数数逐一比对,全部吻合(覆盖 1 个函数的小文件到 313 个函数的
inverter.c); - 专门核对过三类易错场景:
#include无分号导致与后续声明粘连、typedef struct{...}X;的尾部别名被误判成变量、__attribute__((at(ADDR)))定位到 SDRAM 的全局量被(误判成函数。
已知边界:
- 枚举成员(
enum { A, B }里的A/B)不在索引内 —— 文档正文里通常已列全,可用node 工具/查找.js -d <关键词>补; - 结构体字段不在索引内,查字段名请用
-d搜文档; - 函数指针变量的初始化理论上可能被误判为函数定义,命中时人工确认一下。
功能索引由归纳整理而来,第一列是"用户可能怎么问"的口语化措辞,允许同义词重复列行;它指路到文件,具体到函数与行号请再看该文件的分析文档。
覆盖边界:本索引只覆盖已文档化的 191 个应用层文件。以下内容不在范围内:
UCOSII/、HALLIB/、hardware/、system/(底层)- 芯片驱动:
midware/ethernt/lan/w5500.*、wizchip_conf.*、wireless/wifi/WM6232PU.* hmi/ui/的 77 个菜单界面文件(其分析文档备份在D:\V0.11.676拉取\_excluded_hmi_ui_docs\)
重新生成符号索引:改过源码后在本目录执行
node 工具/生成索引.js
五、一份完整示例
问:「电池加热是怎么控制的?」
node 工具/查找.js 电池加热→ 命中bat_heat_handle/bat_inv_heat_deal→midware/bms/bms.cset_set_bat_heat_cmd等 →midware/inverter/set/set_comm_usart_s5.c
- 打开
../midware/bms/bms.c.md,看第 4 节「核心逻辑解析」里的加热状态机(NORMAL / INV_HEAT / INV_HEAT_FAULT 迁移条件、3100ms/9100ms 等时间阈值) - 要看源码原文,按 TSV 里的行号去
midware/bms/bms.c对号入座