Files
DCU_ECAT_Master/README.md
T
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

75 lines
4.3 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# dcu-ecat-master
**DCU LAN9252 EtherCAT 主站工具集**(工作目录 `DCU/tools/ecat`)
在 Windows 上用 Python + pysoem(SOEM)直接从网卡驱动 DCU 的 LAN9252 EtherCAT 从站:
扫描总线、读写 SII EEPROM、CoE SDO 读写、PDO 循环收发,以及一个本地网页/桌面控制台。
## 环境准备
- Python 3.12(venv 不入库)
- [Npcap](https://npcap.com/):pysoem 收发裸 EtherCAT 帧的前提
- 一块直连从站的物理网卡(示例中为 Intel I226)
```bat
py -3.12 -m venv venv
venv\Scripts\python.exe -m pip install -r requirements.txt
```
## 目录结构
```
ecat/
├─ ecat_server.py 网页控制台后端(REST API + 静态文件), 默认端口 8090
├─ ecat_tool.py 一体化命令行主站
├─ ecat_flash_eeprom.py 经网线烧写 SII 镜像(被 ecat_tool flash 复用)
├─ test_motor_backend.py 电机后端自测(不接硬件)
├─ web/ 前端资源(URL 路径不变, 仍是 / 与 /motor.html)
├─ diag/ 独立诊断脚本(互不依赖, 直接单跑)
├─ launch/ 双击入口(.bat/.vbs)
└─ venv/ 本地虚拟环境(不入库)
```
根目录只放主程序:`ecat_tool.py` import `ecat_flash_eeprom`、
`test_motor_backend.py` import `ecat_server`,这几个互相 import 的必须同层,
挪进子目录就得改 import 或加包,不值得。
| 文件 | 说明 |
|------|------|
| `ecat_tool.py` | 一体化命令行主站:`adapters` / `status` / `flash` / `eeprom` / `sdo` / `send` 等子命令 |
| `ecat_server.py` | 网页控制台后端(REST API + 静态文件),默认端口 **8090**(8080 已被 ESP32 tools 占用) |
| `ecat_flash_eeprom.py` | 通过网线烧写 `gen_eeprom.py` 生成的 SII 镜像,逐字回读校验(烧完需断电重启让 ESC 重新加载) |
| `test_motor_backend.py` | 电机后端自测,**不接硬件**(假从站模拟 GD32 buildInput/processOutput)。跑法:`venv\Scripts\python.exe test_motor_backend.py` |
| `web/ecat.html` + `web/ecat.css` | 网页控制台前端 |
| `web/motor.html` + `web/motor.js` | 电机控制台:N1–N9 九节点,走 EtherCAT 过程数据(不经 WiFi/HTTP)。节点总览、8 种 Control_Mode、STATUS 实时解码、示波器曲线 |
| `diag/ecat_scan.py` | 最小化 bring-up 扫描:从站身份 + SII dump,`--op` 追加 PDO 测试 |
| `diag/ecat_esc_regs.py` | 从**网络侧**直读 LAN9252 ESC 寄存器,绕开 GD32/PDI,用于判断 EEPROM 加载是否真的失败;支持 `--reload` |
| `diag/ecat_sniff.py` | 旁路抓包,hexdump SOEM 自己发出的帧,用于对照裸帧格式 |
## 启动方式
双击 `launch/` 里的入口即可(脚本自己会定位到项目根,不必在特定目录下运行):
| 入口 | 效果 |
|------|------|
| `launch/ecat_app.vbs` | pywebview 桌面窗口,无控制台无浏览器标签(已针对部分 GPU 驱动白屏加 `--disable-gpu-compositing`) |
| `launch/ecat_web.vbs` | 后台起服务并打开浏览器标签,无控制台窗口 |
| `launch/ecat_web.bat` | 控制台模式,可见日志,调试用 |
| `launch/ecat.bat` | 命令行工具入口,如 `ecat.bat status`、`ecat.bat flash` |
| `launch/run_scan.bat` | 直接跑 bring-up 扫描,无参数则列出 Npcap 适配器 |
电机控制台在服务起来后从主页右上「电机控制台」进入,或直接访问 `/motor.html`。
它只读写 EtherCAT 过程数据,需先在主页点「连接」并让从站进入 OP。
## 注意
- ESC 的 SyncManager 寄存器是 `0x0800 + 8n`:邮箱是 SM0=`0x0800`、SM1=`0x0808`,
`0x0810`/`0x0818` 是 SM2/SM3(过程数据)。写诊断代码时别混用,否则抓到的现场会误导判断。
- **邮箱楔死判据**:SM0/SM1 寄存器正常(start=0x1000/0x1200、act=01)但 SDO 持续失败,
就是 SSC 的 `u16EscAddrSendMbx` 错位——响应帧写到 SM1 start+4/+8 且逐会话累积,
断电才清零。固件 <1.5.52 无自愈需断电重启,1.5.52+ 有守护自动写回。
`config_map` 失败时后端会自动转储 4 个 SM 现场,可直接对照。
- 前端 CSS/JS 改动后记得 bump `?v=` 缓存版本,否则浏览器会加载旧代码。
`web/ecat.css` 被 `web/ecat.html` 与 `web/motor.html` 共用,两处版本号要一起改。
- EEPROM 烧写后必须断电冷启动,ESC 才会重新加载配置。