您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符
 
 
 
 
 
 

6.2 KiB

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 wordquantity,完整快照为 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依次为rxPacketCountrxByteCountrxRearmFailureCounttxRequestCounttxByteCounttxBusyCounttxFailureCounttxCompleteCount。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/

  • CSV:每个采样点的四轴状态、频率、位置/任务/物理计数和 Modbus 32 位统计;
  • JSON:参数、事件、Modbus与USB设备端起止诊断快照、统计增量、USB主机发送量和最终状态。

可选压力与恢复用例

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=0last_result=0,状态快照首尾 generation 相同且为偶数;
  • 四轴 physical_pulses 单调不回退,动态频率由 FC16 一次写两个 WORD;
  • 非故障注入基线下 uart_errorsdropped_framesrestart_failures 不增长;如增长,JSON 必须保留差值并按失败处理;
  • 开启坏 CRC 时,只允许 crc_errors 按注入次数增长,不得出现运动错误或通信失联;
  • 开启计划断线时,重连成功且断线期间四轴计数继续增长;
  • 开启 USB 时,脚本自动读取D1516~D1537起止快照:结束快照必须initialized=1rxPacketCountrxByteCount必须增长,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保存或擦除。