| 项目 | 内容 |
|---|---|
| 报告版本 | V1.1 |
| 状态日期 | 2026-08-11 |
| 代码基线 | 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 需求、方案、地址映射、信捷对标追踪矩阵、当前源码及真机实测 |
本报告汇总截至 2026-08-11 已执行的 Host 自动测试、IAR 构建、Modbus 上位机测试、
STM32F407 真机测试及逻辑分析仪结果。状态定义如下:
内部 physicalPulses、任务计数和位置只能用于固件一致性检查,不能替代端子物理边沿。
追踪矩阵中的“已纳入/等效实现”也不等价于代码和板测全部关闭。
本报告中的最新结果对应当前未提交工作区,不能只用 HEAD fdbbe71 复现。
| 测试域 | 当前结论 |
|---|---|
| Host 自动回归 | PASS,8 组共 4932 项 |
| IAR 全量构建 | PASS,0 errors / 0 warnings |
| 四轴 PULSE/DIR、P12、P13、P14/P16、P15 | PASS;P14四通道最终波形均严格200000沿 |
| 双 AB 100 kHz | PASS,independent、simultaneous、dynamic 三用例均通过自动检查和四通道波形 |
| M/WAIT 位链 | PASS;仅关闭 Modbus M 位到 PLSR WAIT 的生产链 |
| HSD/SFD 正常持久化 | PASS,含 VBAT 掉主电、运行中掉电、SFD 上电加载、运动中拒绝 Flash 保存 |
| P18 长稳 | PASS:60 秒、30 分钟、坏 CRC、断线重连及组合压力均已通过;USB 并发 DEFERRED |
| 真实 X/EXT/硬限位 | PASS(X0~X3);真实端子回环已关闭电气扫描、WAIT、EXT、正/负硬限位 |
| HM 保持 | BLOCKED,尚缺经确认的掉电保持介质与恢复语义 |
| A/B 槽坏 CRC 真机回退 | PENDING,正常固件禁用破坏性诊断;Host 已覆盖 |
因此,主体运动、Modbus 控制、双 AB、性能和正常持久化链路已有充分通过证据;
但在 HM 保持、受控坏 CRC、30 分钟 USB 并发及最终发布回归关闭前,不得宣称
“严格功能对标和全部交付验收完成”。
| 固件/选择 | 用途 |
|---|---|
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;关闭软/硬限位,仅限安全台架 |
报告更新完成时工作区默认选择已恢复为 P17。P18 不得用于带机构的常规运动验收;切换测试固件后均需
重新编译、烧录并硬复位。DWT 最大值测试必须在硬复位后进行。
2026-08-11 在当前工作区重新执行:
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 | 251 | PASS |
| profile | 336 | PASS |
| HAL | 3521 | PASS |
| Modbus data source | 68 | PASS |
| 合计 | 4932 | PASS |
IAR 结果:Total number of errors: 0,Total number of warnings: 0。
| 用例 | 主要验收结果 | 状态 |
|---|---|---|
| 四轴独立 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 |
执行命令:
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。
执行命令:
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。
执行命令:
python HostComputer\plsr_modbus_counter_stress_test.py --port COM5
physicalPulses 增量均为 200000。历史调试中曾出现 Q0/Q1 各 199999、Q2 多 9 个完整周期等问题;这些结果属于修复前失败样本,
不能作为最终验收值。
2026-08-11 最终工作区烧录、硬复位后的通过样本如下:
| 指标 | 实测最大值 | 预算 | 结果 |
|---|---|---|---|
| PlsrProcess 自身 | 64641 cycles / 384.768 µs | <168000 cycles | PASS |
| PlsrProcess 响应 | 115902 cycles / 689.893 µs | 观测项 | PASS |
| TIM6 控制 ISR | 233 cycles / 1.387 µs | <16800 cycles | PASS |
| 输出定时器 ISR | 1456 cycles / 8.667 µs | <1680 cycles | PASS |
| TIM9/12 计数 ISR | 431 cycles / 2.565 µs | <1680 cycles | PASS |
脚本内部四轴均为 200000;用户最终逻辑分析仪报告确认 Y0~Y3 各严格 200000 个完整脉冲,
100 kHz、无小于 1 µs 窄脉冲,首尾完整,启动前和停止后均保持低电平。历史上的硬件计数少 1、
软件回退多脉冲和末沿截断问题均以该最终样本关闭。
结论:PASS。
执行命令:
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。
三组用例均使用 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
证据:Document/PLSR_document/波形/2026-08-10_14-45-28.bin。
00→10→11→01→00 和 00→01→11→10→00。结论:PASS。
证据:Document/PLSR_document/波形/2026-08-10_15-14-08.bin。
结论:PASS。
最终证据: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。
| 轮次/证据 | 发现的问题 | 后续状态 |
|---|---|---|
| 早期 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 毛刺和
错误总计数。
执行命令:
python HostComputer\plsr_modbus_bit_input_test.py --port COM5
自动和波形结果:
第一次脚本曾把成功的 START QUEUED=1 错当作失败;修正上位机期望值后通过,固件无需为此改变。
结论:M/WAIT 生产链 PASS。 后续 P19 已完成 X0~X3 真实端子回环,详见第 16 节;
HM 独立映像仍未定义掉电保持介质,因此 HM 保持继续为 BLOCKED。
测试脚本:
python HostComputer\plsr_persistence_board_test.py --port COM5 --phase <phase>
| 阶段 | 关键结果 |
|---|---|
| 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。
| 阶段 | 关键结果 |
|---|---|
| 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。
0x5C57E27F、valid mask=0x01、save_count=1。last_sfd_load=OK。结论:CRC 记录保存和上电加载 PASS。 当前只形成一个有效槽;“损坏 newest 后回退旧槽”的
真机破坏性用例尚未执行,不能据此宣称 A/B 坏 CRC 回退已在板上通过。
SAVE_CONFIG,内核返回 BUSY。sfd_save_count 不增加。STOP_IMMEDIATE 清理运动。结论:PASS。
P18 使用关闭软/硬限位的 K4 长任务,只允许在脱开机构或纯逻辑分析仪台架上运行。脚本已改为
每秒原地显示已运行时间、完成比例、样本数、四轴累计和 Modbus 有效帧,便于长时间观察。
| 用例 | 命令摘要 | 结果与证据 |
|---|---|---|
| 60 秒冒烟 | --duration 60 |
PASS,60 个一致性样本,最终计数 [4542201,4537414,4532663,4527973];plsr_long_stress_20260811_151740.csv/.json |
| 30 分钟 Modbus/四轴 | --duration 1800 |
PASS,1800 个一致性样本,Modbus 有效帧 12038,最终计数 [166276382,166263223,166251804,166242746];plsr_long_stress_20260811_152958.csv/.json |
| 坏 CRC 注入 | --duration 40 --frequency-period 0 --bad-crc-period 10 |
PASS,40 个一致性样本;plsr_long_stress_20260811_160526.csv/.json |
| 串口断开/重连 | 60 秒、断开 3 秒 | PASS,57 个有效样本,运动连续并正确清理;plsr_long_stress_20260811_161100.csv/.json |
| 组合压力 | 70 秒动态调频、坏 CRC、35 秒处断开 3 秒 | PASS,67 个有效样本;plsr_long_stress_20260811_161218.csv/.json |
坏 CRC 初版注入曾因未等待 RTU T3.5 而造成正常响应超时;脚本现于坏帧前后按波特率留出静默时间,
修复后独立及组合用例均通过。四轴显示的是上电累计物理计数,且四轴 START、通信读取、动态调频
和 STOP 的时刻并不完全相同,因此累计绝对值不要求相等;单任务严格计数由 P14 验证。
结论:不含 USB 的 P18 长稳、异常帧和断线恢复均 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。已通过的 30 分钟 Modbus/四轴长稳不能替代 USB CDC 并发验收。
physicalPulses 当成本任务计数。PlsrProcess 超过 1 ms;HSD 检查点 CRC 热点已优化并合并。| 优先级 | 项目 | 当前状态 | 关闭条件 |
|---|---|---|---|
| 1 | 最终工作区 P14/P16 发布回归 | PASS | P17 脚本和四通道波形均通过;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、正负硬限位 | PASS(X0~X3) | P19 真实端子回环:X0/X1 硬限位、X2 EXT、X3 WAIT 均通过;其余映射点按需补充抽测 |
| 5 | HM 掉电保持 | BLOCKED | 明确 HM 存储介质、容量、恢复语义并完成掉电测试 |
| 6 | 更长时间纯 Modbus/四轴长稳 | 30 分钟 PASS | 已保存 1800 秒 CSV/JSON;如交付要求高于 30 分钟,再按目标时长延长 |
| 7 | 正式发布清理 | PENDING | 关闭板测启动和调试快照,保留正式控制链;生产构建完整回归 |
截至本报告日期:
项目可以进入“剩余专项验收和正式发布清理”阶段,但尚不满足“全部真机测试关闭”或
“严格对标全部完成”的声明条件。
本节为 2026-08-11 的新增实测结论,优先于前文关于“真实 X 缺少映射”的旧状态。
PLSR_BOARD_TEST_SELECT=PLSR_BOARD_TEST_PHYSICAL_INPUT(P19)。执行命令:
python HostComputer\plsr_modbus_physical_input_test.py --port COM5 --case all
| 用例 | 实测结果 | 判定 |
|---|---|---|
| 电气扫描 | 0、1、2、4、8、3、C、F、0 九种 Y1~Y4 输出组合均与 X0~X3 raw/logical mask 完全一致 | PASS |
| WAIT | Y0严格500个完整脉冲后进入WAIT;Y4→X3释放且不再输出 | PASS(脚本+波形) |
| EXT | Y3→X2触发后1.96 ms停止,514沿;修复后最后250 µs高电平完整 | PASS(脚本+波形) |
| 正硬限位 | Y1→X0后3.79 ms进入减速、49.21 ms停止,566沿,error=6、stop_reason=5 | PASS(脚本+波形) |
| 负硬限位 | Y2→X1后3.79 ms进入减速、49.20 ms停止,568沿,error=7、stop_reason=6 | PASS(脚本+波形) |
Y1~Y4 改版后的五项独立脚本及Y0~Y4同步波形均通过。脚本结束时验证输出自动关闭,轴状态回到IDLE。
2026-08-11 最终自动组合回归再次通过:电气 mask 全部一致,WAIT=500 脉冲,EXT=516 脉冲,
正限位=564 脉冲,负限位=-566 脉冲。自动用例与上述独立波形用例的触发脉冲数存在少量通信时序差,
不改变 EXT 提前切段、硬限位受控停止、错误码和完整末脉冲的验收结论。
依据《实现PLSR指令.pdf》建立 X0~X12、X14~X17、X20 的 MCU GPIO 扫描映射;X13/PA14
是 SWDCLK,调试构建中不扫描。当前真机回环覆盖 X0~X3,其他已映射端子尚未逐点抽测;X21~X43
在现有资料中未取得可靠 MCU 管脚表,读取时返回数据访问错误,不做猜测映射。
Y→X 回环覆盖了 MCU输出、开集电极端子、公共端、实体输入端子、GPIO扫描和 PLSR readBit 的完整
电气链路,但不等同于机械限位开关、现场布线失效和安全回路认证。
除注明“波形沿用已验收证据”的项目外,下表均在最终工作区重新构建相应固件后执行;切换固件时
均重新编译、烧录并硬复位。报告更新后默认固件已恢复为 P17。
| 固件 | 测试项与命令 | 最终结果 |
|---|---|---|
| Host | powershell -ExecutionPolicy Bypass -File PLSR\Test\run_host_tests.ps1 |
PASS,8 组 4932 项 |
| IAR | IarBuild.exe EWARM\Modbus.ewp -build Modbus -log warnings |
PASS,0 errors / 0 warnings |
| 无需上板 | python HostComputer\modbus_timing_tester.py --self-test |
PASS,9600/19200/115200 bit/s 的 T1.2/T1.5/T3.5 自测通过 |
| P17 | python HostComputer\plsr_modbus_counter_stress_test.py --port COM5 |
PASS,四轴内部与端子均严格 200000;P16/ISR 均在预算内 |
| P17 | python HostComputer\plsr_modbus_soft_limit_matrix_test.py --port COM5 |
PASS,四轴正/负、500/2000 Hz 均在 ±1 脉冲窗口内 |
| P12 | python HostComputer\plsr_modbus_frequency_test.py --port COM5 |
PASS,1000→4000→500→默认1000→钳位/保持5000→2000;波形沿用已验收证据 |
| P13 | python HostComputer\plsr_modbus_control_test.py --port COM5 |
PASS,COMMIT 指纹、START、PAUSE 幂等、RESUME、STOP_DECEL;最终自动样本 task/physical=3530 |
| P17 | python HostComputer\plsr_modbus_bit_input_test.py --port COM5 |
PASS,FC05/FC01→M123→WAIT,X/M 空间隔离 |
| P17 | plsr_modbus_ab_stress_test.py --case independent |
PASS,100000/200000 周期;gate=366 cycles |
| P17 | plsr_modbus_ab_stress_test.py --case simultaneous |
PASS,两组各200000周期;gate=377 cycles |
| P17 | plsr_modbus_ab_stress_test.py --case dynamic |
PASS,两组各600000周期,100k→50k→100k、PAUSE/RESUME;gate=365 cycles |
| P17 | 持久化 diagnostics、hsd-prepare/verify、busy-prepare/verify、sfd-save/verify、motion-save-busy | PASS;最终只读诊断 HSD/SFD valid 均为 0x03,generation=1105/2 |
| P18 | 60 秒、1800 秒、坏 CRC、断线重连和组合长稳 | PASS,证据文件见第 12 节 |
| P19 | python HostComputer\plsr_modbus_physical_input_test.py --port COM5 --case all |
PASS,电气扫描、WAIT、EXT、正/负硬限位均通过;波形沿用逐项验收证据 |
仍未执行或未关闭:USB CDC + Modbus + 四轴 30 分钟并发(用户暂缓)、目标板破坏 newest 槽后的
CRC 回退,以及 HM 掉电保持。三项均不得写成已通过。