# PLSR 项目测试报告 | 项目 | 内容 | | --- | --- | | 报告版本 | 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 需求、方案、地址映射、信捷对标追踪矩阵、当前源码及真机实测 | ## 1. 报告口径 本报告汇总截至 2026-08-11 已执行的 Host 自动测试、IAR 构建、Modbus 上位机测试、 STM32F407 真机测试及逻辑分析仪结果。状态定义如下: - **PASS**:自动检查和该用例要求的真机/波形验收均已通过。 - **PASS(发布前回归)**:已有完整通过证据,但最终共享 HAL 改动后仍应按发布门禁再跑一次。 - **PARTIAL**:只完成了内部状态或部分硬件链路,不能作为完整端子验收。 - **PENDING**:测试代码已具备,但尚无要求范围内的最终实测证据。 - **BLOCKED**:缺少板卡映射、硬件接口或明确存储约定,当前不能安全完成。 - **DEFERRED**:测试条件具备但本轮明确暂缓。 内部 `physicalPulses`、任务计数和位置只能用于固件一致性检查,不能替代端子物理边沿。 追踪矩阵中的“已纳入/等效实现”也不等价于代码和板测全部关闭。 本报告中的最新结果对应当前未提交工作区,不能只用 HEAD `fdbbe71` 复现。 ## 2. 总体结论 | 测试域 | 当前结论 | | --- | --- | | 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 并发及最终发布回归关闭前,不得宣称 “严格功能对标和全部交付验收完成”。 ## 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;关闭软/硬限位,仅限安全台架 | 报告更新完成时工作区默认选择已恢复为 P17。P18 不得用于带机构的常规运动验收;切换测试固件后均需 重新编译、烧录并硬复位。DWT 最大值测试必须在硬复位后进行。 ### 3.2 当前静态基线 2026-08-11 在当前工作区重新执行: ```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 | 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`。 ## 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 性能结果 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。** ## 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。** 后续 P19 已完成 X0~X3 真实端子回环,详见第 16 节; HM 独立映像仍未定义掉电保持介质,因此 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 长稳 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 并发测试按用户决定暂缓: ```powershell python HostComputer\plsr_modbus_long_stress_test.py ` --port COM5 --duration 1800 --usb-port COMx --usb-rate 64000 ``` 状态:**DEFERRED**。已通过的 30 分钟 Modbus/四轴长稳不能替代 USB CDC 并发验收。 ## 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. P19 EXT 在1 ms路径tick同步停PWM,导致最后高电平223 µs而非250 µs;现改为冻结profile并由下一自然update/物理下降沿非阻塞停机,再推进路径。 ## 14. 未关闭项与后续测试 | 优先级 | 项目 | 当前状态 | 关闭条件 | | ---: | --- | --- | --- | | 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 | 关闭板测启动和调试快照,保留正式控制链;生产构建完整回归 | ## 15. 最终判定 截至本报告日期: - P12、P13、P14/P16、P15、双 AB 三用例、M/WAIT、X0~X3 真实输入和正常 HSD/SFD 持久化均已通过。 - P14/P16 当前完整工作区发布回归已通过,Q0~Q3 逻辑分析仪均严格 200000 个上升沿。 - P18 已通过 60 秒冒烟、30 分钟四轴/Modbus、坏 CRC、断线重连及组合压力测试。 - USB 30 分钟并发已明确暂缓;HM 保持和破坏性 CRC 回退尚未关闭。 项目可以进入“剩余专项验收和正式发布清理”阶段,但尚不满足“全部真机测试关闭”或 “严格对标全部完成”的声明条件。 ## 16. P19 XDM-60T4-E 真实 X 输入回环板测(2026-08-11) 本节为 2026-08-11 的新增实测结论,优先于前文关于“真实 X 缺少映射”的旧状态。 ### 16.1 固件与接线 - 验证固件:`PLSR_BOARD_TEST_SELECT=PLSR_BOARD_TEST_PHYSICAL_INPUT`(P19)。 - 初次自动验收接线:Y4→X0、Y5→X1、Y6→X2、Y7→X3。 - 为使用 MCU 侧 Y0~Y4 五通道同步采集,当前 P19 改为:Y1→X0、Y2→X1、Y3→X2、Y4→X3;Y0 保留为 Q0 脉冲。 - 当前输出公共端 COM0~COM4 接 0 V;输入公共端接 0 V。 - P19 通过 D1540~D1546 的心跳租约驱动 Y1~Y4,租约超时自动关闭全部验证输出。 - X 端扫描采用板卡实际电平语义:空闲为 0,端子有效为 1。 ### 16.2 自动测试 执行命令: ```powershell 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 提前切段、硬限位受控停止、错误码和完整末脉冲的验收结论。 ### 16.3 波形结论 - WAIT:Y0上升/下降沿各500,主频2000 Hz、周期500.00 µs;末脉冲完整,WAIT及X3释放后全低。 - EXT:初测发现末高电平223 µs截断;边界停机修复后复测通过,触发到停止约1.96 ms、总计514沿、无窄脉冲或残余。 - 正硬限位:触发后约3.79 ms进入50 ms受控减速,47个减速脉冲,49.21 ms停止;末脉冲2083.4 µs完整。 - 负硬限位:与正向对称,47个减速脉冲,49.20 ms停止;末脉冲2083.4 µs完整。 - 正/负限位减速周期由约520.8 µs单调增至3472.2 µs;停止后至少1 ms全低,所有用例均无小于1 µs窄脉冲。 ### 16.4 映射范围与限制 依据《实现PLSR指令.pdf》建立 X0~X12、X14~X17、X20 的 MCU GPIO 扫描映射;X13/PA14 是 SWDCLK,调试构建中不扫描。当前真机回环覆盖 X0~X3,其他已映射端子尚未逐点抽测;X21~X43 在现有资料中未取得可靠 MCU 管脚表,读取时返回数据访问错误,不做猜测映射。 Y→X 回环覆盖了 MCU输出、开集电极端子、公共端、实体输入端子、GPIO扫描和 PLSR `readBit` 的完整 电气链路,但不等同于机械限位开关、现场布线失效和安全回路认证。 ## 17. 2026-08-11 最终执行清单 除注明“波形沿用已验收证据”的项目外,下表均在最终工作区重新构建相应固件后执行;切换固件时 均重新编译、烧录并硬复位。报告更新后默认固件已恢复为 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 掉电保持。三项均不得写成已通过。