Commit Graph
4 Commits
Author SHA1 Message Date
cbb beb33ffe50 refactor: 按角色分 web/ diag/ launch/ 三层, 根目录只留主程序
18 个文件平铺根目录太乱, 按角色归拢:
  web/     ecat.html/css + motor.html/js —— 前端资源
  diag/    ecat_scan / ecat_sniff / ecat_esc_regs —— 独立诊断脚本, 互不依赖
  launch/  5 个 .bat/.vbs 双击入口
根目录只留 ecat_server / ecat_tool / ecat_flash_eeprom / test_motor_backend:
这几个互相 import(tool→flash_eeprom, test→server), 挪进子目录就得改 import
或加包, 收益不抵成本。

配套改动:
  _STATIC_MAP 的值加 web/ 前缀 —— URL 路径刻意保持不变(/、/ecat.css、
  /motor.html), 页面内相对引用、书签、外部链接一律不用改。
  launch/ 里 %~dp0 现在指向 launch\, 五个启动器统一改为先取上一层作 ROOT
  (bat 用 %~dp0.., vbs 用两次 GetParentFolderName), run_scan 顺带指向
  diag\ecat_scan.py。

验证: 7 个 py 全编译通过; test_motor_backend 8 项全通过; 服务实起后 6 条
静态路由全 200 且 MIME 正确(js 是 application/javascript)、404 兜底正常;
Edge headless 渲染主页与 motor 页, CSS 294 规则加载、9 个节点样式生效、
零加载失败零 JS 异常; bat/vbs 的 ROOT 解析实测指到项目根, 五个目标文件
全部命中; ecat_tool adapters 与 diag/ecat_scan.py 实跑正常。
2026-09-03 22:08:38 +08:00
cbb f09decc127 feat(server): CANFD 批量收发区 + 电机控制台后端 API
PDO 布局扩展(与 GD32 1.5.56 对齐):
  段2 [48..383]  CANFD 批量发送区 —— 多帧共用一个 seq 沿, 从站在同一次
                 processOutput 里先发单帧再发批量, 9 帧 DLC32 由原来 9 个
                 周期压缩到 1 个周期。
  段4 [360..639] CANFD 批量接收区 —— 一周期回收多帧, 支持 DLC64 满长 CANFD,
                 带 lost/pending 计数。
  单帧区 [0..47] 布局不动, 批量区 count=0 时逐字节兼容 1.5.55, 老主站与
  CAN 调试页行为不变。

新增 API: /api/can/{send,state} 与 /api/motor/{start,stop,state,send,rx};
电机 PDO 后台循环靠滚动窗口扫 27 个槽, 命令走队列按 seq 沿下发。
ecat.html 加「电机控制台」入口与「CAN 转发」标签页。

test_motor_backend.py 8 项全通过(不接硬件, 假从站模拟 GD32 buildInput/
processOutput): DLC32 不截断、滚动窗口扫全槽、STATUS 32B 完整回传、
队列不互相覆盖、循环可干净停止、批量同步下发、DLC64 回收、1.5.55 兼容。
2026-09-03 21:42:07 +08:00
cbb a1ec486c74 fix(server): 修模块级变量粘连, op/start 入口预清理重枚举
1) g_op_active = Falseg_httpd = None 这行把 None 赋给了 g_op_active 和
   笔误变量 Falseg_httpd, 导致 g_httpd 在模块级从未定义, 第 744 行
   if g_httpd is not None 在服务启动前命中即 NameError。拆成两行。
   语法合法故初次提交未拦住。

2) _require_op_ready 入口无条件预清理(回 INIT + config_init 重枚举):
   同一连接反复停止/启动而不重枚举时从站邮箱通路逐轮退化, 第 4 轮
   config_map() 内 SOEM CoE 分段读的无边界 memcpy 吃到楔死邮箱异常帧
   触发 0xC0000005 闪退。置于入口使所有调用方全覆盖, 单从站成本 ~100ms。
   op_start 的重试分支因此简化为直接重跑序列。

3) config_map 失败时附带邮箱 SM 寄存器现场, 便于对照 GD32 串口日志。
   地址按 SM = 0x0800 + 8n 修正为 SM0=0x0800 / SM1=0x0808;
   原写的 0x0810/0x0818 实为 SM2/SM3(过程数据), 抓的现场会误导判断。
2026-09-03 02:35:24 +08:00
cbb d594b8fd94 init: DCU LAN9252 EtherCAT 主站工具集
现有工具纳入版本管理:
- ecat_tool.py: 一体化命令行主站(status/flash/eeprom/sdo/send)
- ecat_server.py + ecat.html/css: 网页/桌面控制台(端口 8090)
- ecat_scan.py / ecat_esc_regs.py / ecat_sniff.py: bring-up 扫描、
  网络侧 ESC 寄存器诊断、裸帧抓包对照
- ecat_flash_eeprom.py: 经网线烧写 SII 镜像 + 逐字校验
- *.bat / *.vbs 启动入口

新增 .gitignore(排除 venv/ 与 __pycache__)、.gitattributes(不改写换行符)、
requirements.txt(锁定 pysoem 1.1.13 等依赖)、README.md。
2026-09-03 01:56:29 +08:00