From 85d326d44580db61985886bfeda7bd1037c46f2f Mon Sep 17 00:00:00 2001 From: cbb <2625274797@qq.com> Date: Thu, 3 Sep 2026 21:42:19 +0800 Subject: [PATCH] =?UTF-8?q?feat(motor):=20=E7=94=B5=E6=9C=BA=E6=8E=A7?= =?UTF-8?q?=E5=88=B6=E5=8F=B0=E5=89=8D=E7=AB=AF=20+=20=E5=90=8E=E7=AB=AF?= =?UTF-8?q?=E8=87=AA=E6=B5=8B=E8=84=9A=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit motor.html/motor.js: N1-N9 九节点控制台, 走 EtherCAT 过程数据(不经 WiFi/HTTP)。节点总览、CMD 控制(8 种 Control_Mode)、STATUS 实时解码、 示波器曲线、故障标签。样式复用 ecat.css(它与 ESP32 motor.css md5 一致), 不再拷第三份避免三处漂移; 本页专有的链路状态条/槽扫描指示走内联 style。 test_motor_backend.py: 不接硬件的后端自测, 假从站模拟 GD32 buildInput/processOutput, 覆盖 8 项(见 f09decc)。跑法: venv\Scripts\python.exe test_motor_backend.py --- motor.html | 411 +++++++++++++++ motor.js | 1098 +++++++++++++++++++++++++++++++++++++++++ test_motor_backend.py | 279 +++++++++++ 3 files changed, 1788 insertions(+) create mode 100644 motor.html create mode 100644 motor.js create mode 100644 test_motor_backend.py diff --git a/motor.html b/motor.html new file mode 100644 index 0000000..366ef3e --- /dev/null +++ b/motor.html @@ -0,0 +1,411 @@ + + + + + +电机控制台 (EtherCAT) — DCU LAN9252 + + + + + + + + + +
+
+ + 电机控制台 + EtherCAT PDO +
+
+
+ + 未连接 + 探测中… +
+
+
+ + +
+
+
+ + + ms +
+
+ + + ms +
+
+ 返回主页 + NODE - +
+
+ +
+ + 未连接 — 请先在 EtherCAT 主页点「连接」,再回到本页启动 PDO 循环 +
+ + +
+ + + + + +
+
+ CMD 控制 + ID 0x000-0200 · DLC 32 +
+
+
+
+ Control_Mode 控制模式 + + 速度+位置环联合控制,目标速度与目标角度同时生效 +
+
+ Limit_Voltage V · 0~65.535 + +
+
+ Target_Current mA + +
+
+ Target_Velocity deg/s + +
+
+ Target_Angle deg + +
+
+
+ PID 增益 P × 3 环 +
+
电流环 P
+
速度环 P
+
角度环 P
+
+
+
+ 快捷运行 → 目标角度 deg +
+ + + + + + + + + +
+
+
+ + + + POST /api/motor/send · CH0 +
+
+ + + +
+ +
+
+ + + + + +
+

+ CMD_CONFIG (0x000-0301) · DLC 24 · 每个操作发送单帧脉冲信号,操作前需确认 +

+
+ +
+ +
+
软件版本
--
+
硬件版本
--
+
Bootloader
--
+
+

+ 请求/回报共用 0x000-00FF(同 ID)· DLC 24 · major.minor.patch.build ×3 (soft/hard/boot)。 + 回报帧经输入 PDO 段 3「长帧快照」回传 —— 段 1 只有 8 字节,装不下 DLC 24。 +

+
+ +
+
+
+ 目标 Node ID + +
+ + +
+
连接设备后读取节点 ID
+

+ SET_NODE_ID (0x000N0400 DLC2) / GET_NODE_ID (0x000N0401 DLC2)。写入后 CAN ID 前缀变为 0x000Nxxxx。 +

+
+ + + +
+
+ + +
+
+
[就绪] EtherCAT 电机控制台 · 状态经输入 PDO 段 2 回传,命令经输出 PDO 批量区同周期下发
+
+
+
+
+ + +
+
+ STATUS 实时反馈 + 0x000-0100 · PDO +
+
+
+ + 节点离线 — 未收到 STATUS 帧 + 检查电机供电与 CAN 总线连接 +
+
+
+
+
--
+
deg
+
RT_Angle ▾ 波形
+
目标 -- deg
+
+
+
+
--
+
deg/s
+
RT_Velocity ▾ 波形
+
目标 -- deg/s
+
+
+
+
--
+
mA
+
RT_Current ▾ 波形
+
目标 -- mA
+
+
+
+
+
+
MCU_Temp▾ 曲线-- °C
+
+
+
+
+
Motor_Temp▾ 曲线-- °C
+
+
+
+
+
+
+ 三相电流 U / V / W +
+ U +0 mA + V +0 mA + W +0 mA +
+
+
+ +
+5A0-5A
+
+
+
+
Power_Voltage-- V
+
test_float--
+
test_U16--
+
+
+ + + + + --% +
+
CPU_Usage--
+
+
+
+
motStatus 使能—
+
magStatus 磁编码—
+
thermal 过温—
+
EEPROM 存储—
+
+
+
+
+
+ + + + + +
+ + + + + diff --git a/motor.js b/motor.js new file mode 100644 index 0000000..69f9626 --- /dev/null +++ b/motor.js @@ -0,0 +1,1098 @@ +/** + * 电机控制台(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 里的