本批测试用于在四轴 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 分钟:
python HostComputer\plsr_modbus_long_stress_test.py
快速冒烟测试:
python HostComputer\plsr_modbus_long_stress_test.py --port COM5 --duration 60
脚本固定选择 P18 的 K4,自动完成四轴位置清零、重复序号幂等检查、COMMIT/START、状态一致性轮询、0x10 原子动态频率切换,并在结束时对四轴执行软件立即停止。停止清理会逐轴尝试,不会因为某一轴已经停止或应答异常而跳过后续轴。不会要求在 IAR Watch 中改值。
证据默认写入 HostComputer/long_stress_logs/:
USB CDC OUT 与 Modbus 并发(将 COM8 替换为实际 USB 虚拟串口):
python HostComputer\plsr_modbus_long_stress_test.py --port COM5 --duration 1800 --usb-port COM8 --usb-rate 64000
每 60 秒注入一次仅 CRC 错误的只读请求;固件必须静默丢弃,随后正常通信,crcErrorCount 每次至少加 1:
python HostComputer\plsr_modbus_long_stress_test.py --port COM5 --duration 600 --bad-crc-period 60
运行 120 秒时由主机主动关闭 COM5 3 秒,再重新连接;断线期间四轴脉冲计数必须继续增长:
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_errors 按注入次数增长,不得出现运动错误或通信失联;initialized=1,rxPacketCount与rxByteCount必须增长,rxRearmFailureCount不得增长;同时保留主机bytes_written且要求write_errors=0,无需IAR Watch;长稳结束后,若需要严格单任务脉冲总数,另跑 P14/P16 脚本和逻辑分析仪 200000 沿验收;本脚本以持续运行、通信恢复和计数单调性为目标。
HSD Backup SRAM双检查点、SFD Flash A/B槽、generation、CRC和故障回退工具已完成代码与Host故障注入覆盖;破坏性持久化诊断在正式构建中默认关闭。真实VBAT断主电恢复、Flash擦写/坏CRC回退、异常复位清除position_valid以及反复保存对运动无抖动的板测仍未关闭,必须在所有轴安全停止时单独执行;本长稳脚本不会也不应在运动中发起Flash保存或擦除。