You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

19 KiB

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 -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: 0Total 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 动态频率

执行命令:

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 命令与状态接口

执行命令:

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 实时性能

执行命令:

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 四轴软限位矩阵

执行命令:

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 硬件周期计数,
每组分别硬复位后执行:

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→0000→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 位数据链

执行命令:

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 持久化板测

测试脚本:

python HostComputer\plsr_persistence_board_test.py --port COM5 --phase <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 长稳

执行命令:

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 并发测试按用户决定暂缓:

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 回退尚未关闭。

项目可以进入“剩余专项验收和正式发布清理”阶段,但尚不满足“全部真机测试关闭”或
“严格对标全部完成”的声明条件。