Files
STM32F4-Base/docs/测试说明/专项验证/故障录波板级到场轮执行手册.md
T
wandering1 7efa58d9a1
CI / 静态门禁 (pre-commit) (push) Failing after 25s
CI / 主机侧单测 (MSVC) (push) Successful in 48s
network: 台架 IP 迁到 192.168.31.100,并把重复写死的值收进单一真源
分两段(用户裁定 2026-11-02):先做地址迁移,再把同类字面量收敛成
单一真源,以后再改地址只动一处。

一、IP 迁移 192.168.1.100 → 192.168.31.100(gw 同步 → .31.1)
- 工厂默认:Drivers/BSP/NETCFG/net_cfg.c 的 NET_CFG_DEF_IP/_GW
- 注释/文档示例、主机与板级测试、台架 py 脚本、两份 sim_config.ini
- 字节序教学点同步换算 hex:0x6401A8C0 → 0x641FA8C0(内存
  C0 A8 1F 64),旧版示例引文与历史 Trap 记录按冻结纪律不动
- UI 黄金基准:网口设置 4 态 + shot_info 共 5 张 .bin 由
  check_content_pages.py --update 重刷(渲染值 IP 变了,属预期变更)
- 保留判定:客户点表引用(IEC104/继电保护规划)、芯片手册摘录、
  日期冻结的变更记录行、已退役台架档案 MDK-ARM/retracted_bench_*

二、单一真源收口(A+B+C+D,用户批准全做)
- 新建 test/host/bench_defaults.py:台架 py 默认值唯一定义点
  (DEVICE_IP/DEVICE_GW/PC_IP/NET_BCAST),22 个脚本改为引用;
  MDK-ARM 两探针与 scripts/board_ui_nav.py 经 sys.path shim 引入
- test/board/net_test_task.h 新增 TEST_PC_PEER_IP,板测三处
  PHASE*_REMOTE_IP 改引该宏(保留 -D 覆盖);Phase1 断言改
  memcmp 数组比较,数组各只出现一次
- simulator/tests/check_content_pages.py 从 net_cfg.c 正则解析
  NET_CFG_DEF_* 推导期望值(解析失败即报错、不静默兜底),
  脚本内台架 IP 字面量清零
- 装饰性注释去具体值(net_cfg.h/net_socket.h/net_socket.c/
  net_socket_sim.c);字节序教学 hex 对刻意保留为唯一写值点
- 刻意不动:主机单测夹具 IP(逐文件钉住的任意值是正确测试
  实践)、文档正文 IP(那是文档内容本身)

顺带:scripts/gen_task_table.py 规范串清掉「,B5」——编号清退提交
72b4b094 改了受管区没重跑生成器,task-table 门禁因此一直红

验证:产品 @build 0/0;CH395F 套件开关构建 0/0 后还原产品态;
6 套主机单测 rc=0;content_pages(含宏推导路径)/菜单 8 态/
推流位比对全 PASS;bom-drift 99 无漂移;doc-links/coding-standard/
cppcheck 绿;py_compile 23 文件 + --help 冒烟(含 shim 绝对路径)
2026-11-02 14:46:42 +08:00

14 KiB
Raw Blame History

故障录波板级到场轮执行手册(人要做的事,一步一行)

这份手册解决什么:录波的判据里剩下的那半轮——需要有人的手和信号发生器的验证——把它拆成"你做什么、说哪句话、会看到什么"。 它不是判据属主:判据、留痕名清单、执行顺序图全在 docs/子系统设计/故障录波设计说明.md §9 与 §10;本文只写执行动作。已完成部分(2026-10-31 远程半轮六项 PASS + 缺陷「回放页段表枚举恒空」)见 §10「板级远程半轮记录」。 一句话预算:你到场约 1.5~2 小时;其中真正动手的只有接三次线、按不超过六次键、拍两个决定——其余全部由会话里的 agent 跑脚本。


1. 先看结论:四幕各是谁的活

