/** * 电机控制台(EtherCAT 传输)— tools/ecat/motor.js * * 与 tools/ESP32/js/motor/main.js 的关系: * **解码器与编码器逐字节相同**(decodeStatus / decodeConfig / buildCmdBytes / * parseVersionPayload 等),因为那是 DBC 定义的报文格式,与传输无关,改一处 * 就必须改两处 —— 所以这里是刻意的原样复制,不做"优化"。 * 不同的只有传输层:ESP32 页走 HTTP /can/send_batch + /motor/state, * 本页走 EtherCAT 过程数据 /api/motor/{start,stop,state,send,rx}。 * * 传输层要点: * 1. 状态不是"请求-应答",而是后台 PDO 循环持续把从站输入 PDO 解出来存快照, * 本页只是按 #refreshRate 读那个快照。因此"界面刷新"与"总线节拍(PDO 周期)" * 是两个独立概念,不要混为一谈。 * 2. 后台循环必须一直跑:从站 SM2 有 1000ms 过程数据看门狗,停超 1 秒就会 * OP→SAFEOP 掉线报 AL 0x001B。所以进页面即自动启动循环。 * 3. 发送走批量区:一次提交的多帧会被服务端塞进同一个 PDO 周期的批量发送区, * 在**同一个 seq 沿**由从站一次性发出,这是多轴同步下发的前提。 * * 经典脚本(非 module):与 motor.html 里的