# PLSR Modbus / USB 长稳并发测试 本批测试用于在四轴 `PULSE/DIR` 持续运动时,同时施加 Modbus 状态轮询、32 位动态频率写入和可选 USB CDC OUT 流量。脚本不发送 `SAVE_CONFIG`,不会在运动中触发 Flash 擦写。 > 当前状态(2026-08-10):0x47只读诊断、USB CDC统计、USB中断优先级4及自动长稳脚本已完成代码和静态构建验证;30分钟及更长的Modbus/USB/四轴真机并发仍待执行,不能以脚本存在替代板测结论。 ## 固件诊断接口 Modbus RTU 新增只读功能码 `0x47`。请求 PDU 与 `0x03` 一样包含 `start word` 和 `quantity`,完整快照为 40 WORD;请求示例为 `47 00 00 00 28`。不存在写入口,也不占用 D/HD/FD 地址。 主要字段如下(32 位字段均为低 WORD 在前): | WORD | 内容 | |---:|---| | 0~3 | 签名 `0x4D42`、版本 1、长度 40、运行标志 | | 4~9 | 当前 Tick、最后有效帧 Tick、最后帧间隔 DWT 周期 | | 10~15 | DMA 接收重启次数、重启失败次数、最后 UART ErrorCode | | 16~19 | 最近重启 HAL 状态、拼帧长度、待处理帧长度、连接超时口径 | | 20~39 | 10 个完整 32 位统计:RX 事件、有效帧、TX 帧、CRC 错误、忽略站号、非法功能、非法地址、非法值、丢帧、UART 错误 | 固件内部也可调用 `ModbusSlaveGetRuntimeDiagnostics()` 获取这些诊断值。Cortex-M4 对齐的 32 位及更小字段保证单字段不撕裂;为避免阻塞运动中断,完整结构允许跨相邻 UART 事件,不应解释为事务级原子快照。USB CDC 提供 `CDC_GetRuntimeDiagnostics()`,记录 OUT 包/字节、接收重挂失败、发送请求/忙/失败/完成;USB OTG FS 中断优先级为 4,低于 PLSR 输出定时器优先级 1 和 TIM6 优先级 2。 同一组USB统计自动发布到控制窗口D1516~D1537,32位字段均为低WORD在前。D1516~D1517与D1536~D1537是首尾generation,读取时必须相同且为偶数;D1518为USB诊断版本1,D1519为`initialized`;D1520~D1535依次为`rxPacketCount`、`rxByteCount`、`rxRearmFailureCount`、`txRequestCount`、`txByteCount`、`txBusyCount`、`txFailureCount`、`txCompleteCount`。Host回归构建发布相同布局、版本和generation,但`initialized`及八个统计值固定为0。 ## 基本运行 本脚本只能配合专用 `P18 LONG_STRESS` 验证固件运行:编译前令 `PLSR_BOARD_TEST_SELECT=PLSR_BOARD_TEST_LONG_STRESS`,再编译、烧录并硬复位。P18 为四轴准备 K4 100 kHz 平台参数,保留 Q4~Q7 的 PULSE/DIR 方向映射,并明确禁用软限位和硬限位输入。不要使用 P14/P15/P17 固件运行长稳脚本;它们的 K1 软限位会在约 1,000,000 脉冲处按设计停止。 P18 是无软限位的台架耐久测试配置,只能在确认机构脱开、运动范围安全或仅连接逻辑分析仪时使用。默认 COM5、100 kHz、30 分钟: ```powershell python HostComputer\plsr_modbus_long_stress_test.py ``` 快速冒烟测试: ```powershell python HostComputer\plsr_modbus_long_stress_test.py --port COM5 --duration 60 ``` 脚本固定选择 P18 的 K4,自动完成四轴位置清零、重复序号幂等检查、COMMIT/START、状态一致性轮询、`0x10` 原子动态频率切换,并在结束时对四轴执行软件立即停止。停止清理会逐轴尝试,不会因为某一轴已经停止或应答异常而跳过后续轴。不会要求在 IAR Watch 中改值。 证据默认写入 `HostComputer/long_stress_logs/`: - CSV:每个采样点的四轴状态、频率、位置/任务/物理计数和 Modbus 32 位统计; - JSON:参数、事件、Modbus与USB设备端起止诊断快照、统计增量、USB主机发送量和最终状态。 ## 可选压力与恢复用例 USB CDC OUT 与 Modbus 并发(将 COM8 替换为实际 USB 虚拟串口): ```powershell python HostComputer\plsr_modbus_long_stress_test.py --port COM5 --duration 1800 --usb-port COM8 --usb-rate 64000 ``` 每 60 秒注入一次仅 CRC 错误的只读请求;固件必须静默丢弃,随后正常通信,`crcErrorCount` 每次至少加 1: ```powershell python HostComputer\plsr_modbus_long_stress_test.py --port COM5 --duration 600 --bad-crc-period 60 ``` 运行 120 秒时由主机主动关闭 COM5 3 秒,再重新连接;断线期间四轴脉冲计数必须继续增长: ```powershell python HostComputer\plsr_modbus_long_stress_test.py --port COM5 --duration 600 --disconnect-at 120 --disconnect-duration 3 ``` 三个压力项也可组合。故障注入默认关闭,避免日常回归意外中断通信。 ## 验收准则 - 脚本最终输出 `长稳 PASS`,CSV/JSON 均成功生成; - 全程轴 `error=0`、`last_result=0`,状态快照首尾 generation 相同且为偶数; - 四轴 `physical_pulses` 单调不回退,动态频率由 FC16 一次写两个 WORD; - 非故障注入基线下 `uart_errors`、`dropped_frames`、`restart_failures` 不增长;如增长,JSON 必须保留差值并按失败处理; - 开启坏 CRC 时,只允许 `crc_errors` 按注入次数增长,不得出现运动错误或通信失联; - 开启计划断线时,重连成功且断线期间四轴计数继续增长; - 开启 USB 时,脚本自动读取D1516~D1537起止快照:结束快照必须`initialized=1`,`rxPacketCount`与`rxByteCount`必须增长,`rxRearmFailureCount`不得增长;同时保留主机`bytes_written`且要求`write_errors=0`,无需IAR Watch; - 逻辑分析仪抽检 Q0~Q3:频率切换连续,无小于 1 us 窄脉冲、无串扰,停止后全低。 长稳结束后,若需要严格单任务脉冲总数,另跑 P14/P16 脚本和逻辑分析仪 200000 沿验收;本脚本以持续运行、通信恢复和计数单调性为目标。 ## 持久化专项边界 HSD Backup SRAM双检查点、SFD Flash A/B槽、generation、CRC和故障回退工具已完成代码与Host故障注入覆盖;破坏性持久化诊断在正式构建中默认关闭。真实VBAT断主电恢复、Flash擦写/坏CRC回退、异常复位清除`position_valid`以及反复保存对运动无抖动的板测仍未关闭,必须在所有轴安全停止时单独执行;本长稳脚本不会也不应在运动中发起Flash保存或擦除。