幕 名字 要你在场? 你动手的部分 agent 跑的部分 对应判据
第一幕 枚举埋点与修复上板 可远程(ST-LINK 在本机就不用到场) 无(或帮忙看一眼烧录没报错) 改码加埋点 → 构建 → 烧录回读 → 远程开回放页 → 读 FR 码定性 → 修复重烧 登记簿「回放页段表枚举恒空」
第二幕 注量对表 要到场(只有接线需要手) 接 UA 发生器线 1 次、拔 1 次;面板按 2 次键(或让 agent 远程注键) 记心跳基准 → FTP 拉段 → wave_read 量四样 → meas:/104 YC 对表 → 削顶注大一遍 → 坏段上板看回放页绝不平线 docs/子系统设计/故障录波设计说明.md §10「板级」行 +「板级·回放页」行后半
第三幕 P 触发对时刻 要到场,还含两个由你拍板的决定 IA 两点标定各接一次线 + 过流加大到 UI 见数值过 2 A 读码算 k/b → 写配置生效 → 验证解锁 → 触发后对 start.log 时刻/段号/src=P docs/子系统设计/故障录波设计说明.md §10「板级·触发来路」行
第四幕 bench 自抓与卷占用 可远程(烧录同上;占卷用 FTP 造) 无 烧 bench 构建 → 造占卷 ≥2 s → 看 err+1、一条 ring abandoned、同号重写 → 还原产品构建 docs/子系统设计/故障录波设计说明.md §10 板级行的 ring abandoned 观察项

幕间依赖:只有第二幕的"坏段上板看回放页"一步等第一幕修好;其余各幕互相独立,可以先做不用等的。

flowchart LR
    A[第一幕: 枚举埋点修复 可远程] -->|修好才有测试面| B2[第二幕尾: 坏段与空态画面]
    B[第二幕: 注量对表 到场接线] --> B2
    C[第三幕: P触发 到场+两个决定]
    D[第四幕: bench占卷 可远程]

2. 到场检查清单(人到板边,打开这份清单逐条打勾)

  • 板上电、网灯亮:会话里让 agent 跑 ping 192.168.31.100——通了就行(这台装置一直在线,串口 COM3、网线、ST-LINK 都常年插在这台电脑上,正常都不用动)
  • 信号发生器:和 2026-10-27 那次已知电压注入用的是同一台(波形档正弦、幅值 rms 直读;接线与端子位置照 docs/测试说明/专项验证/ADC前端注入验证流程.md §8.3 那四条,本文不重抄)
  • 万用表一块(并接监视 UA 端子,接线照上一条引的那四条)
  • 打开这个仓库的 agent 会话,对它说一句:"按故障录波到场轮手册,先做第 X 幕"——后面每步它自己跑,该你出手时它会说"到你接线了"
  • 记两个口令(出厂默认;改过的用你改的):面板查看密码 000、修改密码 123;FTP admin/admin
  • 手边留 10 分钟空档给第三幕的两个决定(见 §5,谁都不许替你拍)

3. 第一幕「枚举埋点与修复上板」——你可以不在场

为什么排第一:回放页现在真机恒显「无录波段」(六段文件明明都在盘上,2026-10-31 已钉死是 ui_task_wave_scan() 在 uiTask 上下文拿不到目录条目)。第二幕尾步要在这个页面上看坏段画面,页面不修好就没测试面。

  1. [agent] 在 App/task/ui_task.c 的扫描函数给 f_opendir/f_readdir 失败分支加带 FR 码的留痕(顺带修伴生纪律:失败不许钉 s_wave_scanned=1)→ /keil-build 0 错误 0 警告 → 烧录(-Rst -Run + 回读校验,见 docs/测试说明/测试工具/ST-LINK_CLI_复位使用说明.md)。
  2. [agent] 等 30 s 装置起来 → 远程走 UI 开回放页 → 串口读那条带 FR 码的新留痕。
  3. 你对结果做一次定性(agent 会把原文贴给你):FR_DENIED → 锁纪律;FR_NO_PATH/FR_NOT_READY → 路径或挂载;FR_OK 但零条目 → readdir 与卷状态交互——根因入登记簿,这条销项。
  4. [agent] 按根因出修复构建,重烧重验:回放页开屏应列出 WAVE00…05 六段、↑↓ 切道 ←→ 切段照常、l 切段不再空。
  5. 要烧几次板,都由 agent 盯;你只在会话里看到"请确认烧录"时回一个"烧"字(烧录动作属 Ask-first 边界,agent 不会自己烧)。

这一幕完成的标志:回放页能列出段并可翻段——agent 会给你一张远程抓屏图,画面顶行有通道名和段号。


4. 第二幕「注量对表」——你只出手三次

