Files
DCU_ECAT_Master/README.md
T
cbb 979da72181 refactor: 入口提到根目录, 代码收进 src/
上一版把入口塞进 launch/、代码摊在根目录, 正好反了: 双击入口该第一眼看到,
实现细节该收起来。现在:
  根目录  5 个 .bat/.vbs 入口 + README + requirements
  src/    ecat_server / ecat_tool / ecat_flash_eeprom / test_motor_backend
  src/web    前端资源      src/diag   独立诊断脚本

启动器改为 cd 进 %~dp0src 再跑(vbs 用 CurrentDirectory = base & "\src"),
工作目录落在 src 才能让 tool→flash_eeprom、test→server 的 import 解析到。
ecat_server.py 的 BASE_DIR 取自 __file__, 与 src/web 仍是同层父子关系,
_STATIC_MAP 和窗口模式的子进程 spawn 都无需改动。

.gitignore 补 sii.json / *.sii / eeprom_*.bin —— eeprom read --out 的导出
产物, 属运行结果不该入库。

验证: 7 个 py 全编译通过; test_motor_backend 8 项全通过; ecat.bat 与
run_scan.bat 实跑列出适配器; 服务起后 4 条静态路由 200 且 MIME 正确;
Edge headless 渲染主页与 motor 页, CSS 294 规则、9 节点样式生效, 零加载
失败零 JS 异常; bat 的 %~dp0 与 vbs 的 GetParentFolderName 实测均落在
项目根, src/ 下五个目标文件全部命中。
2026-09-03 22:27:23 +08:00

83 lines
4.7 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
```
## 目录结构
入口在最外层,双击即用;代码全部收进 `src/`。
```
ecat/
├─ ecat_app.vbs ← 桌面窗口(推荐)
├─ ecat_web.vbs ← 浏览器标签
├─ ecat_web.bat ← 控制台模式(看日志)
├─ ecat.bat ← 命令行工具
├─ run_scan.bat ← bring-up 扫描
├─ README.md / requirements.txt
├─ src/
│ ├─ 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/ 独立诊断脚本(互不依赖, 直接单跑)
└─ venv/ 本地虚拟环境(不入库)
```
`src/` 根下那四个 .py 平放是有原因的:`ecat_tool.py` import `ecat_flash_eeprom`、
`test_motor_backend.py` import `ecat_server`,互相 import 的必须同层,再往下分
就得改 import 或做成包,不值得。
| 文件 | 说明 |
|------|------|
| `src/ecat_tool.py` | 一体化命令行主站:`adapters` / `status` / `flash` / `eeprom` / `sdo` / `send` 等子命令 |
| `src/ecat_server.py` | 网页控制台后端(REST API + 静态文件),默认端口 **8090**(8080 已被 ESP32 tools 占用) |
| `src/ecat_flash_eeprom.py` | 通过网线烧写 `gen_eeprom.py` 生成的 SII 镜像,逐字回读校验(烧完需断电重启让 ESC 重新加载) |
| `src/test_motor_backend.py` | 电机后端自测,**不接硬件**(假从站模拟 GD32 buildInput/processOutput)。跑法:在 `src/` 下 `..\venv\Scripts\python.exe test_motor_backend.py` |
| `src/web/ecat.html` + `ecat.css` | 网页控制台前端 |
| `src/web/motor.html` + `motor.js` | 电机控制台:N1–N9 九节点,走 EtherCAT 过程数据(不经 WiFi/HTTP)。节点总览、8 种 Control_Mode、STATUS 实时解码、示波器曲线 |
| `src/diag/ecat_scan.py` | 最小化 bring-up 扫描:从站身份 + SII dump,`--op` 追加 PDO 测试 |
| `src/diag/ecat_esc_regs.py` | 从**网络侧**直读 LAN9252 ESC 寄存器,绕开 GD32/PDI,用于判断 EEPROM 加载是否真的失败;支持 `--reload` |
| `src/diag/ecat_sniff.py` | 旁路抓包,hexdump SOEM 自己发出的帧,用于对照裸帧格式 |
## 启动方式
双击根目录下的入口即可(脚本自己定位路径,不必在特定目录下运行):
| 入口 | 效果 |
|------|------|
| `ecat_app.vbs` | pywebview 桌面窗口,无控制台无浏览器标签(已针对部分 GPU 驱动白屏加 `--disable-gpu-compositing`) |
| `ecat_web.vbs` | 后台起服务并打开浏览器标签,无控制台窗口 |
| `ecat_web.bat` | 控制台模式,可见日志,调试用 |
| `ecat.bat` | 命令行工具入口,如 `ecat.bat status`、`ecat.bat flash` |
| `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=` 缓存版本,否则浏览器会加载旧代码。
`src/web/ecat.css` 被 `ecat.html` 与 `motor.html` 共用,两处版本号要一起改。
- EEPROM 烧写后必须断电冷启动,ESC 才会重新加载配置。