分两段(用户裁定 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 绝对路径)
14 KiB
故障录波板级到场轮执行手册(人要做的事,一步一行)
这份手册解决什么:录波的判据里剩下的那半轮——需要有人的手和信号发生器的验证——把它拆成"你做什么、说哪句话、会看到什么"。 它不是判据属主:判据、留痕名清单、执行顺序图全在
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 上下文拿不到目录条目)。第二幕尾步要在这个页面上看坏段画面,页面不修好就没测试面。
- [agent] 在
App/task/ui_task.c的扫描函数给f_opendir/f_readdir失败分支加带 FR 码的留痕(顺带修伴生纪律:失败不许钉s_wave_scanned=1)→/keil-build0 错误 0 警告 → 烧录(-Rst -Run+ 回读校验,见docs/测试说明/测试工具/ST-LINK_CLI_复位使用说明.md)。 - [agent] 等 30 s 装置起来 → 远程走 UI 开回放页 → 串口读那条带 FR 码的新留痕。
- 你对结果做一次定性(agent 会把原文贴给你):FR_DENIED → 锁纪律;FR_NO_PATH/FR_NOT_READY → 路径或挂载;FR_OK 但零条目 → readdir 与卷状态交互——根因入登记簿,这条销项。
- [agent] 按根因出修复构建,重烧重验:回放页开屏应列出 WAVE00…05 六段、
↑↓切道←→切段照常、l切段不再空。 - 要烧几次板,都由 agent 盯;你只在会话里看到"请确认烧录"时回一个"烧"字(烧录动作属 Ask-first 边界,agent 不会自己烧)。
这一幕完成的标志:回放页能列出段并可翻段——agent 会给你一张远程抓屏图,画面顶行有通道名和段号。
4. 第二幕「注量对表」——你只出手三次
这一幕验什么:录下来的波是不是现场那个波。判据只有四样:周波数、幅值、极性、钉轨路数——不比绝对相位(口径缘由见 docs/子系统设计/故障录波设计说明.md §4.2,别在这里重开)。
- 到你接线了:发生器正弦 50.000 Hz / 1.000 V rms 接 UA 端子(接线四条件照 ADC 注入流程 §8.3:发生器端接高阻、端子侧焊盘、万用表并接、单点共地)——接好说"接上了"。
- [agent] 先落一个基准:抓串口最近三条
meas:与wave:心跳存证(对表分母)。 - 到按键(二选一,agent 会问):你面板走 主界面 → 装置维护 → 手动录波 →(修改密码 123)→
e确认 →e执行,页面出「已请求录波」即成;或者让 agent 从 7003 远程注键——键时序它已趟熟(drain 纪律见scripts/board_ui_nav.py文件头)。 - [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 五路在交流注入时反而没钉,先怀疑接线)。 - 换点再来一遍:发生器升到能钉住 UB/UC/IB/IC/IN 任一路的量级(削顶的老口径见
docs/测试说明/专项验证/ADC前端注入验证流程.md§8.5 削顶卡;片内 ADC 五路单极性、负半周钉 0 的机理在docs/硬件平台/ADC通道映射说明.md)——这一遍你只拧幅值键,录波触发重复第 3~4 步,钉轨对表应见 ≥1 路实测钉轨且能由注入解释。 - [agent]
meas:与 104 浮点遥测对表:参考主站test/host/iec104_master.py读 YC 浮点,和meas:行、和你注入的 1.000 V 三方对齐——你只需报万用表读数。 - 坏段画面(这一幕的收尾,要第一幕修好):[agent] 造一份位翻转坏段上板(
RETR→翻一位→STOR 回同号)→ 开回放页翻到该段——判据:绝不许画成一条直线,该显拒收态;agent 抓屏给你目检。 - 到你拔线。
现场记录表(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 遥测的二次值都按这份近似标定出数——留着就要在台账注明非送检级)。
步骤(决定一通过后):
- 到你接线:UA 两点——近零(发生器 0 V 或最低档)与满度附近(如 8 V)各录一次;UN、IA 同法(IA 的注入端子与换算照
docs/测试说明/专项验证/ADC前端注入验证流程.md§8.3 同款接线,通道与量程归属看docs/硬件平台/ADC通道映射说明.md)。每次换点说一句"点了",agent 抓该点码值。 - [agent] 两点公式(算术核
App/algo/adc_cal.c的adc_cal_two_point())算各路 k/b → 经 [run_par] 写者链落配置(App/algo/run_par.c会同步回写[adc_cal]并置 valid)→ 上传/config.ini→ 复位生效。 - [agent] 验证解锁:串口
protect心跳恢复判据走数、UI 实时数据"未标定"徽标消失、104 YC 开始出浮点量。 - 到你加注:给 IA 慢慢加(定值基准 1 A:OC3 段 = 2×Ir = 2 A 二次最灵敏;OC1/OC2 是 10/5 A——加到 UI 遥测 IA 显示刚过 2 A 即可,不必真到一次侧大电流)。
- [agent] 30 s 内收证据四连:
wave:心跳 src=P 且 seg+1;/log/start.log新增一条过流启动;两者时刻对齐(段头 t0 与 start.log 时刻差在秒级内,同时看armed——只盯 ovf/计数有已知容差,docs/子系统设计/故障录波设计说明.md§9);104 遥信该元件变位上送。 - 到你拔线。决定二此时拍板,agent 按你的选择还原或保留,并把结果写进
docs/子系统设计/故障录波设计说明.md§10「板级远程半轮记录」小节。
6. 第四幕「bench 自抓与卷占用」——你可以不在场
这一幕验什么:定时自抓(T 源)那路触发,和 docs/子系统设计/故障录波设计说明.md §5.2 第四条陷阱的板级观察——写者被卷忙拖过 2 s 封存窗,必须自弃、只留一条痕、绝不焊死环。
- [agent] 构建 bench 档(
DTU_BENCH+WAVE_BENCH_AUTOCAP双层编译门,定周期自抓,App/task/adc_task.c188 行起)→ 烧录(同第一幕,等你回"烧")→ 起表看wave:心跳 src=T。 - [agent] 造占卷:FTP 传一个约 2 MB 填充文件到根目录(8.3 短名
FILLER.BIN),在下一次自抓即将到点的瞬间连续RETR它 ≥2 s(lftpd 全程持卷锁,见Drivers/BSP/NET/lftpd/lftpd_io.c持有约定)。 - 判据三件套(agent 读串口与目录,给你摘要):
wave:行err+1;串口只有一条[ERR] [WAVE] seg drop: ring abandoned;被弃段号不推进,下一段写同号;期间 104 链路与 UI 心跳照常(丢了录波不丢采集)。 - [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「独立」行的"一轮未跑"字样就可以清了。