这一幕验什么:录下来的波是不是现场那个波。判据只有四样:周波数、幅值、极性、钉轨路数——不比绝对相位(口径缘由见 docs/子系统设计/故障录波设计说明.md §4.2,别在这里重开)。

  1. 到你接线了:发生器正弦 50.000 Hz / 1.000 V rms 接 UA 端子(接线四条件照 ADC 注入流程 §8.3:发生器端接高阻、端子侧焊盘、万用表并接、单点共地)——接好说"接上了"。
  2. [agent] 先落一个基准:抓串口最近三条 meas: 与 wave: 心跳存证(对表分母)。
  3. 到按键(二选一,agent 会问):你面板走 主界面 → 装置维护 → 手动录波 →(修改密码 123)→ e 确认 → e 执行,页面出「已请求录波」即成;或者让 agent 从 7003 远程注键——键时序它已趟熟(drain 纪律见 scripts/board_ui_nav.py 文件头)。
  4. [agent] 等 wave: 心跳 seg+1 → FTP 拉回新段 → test/host/wave_read.py dump(双 CRC 必须绿)→ 量:周波数(160 点窗内基波频率,应 ≈50 Hz)、幅值(与万用表读数对,误差口径看 docs/任务规划/数据可信.md §7 前置决策 #1「精度目标」——该目标还没拍板,量完记实测数即可,别现场编合格线)、极性(触发拍在段内点 159,正半周起点看符号)、钉轨路数(UA 不该钉;clip_mask 位图对表规则照 docs/子系统设计/故障录波设计说明.md §10 板级行——V0.1 五路在交流注入时反而没钉,先怀疑接线)。
  5. 换点再来一遍:发生器升到能钉住 UB/UC/IB/IC/IN 任一路的量级(削顶的老口径见 docs/测试说明/专项验证/ADC前端注入验证流程.md §8.5 削顶卡;片内 ADC 五路单极性、负半周钉 0 的机理在 docs/硬件平台/ADC通道映射说明.md)——这一遍你只拧幅值键,录波触发重复第 3~4 步,钉轨对表应见 ≥1 路实测钉轨且能由注入解释。
  6. [agent] meas: 与 104 浮点遥测对表:参考主站 test/host/iec104_master.py 读 YC 浮点,和 meas: 行、和你注入的 1.000 V 三方对齐——你只需报万用表读数。
  7. 坏段画面(这一幕的收尾,要第一幕修好):[agent] 造一份位翻转坏段上板(RETR→翻一位→STOR 回同号)→ 开回放页翻到该段——判据:绝不许画成一条直线,该显拒收态;agent 抓屏给你目检。
  8. 到你拔线。

现场记录表(agent 会打印这张表逐行填,你核对签字即可):

注入点 万用表 段文件 量出基波 量出幅值 极性 实测钉轨 判定
UA 1.000 V 50.000 Hz 待填 WAVE__ __ Hz __ V 正/反 __ 路 过/不过
削顶注大 待填 WAVE__ __ Hz __ V 正/反 __ 路 过/不过
坏段(回放页画面) — 同号覆盖 — — — — 不平线=过

5. 第三幕「P 触发对时刻」——含两个只能你拍板的决定

先讲人话:过流启动录波的代码路已接在 protect_task.c 的启动边沿上(判据一 picked,录波同拍请求),但保护判据现在整机闭锁——adc_cal_flags() 的 VALID 位对 UA/UN/IA 三路都没置位,protect_task 直接停走判据。要让保护真出口,必须先把这三路标定;这正是 2026-10-25 你裁定"保持闭锁、不用万用表走捷径"守着的那道门。

  • 决定一(解锁):这一幕要不要用发生器为参考给 UA/UN/IA 做两点标定换 P 路验证?它不是送检级标定(端子变比还挂着 docs/任务规划/数据可信.md §5 的原理图确认),做出来的工程量是"发生器刻度下的近似值"。点头 → 往下走;摇头 → 第三幕整体顺延到标准源轮,本文其余各幕照做。
  • 决定二(还锁):这一幕验完,把标定清回闭锁(还原出厂系数)还是留着 valid 让保护继续在线(此后 UI 显示与 104 遥测的二次值都按这份近似标定出数——留着就要在台账注明非送检级)。

步骤(决定一通过后):

  1. 到你接线:UA 两点——近零(发生器 0 V 或最低档)与满度附近(如 8 V)各录一次;UN、IA 同法(IA 的注入端子与换算照 docs/测试说明/专项验证/ADC前端注入验证流程.md §8.3 同款接线,通道与量程归属看 docs/硬件平台/ADC通道映射说明.md)。每次换点说一句"点了",agent 抓该点码值。
  2. [agent] 两点公式(算术核 App/algo/adc_cal.c 的 adc_cal_two_point())算各路 k/b → 经 [run_par] 写者链落配置(App/algo/run_par.c 会同步回写 [adc_cal] 并置 valid)→ 上传 /config.ini → 复位生效。
  3. [agent] 验证解锁:串口 protect 心跳恢复判据走数、UI 实时数据"未标定"徽标消失、104 YC 开始出浮点量。
  4. 到你加注:给 IA 慢慢加(定值基准 1 A:OC3 段 = 2×Ir = 2 A 二次最灵敏;OC1/OC2 是 10/5 A——加到 UI 遥测 IA 显示刚过 2 A 即可,不必真到一次侧大电流)。
  5. [agent] 30 s 内收证据四连:wave: 心跳 src=P 且 seg+1;/log/start.log 新增一条过流启动;两者时刻对齐(段头 t0 与 start.log 时刻差在秒级内,同时看 armed——只盯 ovf/计数有已知容差,docs/子系统设计/故障录波设计说明.md §9);104 遥信该元件变位上送。
  6. 到你拔线。决定二此时拍板,agent 按你的选择还原或保留,并把结果写进 docs/子系统设计/故障录波设计说明.md §10「板级远程半轮记录」小节。

6. 第四幕「bench 自抓与卷占用」——你可以不在场

这一幕验什么:定时自抓(T 源)那路触发,和 docs/子系统设计/故障录波设计说明.md §5.2 第四条陷阱的板级观察——写者被卷忙拖过 2 s 封存窗,必须自弃、只留一条痕、绝不焊死环。

  1. [agent] 构建 bench 档(DTU_BENCH + WAVE_BENCH_AUTOCAP 双层编译门,定周期自抓,App/task/adc_task.c 188 行起)→ 烧录(同第一幕,等你回"烧")→ 起表看 wave: 心跳 src=T。
  2. [agent] 造占卷:FTP 传一个约 2 MB 填充文件到根目录(8.3 短名 FILLER.BIN),在下一次自抓即将到点的瞬间连续 RETR 它 ≥2 s(lftpd 全程持卷锁,见 Drivers/BSP/NET/lftpd/lftpd_io.c 持有约定)。
  3. 判据三件套(agent 读串口与目录,给你摘要):wave: 行 err +1;串口只有一条 [ERR] [WAVE] seg drop: ring abandoned;被弃段号不推进,下一段写同号;期间 104 链路与 UI 心跳照常(丢了录波不丢采集)。
  4. [agent] 删掉 FILLER.BIN → 重烧产品构建(等"烧"确认)→ 跑一遍启动锚点校验(/serial-boot-test 的 required/forbidden 全套)→ 释放 bench 锁。

7. 收工还原清单(一项不落,agent 逐条过给你看)

  • 发生器断线、夹子收走;UA/IA 端子恢复原样
  • FILLER.BIN 已从 / 删除;/WAVE 里只剩真实段(坏段样本若留着,在 docs/子系统设计/故障录波设计说明.md §10「板级远程半轮记录」里点名它是坏段,回放页翻到必须显拒收态——留着当常设负样本也行,二选一并记录)
  • 标定与定值按决定二处置完毕,处置结果已写进 docs/子系统设计/故障录波设计说明.md §10「板级远程半轮记录」的后续小节
  • 设备跑的是产品构建且启动锚点全过;UI 停在主菜单;两把锁(build/bench)空闲
  • 现场记录表数值入档、抓屏证据归档到会话的 ci-artifacts/wavebench/,docs/子系统设计/故障录波设计说明.md §10 状态与登记簿同步销项

8. 出问题怎么办(三条,都别硬试)

  • 页面看着"不动":九成是远程注键的帧流滞后(ACK 与推流同一条 TCP)——让 agent 按 scripts/board_ui_nav.py 文件头的三条纪律排空重取,不是板子死了。
  • FTP 报 425:两条 LIST 之间隔 0.5 s 再发(lftpd 单连接语义,老坑)。
  • 串口见任何 [ERR] 开头行或装置自己复位了:停止当前幕,原样贴给 agent——[ERR] 是门禁级信号,别重试掩盖现场。

9. 时间与顺序建议

顺序 幕 墙钟 你到场?
先 第一幕(埋点→定性→修复) 30~45 min 否(远程可跑,烧录要口头确认)
中 第二幕(注量对表) 40~60 min 是(接拔线 + 一次按键)
中 第三幕(P 触发) 30~60 min(含两个决定) 是(多点注入接线 + 加流)
后 第四幕(bench 占卷) 20~30 min 否

第二、三幕共用同一次到场(都在 UA/IA 端子上做文章);第一、四幕可以排在任意工作日远程做。四幕全过 = 录波本波收口——docs/任务规划/README.md §2.0「独立」行的"一轮未跑"字样就可以清了。