beb33ffe507e383f6cebfe97b42d5ceebc760811
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 实跑正常。
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:pysoem 收发裸 EtherCAT 帧的前提
- 一块直连从站的物理网卡(示例中为 Intel I226)
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 才会重新加载配置。
Languages
C
83.2%
Python
5.1%
HTML
4.2%
JavaScript
3.9%
CSS
3.4%
Other
0.2%