fix(motor): 清掉存量 4ms PDO 周期缓存, 测试对齐 pcore_mask
- transport-ecat: localStorage 的 dcu_ecat_period_ms 是 Python 时代默认 4ms 存进去的(browser_check_period.mjs 收尾也写 "4"), native 后端默认 已改小, 存量 "4" 会在每次 ensureStarted 把总线压回旧默认。加一次性 迁移标记 dcu_ecat_period_mig, 只删一次; 之后显式设 4 视为用户选择。 "恢复默认"从 setPdoPeriod(4) 改为删键跟随后端默认(固件修好前别低于 1ms)。 - test_motor_transport: 自旋钉核显示早已改用快照字段 pcore_mask(P 核), 测试还停在 ecore_mask 旧字段旧措辞, 本次对齐(含跨 32 位掩码、不连续 核号区间用例)。 验证: node scripts/test_motor_transport.mjs 66/66 通过。
This commit is contained in:
@@ -119,8 +119,13 @@ export function createEcatTransport(ctx) {
|
||||
const LS_SPIN = "dcu_ecat_spin";
|
||||
/* 保存的 PDO 周期(ms,允许亚毫秒 float,如 0.25=4kHz)。用户把周期调到
|
||||
* 内核级档位后存这儿,后端重启、循环重开时原样带回 —— 用户要的
|
||||
* "后续随时可用"不该每次手敲一遍。恢复默认 = setPdoPeriod(4)。 */
|
||||
* "后续随时可用"不该每次手敲一遍。恢复默认 = 删掉这个键,跟随后端默认。 */
|
||||
const LS_PERIOD = "dcu_ecat_period_ms";
|
||||
/* LS_PERIOD 的一次性迁移标记:Python 时代默认 4ms 曾被存进来(检查脚本
|
||||
* browser_check_period.mjs 收尾就写 "4"),native 后端默认已改小,
|
||||
* 存量 "4" 会在每次 ensureStarted 把总线压回旧默认 4ms。只删一次,之后
|
||||
* 再设 4 视为用户显式选择,原样保留。 */
|
||||
const LS_PERIOD_MIG = "dcu_ecat_period_mig";
|
||||
let started = false; // 后台循环是否已启动
|
||||
let lastSnapshot = null; // 最近一次快照,供 fetchFeedback 复用(不重复打后端)
|
||||
|
||||
@@ -212,6 +217,12 @@ export function createEcatTransport(ctx) {
|
||||
if (reqPeriodMs) body.period_ms = reqPeriodMs;
|
||||
else {
|
||||
try {
|
||||
if (!localStorage.getItem(LS_PERIOD_MIG)) {
|
||||
if (parseFloat(localStorage.getItem(LS_PERIOD)) === 4) {
|
||||
localStorage.removeItem(LS_PERIOD);
|
||||
}
|
||||
localStorage.setItem(LS_PERIOD_MIG, "1");
|
||||
}
|
||||
const v = parseFloat(localStorage.getItem(LS_PERIOD));
|
||||
if (v > 0) body.period_ms = v;
|
||||
} catch (_) { /* 隐私模式忽略 */ }
|
||||
@@ -483,6 +494,9 @@ export function createEcatTransport(ctx) {
|
||||
* 切走本传输:**故意不停后台 PDO 循环**。
|
||||
* 从站 SM2 有 1000ms 过程数据看门狗,停超 1 秒会 OP→SAFEOP 掉线报 AL 0x001B;
|
||||
* 用户只是切到 WiFi 看看,不该把 EtherCAT 链路打断。
|
||||
* 真正该停的时机是"整个 app 关掉"—— 由服务端的 app 租约负责:
|
||||
* 最后一个 app 窗口断开后 esp32_server 会调 /api/op/stop 停循环并退回 INIT,
|
||||
* 这里(页面内)什么都不用做。
|
||||
*/
|
||||
async teardown() { started = false; lastSnapshot = null; },
|
||||
|
||||
@@ -536,7 +550,7 @@ export function createEcatTransport(ctx) {
|
||||
* 亚毫秒周期自动就是自旋节拍(内核睡眠粒度 ~0.5ms 跑不出 250µs)。
|
||||
*
|
||||
* 取值存 localStorage:后端重启后 ensureStarted 会原样带回。
|
||||
* 恢复默认:tp.setPdoPeriod(4)。
|
||||
* 恢复默认:删掉 dcu_ecat_period_ms,跟随后端默认(固件修好前别低于 1ms)。
|
||||
*/
|
||||
async setPdoPeriod(ms) {
|
||||
const v = Number(ms);
|
||||
|
||||
Reference in New Issue
Block a user