# PLSR 项目测试报告 | 项目 | 内容 | | --- | --- | | 报告版本 | V1.0 | | 状态日期 | 2026-08-10 | | 代码基线 | `master` / HEAD `fdbbe71aeacfe2524271aa4d53792cb5831211dc` + 当前未提交工作区 | | 目标平台 | STM32F407IG、uC/OS-II、Modbus RTU | | 开发环境 | IAR EWARM 8.3,构建配置 `Modbus` | | 通信参数 | COM5,9600 bit/s,8E1,从站地址 1 | | 波形采集 | 16 通道逻辑分析仪;AB 关键用例 100 MS/s;CH0~CH3 对应 Q0~Q3 | | 测试依据 | PLSR 需求、方案、地址映射、信捷对标追踪矩阵、当前源码及真机实测 | ## 1. 报告口径 本报告汇总截至 2026-08-10 已执行的 Host 自动测试、IAR 构建、Modbus 上位机测试、 STM32F407 真机测试及逻辑分析仪结果。状态定义如下: - **PASS**:自动检查和该用例要求的真机/波形验收均已通过。 - **PASS(发布前回归)**:已有完整通过证据,但最终共享 HAL 改动后仍应按发布门禁再跑一次。 - **PARTIAL**:只完成了内部状态或部分硬件链路,不能作为完整端子验收。 - **PENDING**:测试代码已具备,但尚无要求范围内的最终实测证据。 - **BLOCKED**:缺少板卡映射、硬件接口或明确存储约定,当前不能安全完成。 - **DEFERRED**:测试条件具备但本轮明确暂缓。 内部 `physicalPulses`、任务计数和位置只能用于固件一致性检查,不能替代端子物理边沿。 追踪矩阵中的“已纳入/等效实现”也不等价于代码和板测全部关闭。 本报告中的最新结果对应当前未提交工作区,不能只用 HEAD `fdbbe71` 复现。 ## 2. 总体结论 | 测试域 | 当前结论 | | --- | --- | | Host 自动回归 | **PASS**,8 组共 4881 项 | | IAR 全量构建 | **PASS**,0 errors / 0 warnings | | 四轴 PULSE/DIR、P12、P13、P15 | **PASS**;P14 作为最终发布门禁仍建议重采一次四通道波形 | | 双 AB 100 kHz | **PASS**,independent、simultaneous、dynamic 三用例均通过自动检查和四通道波形 | | M/WAIT 位链 | **PASS**;仅关闭 Modbus M 位到 PLSR WAIT 的生产链 | | HSD/SFD 正常持久化 | **PASS**,含 VBAT 掉主电、运行中掉电、SFD 上电加载、运动中拒绝 Flash 保存 | | P18 长稳 | **60 秒 Modbus 冒烟 PASS**;30 分钟 USB 并发 **DEFERRED** | | 真实 X/EXT/硬限位、HM 保持 | **BLOCKED**,缺少物理 X→GPIO 映射和 HM 保持介质约定 | | A/B 槽坏 CRC 真机回退 | **PENDING**,正常固件禁用破坏性诊断;Host 已覆盖 | 因此,主体运动、Modbus 控制、双 AB、性能和正常持久化链路已有充分通过证据; 但在真实 X/HM、受控坏 CRC、30 分钟 USB 并发及最终发布回归关闭前,不得宣称 “严格功能对标和全部交付验收完成”。 ## 3. 测试环境与固件配置 ### 3.1 固件选择 | 固件/选择 | 用途 | | --- | --- | | `PLSR_BOARD_TEST_MODBUS_DATA`(P12) | 动态频率与 Modbus 字数据源 | | `PLSR_BOARD_TEST_MODBUS_CONTROL`(P13) | COMMIT/START/PAUSE/RESUME/STOP 控制窗口 | | `PLSR_BOARD_TEST_HW_COUNTER`(P14) | 四轴 PULSE/DIR 计数与 P16 性能 | | `PLSR_BOARD_TEST_DUAL_AB`(P17) | P14/P15 共用准备、双 AB、位链及持久化板测 | | `PLSR_BOARD_TEST_LONG_STRESS`(P18) | 四轴长稳专用 K4;关闭软/硬限位,仅限安全台架 | 报告生成时工作区默认选择为 P18。P18 不得用于带机构的常规运动验收;切换测试固件后均需 重新编译、烧录并硬复位。DWT 最大值测试必须在硬复位后进行。 ### 3.2 当前静态基线 2026-08-10 在当前工作区重新执行: ```powershell powershell -ExecutionPolicy Bypass -File PLSR\Test\run_host_tests.ps1 & 'F:\IAR Systems\Embedded Workbench 8.3\common\bin\IarBuild.exe' ` 'EWARM\Modbus.ewp' -build Modbus -log warnings ``` Host 结果: | 套件 | 检查数 | 结果 | | --- | ---: | --- | | position | 33 | PASS | | plc | 202 | PASS | | core | 214 | PASS | | job | 307 | PASS | | path | 227 | PASS | | profile | 336 | PASS | | HAL | 3494 | PASS | | Modbus data source | 68 | PASS | | **合计** | **4881** | **PASS** | IAR 结果:`Total number of errors: 0`,`Total number of warnings: 0`。 ## 4. 基础运动与历史专项结果 | 用例 | 主要验收结果 | 状态 | | --- | --- | --- | | 四轴独立 PULSE/DIR | Q0~Q3 可独立运行;100 kHz 周期 10 µs、约 50% 占空比;无窄脉冲和停止后残余 | PASS | | 双轴方向/回零 | 两轴 `+200/-200` 对称 | PASS | | 方向建立/换向延时 | 换向静默实测 9.9995 ms,符合 SFD907=10 ms | PASS | | 同方向段衔接 | 不再无条件插入 10 ms;仅首次建立或实际换向等待 | PASS | | CW/CCW 互锁 | Q0=300、Q1=200;非活动路全程低、无重叠 | PASS | | CW/CCW 末脉冲 | 最后完整高/低周期结束后停止,不再截断为 2.5/5.0 µs | PASS | | 零加速段 | 不再停在 ACCEL,正常进入运行和完成 | PASS | | 动态频率非法输入 | 超范围钳位,负频率保持上次安全目标 | PASS | ## 5. P12 Modbus 动态频率 执行命令: ```powershell python HostComputer\plsr_modbus_frequency_test.py --port COM5 ``` 波形证据:`Document/PLSR_document/波形/2026-08-10_18-28-06.bin`。 | 写入值 | 期望 | 真机/波形结果 | | ---: | --- | --- | | 1000 | 1000 Hz | 1000 Hz 平台,周期 1000.0 µs | | 4000 | 平滑升至 4000 Hz | 4000 Hz,周期 250.0 µs | | 500 | 平滑降至 500 Hz | 500 Hz,周期 2000.0 µs | | 0 | 使用默认 1000 Hz | 1000 Hz 短平台明确存在 | | 8000 | 钳位至 5000 Hz | 5000 Hz,周期 200.0 µs | | -1 | 保持上次安全目标 | 5000 Hz 平台连续,无停止或异常频率 | | 2000 | 恢复 2000 Hz | 2000 Hz,周期 500.0 µs | 结果:频率顺序 `1000→4000→500→1000→5000→5000→2000` 正确;段间连续、 无断流、无窄脉冲、无截断和额外边沿;32 位频率使用功能码 `0x10` 原子写入。 **结论:PASS。** ## 6. P13 Modbus 命令与状态接口 执行命令: ```powershell python HostComputer\plsr_modbus_control_test.py --port COM5 ``` 波形证据:`Document/PLSR_document/波形/2026-08-10_18-41-17.bin`。 | 验收项 | 结果 | | --- | --- | | COMMIT 完整校验 | PASS | | COMMIT 后修改 S0,START 必须拒绝 | PASS | | START 排队并加速至 2000 Hz | PASS | | PAUSE 减速、重复序号幂等 | PASS | | 暂停期间全低 | 约 682 ms 无残余边沿 | | RESUME 重新加速 | PASS,无额外首沿 | | STOP_DECEL | 平滑减速,完整末脉冲后停止 | | 最终计数 | 逻辑位置 103550;任务/物理脉冲均 3550 | PAUSE 与 STOP_DECEL 的逐脉冲减速序列对称;全波形升降沿各 3550,无悬空沿, 无小于 1 µs 毛刺,最终保持低。 **结论:PASS。** ## 7. P14 四轴 100 kHz 计数与 P16 实时性能 执行命令: ```powershell python HostComputer\plsr_modbus_counter_stress_test.py --port COM5 ``` ### 7.1 功能和计数 - 四轴目标均为 200000 脉冲,100 kHz。 - Q0/Q1 获得 TIM9/TIM12 硬件计数租约;Q2/Q3 使用软件回退。 - 自动脚本的任务计数和本次 `physicalPulses` 增量均为 200000。 - 已有四通道逻辑分析仪通过记录:Q0~Q3 各 200000 个物理上升沿,周期中位 10.000 µs,范围 9.990~10.010 µs,高宽 5.000 µs,无小于 0.5 µs 窄脉冲、 启动毛刺或停止残余。 历史调试中曾出现 Q0/Q1 各 199999、Q2 多 9 个完整周期等问题;这些结果属于修复前失败样本, 不能作为最终验收值。 ### 7.2 P16 性能结果 最终已记录的 PULSE/DIR 通过样本包括: | 指标 | 实测最大值 | 预算 | 结果 | | --- | ---: | ---: | --- | | PlsrProcess 自身 | 53748 cycles / 319.929 µs | <168000 cycles | PASS | | PlsrProcess 响应 | 85655 cycles / 509.851 µs | 观测项 | PASS | | TIM6 控制 ISR | 231 cycles / 1.375 µs | <16800 cycles | PASS | | 输出定时器 ISR | 893 cycles / 5.315 µs | <1680 cycles | PASS | | TIM9/12 计数 ISR | 883 cycles / 5.256 µs | <1680 cycles | PASS | 后续 P17 回归也得到 PlsrProcess 自身 68175 cycles、输出 ISR 1105 cycles、计数 ISR 961 cycles,均在预算内。响应墙钟偶尔超过 1 ms 时,自身 CPU 时间仍达标,差值来自高优先级 定时器中断抢占。 **结论:PASS(发布前回归)。** 最终 AB 边界修复修改了共享 HAL;发布前应再次烧录最终工作区, 硬复位后重跑脚本并重新统计 Q0~Q3 各 200000 个端子上升沿。 ## 8. P15 四轴软限位矩阵 执行命令: ```powershell python HostComputer\plsr_modbus_soft_limit_matrix_test.py --port COM5 ``` | 轴/方向 | 频率 | 输出脉冲 | 最终位置 | 结果 | | --- | ---: | ---: | ---: | --- | | 轴0 正限位 | 500 Hz | 201 | 1000001 | PASS | | 轴1 正限位 | 2000 Hz | 1000 | 1000000 | PASS | | 轴2 负限位 | 500 Hz | 201 | -1000001 | PASS | | 轴3 负限位 | 2000 Hz | 1000 | -1000000 | PASS | 四轴正负软限位均在 ±1 脉冲窗口内停止,错误码和复位正确。历史上轴1曾超停 2 脉冲, 加入当前硬件频率和 1 ms 保护采样补偿后关闭。 **结论:PASS。** ## 9. 双 AB 100 kHz 专项(P17) 三组用例均使用 Q0/Q1 与 Q2/Q3 两组固定 AB 配对、TIM9/TIM12 硬件周期计数, 每组分别硬复位后执行: ```powershell python HostComputer\plsr_modbus_ab_stress_test.py --port COM5 --case independent python HostComputer\plsr_modbus_ab_stress_test.py --port COM5 --case simultaneous python HostComputer\plsr_modbus_ab_stress_test.py --port COM5 --case dynamic ``` ### 9.1 Independent 证据:`Document/PLSR_document/波形/2026-08-10_14-45-28.bin`。 - CH0=CH1=100000,CH2=CH3=200000,升降沿相等。 - Q0/Q1 正向,Q2/Q3 反向;相序分别严格为 `00→10→11→01→00` 和 `00→01→11→10→00`。 - 首跳前为 00;两相首沿间隔 2.55/2.45 µs,落在 2.50±0.05 µs 边界。 - 第一组先停,第二组继续约 1.112 s;停止组无残余边沿。 - D1468=382 cycles,小于 420 cycles。 **结论:PASS。** ### 9.2 Simultaneous 证据:`Document/PLSR_document/波形/2026-08-10_15-14-08.bin`。 - 四通道各 200000 个上升沿和下降沿。 - 两组末周期完整回 00,停止后 1 ms 全低。 - 正反相序正确,无反转、无同时跳变、无窄脉冲。 - D1468=392 cycles,小于 420 cycles;输出 ISR=997 cycles,小于 1680 cycles。 - “同时完成”指相同目标;两个 START 由 9600 bit/s Modbus 串行提交,实际末沿允许相差一次 通信事务时间。 **结论:PASS。** ### 9.3 Dynamic 最终证据:`Document/PLSR_document/波形/2026-08-10_18-13-13.bin`。 | 验收项 | 最终结果 | | --- | --- | | 四通道边沿 | CH0=CH1=CH2=CH3=600000,升降沿相等 | | 频率序列 | 100 kHz→50 kHz→100 kHz,周期 10.000/20.000 µs | | 降频/升频边界 | 额外沿 0、窄脉冲 0、同跳 0、非法跳变 0 | | PAUSE | 合法单步回 00;末脉冲 5.000 µs 完整;约 864 ms 全低无沿 | | 另一组连续性 | 暂停期间 Q2/Q3 连续运行,约 86401 沿 | | RESUME | 从 00 重建正向相序,第一周期完整,无额外沿 | | 首沿 | Q0/Q1=2.55 µs,Q2/Q3=2.44 µs;首跳前 00 | | 完成 | 两组末周期完整回 00,停止后全低 | | 自动性能检查 | PASS,含输出 ISR 与 D1468 预算 | **结论:PASS。** ### 9.4 AB 缺陷关闭轨迹 | 轮次/证据 | 发现的问题 | 后续状态 | | --- | --- | --- | | 早期 AB 捕获 | 每相 7501 而非 7500;首沿约 0.33~0.37 µs 同升 | 已修复 | | independent 初测 | 每通道多 1 个悬空沿、停在 11、首沿仅约 0.33 µs | 已修复 | | simultaneous 初测 | CH2 多 1 沿并悬高约 809 µs;D1468=443 cycles | 已修复,最终 CH2=200000、D1468=392 | | `15-24-38.bin` | dynamic COUNTER_FAULT、PAUSE 未生效、停止边界悬高 | 已修复 | | `17-06-37.bin` | 降频边界拉长/多余沿、PAUSE 起点悬高约 970 µs | 已修复 | | `17-49-15.bin` | 降频边界 2.4 µs 短脉冲、PAUSE 出现 11→00 同跳 | 已修复 | | `18-13-13.bin` | 所有自动与波形检查干净 | 最终 PASS | 禁止恢复曾经使用的“运行中重写 CNT 保相位”方案;该方案会产生额外边沿、4 µs 毛刺和 错误总计数。 ## 10. Modbus M/WAIT 位数据链 执行命令: ```powershell python HostComputer\plsr_modbus_bit_input_test.py --port COM5 ``` 自动和波形结果: - FC05 写 M123、FC01 回读成功。 - M123=0 时,1000 Hz、500 脉冲任务完整结束后稳定进入 WAIT。 - M123 由 0→1 后 WAIT 释放并正常 COMPLETED,不再输出脉冲。 - FC02 读取 X123=0;写 M123 不会改变 X123,证明 X/M 位空间分离。 - Q0 严格 500 个上升沿和 500 个下降沿;主段周期 1000.0 µs、高宽 500.0 µs。 - 第 500 个脉冲完整下降沿收尾,WAIT 和释放后均保持低,无窄脉冲或残余。 第一次脚本曾把成功的 START `QUEUED=1` 错当作失败;修正上位机期望值后通过,固件无需为此改变。 **结论:M/WAIT 生产链 PASS。** 实际 X 输入、EXT 上升沿和正/负硬限位仍需板卡 “X 点号→GPIO/输入扫描”映射;HM 独立映像尚未定义掉电保持介质,因此这些项目为 BLOCKED。 ## 11. HSD/SFD 持久化板测 测试脚本: ```powershell python HostComputer\plsr_persistence_board_test.py --port COM5 --phase ``` ### 11.1 HSD + VBAT 正常掉主电恢复 | 阶段 | 关键结果 | | --- | --- | | diagnostics | HSD valid=0x03,generation=688;SFD 尚无有效槽 | | hsd-prepare | generation=692,CRC=`0x1121309F`,本次启动保存 4 次 | | 保持 VBAT、断主电后 hsd-verify | generation 和 CRC 完全一致,flags=0x0006 | 四轴已知位置全部恢复、`position_valid=1`、无自动输出。 **结论:PASS。** ### 11.2 运行中掉电/复位安全恢复 | 阶段 | 关键结果 | | --- | --- | | busy-prepare | HSD generation=694,CRC=`0xC1F355DF`,busy 检查点已提交 | | 运行中直接断主电后 busy-verify | generation/CRC 保持,flags=0x000A | 重启后所有轴 IDLE、没有自动续跑、无输出、所有轴 `position_valid=0`。 初版脚本错误地等待运动期间 HSD dirty 清零;运行位置持续发布会合法地重新置 dirty。 脚本现改为检查 generation 和 save_count 确实前进。 **结论:PASS。** ### 11.3 SFD Flash 保存与上电加载 - 首次真实保存生成 SFD generation=1、CRC=`0x5C57E27F`、valid mask=0x01、save_count=1。 - 单 Bank Flash 擦写期间第一次 Modbus 状态读取超时,但只读诊断确认保存已经成功。 - 上位机已改为 SAVE 请求只发送一次;擦写阻塞期间只重试读取,绝不重发 SAVE。 - SFD clean 状态再次 SAVE 正确 no-op,没有重复擦写。 - 掉电重启后 generation 和 CRC 一致,`last_sfd_load=OK`。 **结论:CRC 记录保存和上电加载 PASS。** 当前只形成一个有效槽;“损坏 newest 后回退旧槽”的 真机破坏性用例尚未执行,不能据此宣称 A/B 坏 CRC 回退已在板上通过。 ### 11.4 运动中禁止 Flash 擦写 - 长任务运行期间发送 `SAVE_CONFIG`,内核返回 `BUSY`。 - SFD generation 保持 1,本次启动 `sfd_save_count` 不增加。 - 脚本随后自动 `STOP_IMMEDIATE` 清理运动。 **结论:PASS。** ## 12. P18 Modbus 长稳 执行命令: ```powershell python HostComputer\plsr_modbus_long_stress_test.py --port COM5 --duration 60 ``` 证据: - `HostComputer/long_stress_logs/plsr_long_stress_20260810_191803.csv` - `HostComputer/long_stress_logs/plsr_long_stress_20260810_191803.json` 结果摘要: | 项目 | 结果 | | --- | --- | | 一致性样本 | 60 | | 动态频率 | 每 10 s 在 100 kHz/50 kHz 间切换 | | Modbus 有效帧增量 | 375 | | TX 帧增量 | 375 | | CRC/非法功能/非法地址/非法值/丢帧/UART 错误 | 全部 0 | | DMA 接收重启失败增量 | 0 | | 四轴最终计数 | `[4541617, 4536532, 4531732, 4526921]` | | 结束状态 | 四轴软件停止,任务计数=物理计数=逻辑位置 | **结论:60 秒 Modbus 长稳冒烟 PASS。** USB 线未接,系统只枚举到 FTDI Modbus `COM5`,因此以下 30 分钟 USB CDC 并发测试按用户决定暂缓: ```powershell python HostComputer\plsr_modbus_long_stress_test.py ` --port COM5 --duration 1800 --usb-port COMx --usb-rate 64000 ``` 状态:**DEFERRED**。60 秒测试不能替代 30 分钟及更长 USB/Modbus/四轴并发验收。 ## 13. 已确认修复且不得回退的问题 1. PWM 端子负逻辑、启动首脉冲和段尾截断问题。 2. 零加速参数导致状态机停在 ACCEL。 3. 同方向段间错误插入 10 ms 延时。 4. AB 双定时器调频相位漂移,以及运行中重写 CNT 造成的额外沿/毛刺。 5. AB 启动两相近似同时上升、每相多 1 沿。 6. AB 末周期悬高、双组近同时完成竞态及 D1468 超预算。 7. AB 降频边界两相不对称、短/长脉冲和 PAUSE 非法同跳。 8. CW/CCW 非活动通道高电平和最后脉冲截断。 9. PAUSE 后 RESUME 保持 0 Hz、无法完成。 10. 2000 Hz 软限位超停 2 脉冲。 11. P14 将上电累计 `physicalPulses` 当成本任务计数。 12. P16 `PlsrProcess` 超过 1 ms;HSD 检查点 CRC 热点已优化并合并。 13. SFD 擦写期间上位机一次读超时被误判为 SAVE 失败;现只重试读取。 ## 14. 未关闭项与后续测试 | 优先级 | 项目 | 当前状态 | 关闭条件 | | ---: | --- | --- | --- | | 1 | 最终工作区 P14/P16 发布回归 | PENDING | P17 硬复位后脚本 PASS;Q0~Q3 各严格 200000 端子上升沿 | | 2 | 30 分钟 USB CDC + Modbus + 四轴并发 | DEFERRED | 枚举第二 USB CDC COM,运行 1800 s;设备/主机 USB 统计和 Modbus 诊断无错误 | | 3 | SFD/HSD newest 槽坏 CRC 回退 | PENDING | 专用验证固件启用破坏性诊断、双槽有效、只失效 newest,重启回退旧 generation | | 4 | 真实 X、EXT、正负硬限位 | BLOCKED | 提供板卡 X 点到 GPIO/扫描表,完成真实输入板测 | | 5 | HM 掉电保持 | BLOCKED | 明确 HM 存储介质、容量、恢复语义并完成掉电测试 | | 6 | 更长时间长稳 | PENDING | 在 30 分钟通过后按交付要求延长,并保存 CSV/JSON 与必要波形窗口 | | 7 | 正式发布清理 | PENDING | 关闭板测启动和调试快照,保留正式控制链;生产构建完整回归 | ## 15. 最终判定 截至本报告日期: - P12、P13、P15、双 AB 三用例、M/WAIT、正常 HSD/SFD 持久化和 P18 60 秒冒烟均已通过。 - P14/P16 已有通过基线,但最终发布前仍应针对当前完整工作区再做一次 PULSE/DIR 四通道回归。 - USB 30 分钟并发已明确暂缓;真实 X/HM 和破坏性 CRC 回退尚未关闭。 项目可以进入“剩余专项验收和正式发布清理”阶段,但尚不满足“全部真机测试关闭”或 “严格对标全部完成”的声明条件。