diff --git a/README.md b/README.md index e2e5c98..ac0c14d 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,6 @@ -# ecat — DCU LAN9252 EtherCAT 主站工具集 +# dcu-ecat-master + +**DCU LAN9252 EtherCAT 主站工具集**(工作目录 `DCU/tools/ecat`) 在 Windows 上用 Python + pysoem(SOEM)直接从网卡驱动 DCU 的 LAN9252 EtherCAT 从站: 扫描总线、读写 SII EEPROM、CoE SDO 读写、PDO 循环收发,以及一个本地网页/桌面控制台。 @@ -26,6 +28,9 @@ venv\Scripts\python.exe -m pip install -r requirements.txt | `ecat_flash_eeprom.py` | 通过网线烧写 `gen_eeprom.py` 生成的 SII 镜像,逐字回读校验(烧完需断电重启让 ESC 重新加载) | | `ecat_sniff.py` | 旁路抓包,hexdump SOEM 自己发出的帧,用于对照裸帧格式 | | `_probe_wedge.py` | 邮箱楔死现场逐环节定位:A 写 SM0 的 WKC → B `0x220` bit0 是否置位 → C SSC 是否清事件并置 SM1 就绪 → D SM1 是否滞留旧响应,用于区分 ESC 硬件楔死与 SSC 软件死循环 | +| `_probe_wedge2.py` | 按真实邮箱协议探测:查写邮箱空 → 写满 256B → 验事件/响应 | +| `_probe_stuck.py` | 验证「SM1 响应滞留 → 邮箱死锁」假说:复现失败 → 手动读走 SM1 清 bit3 → 再读是否恢复 | +| `_probe_scan.py` | 扫描定位响应帧头在 SM1 RAM 中的确切偏移,同步 dump SM0 请求侧 | ## 启动方式 diff --git a/_probe_scan.py b/_probe_scan.py new file mode 100644 index 0000000..34af8e9 --- /dev/null +++ b/_probe_scan.py @@ -0,0 +1,69 @@ +"""_probe_scan.py — 精确定位响应帧头在 SM1 RAM 的偏移 + SM0 请求侧同步 dump。""" +import struct +import sys +import time + +import ecat_server as es +import pysoem + +r = es.api_open({"substr": "I226"}) +if not r.get("ok"): + sys.exit(1) +m = es.g_master +s = m.slaves[0] + + +def fprd(addr, size): + try: + return bytes(s._fprd(addr, size, 20000)) + except Exception: + return None + + +def sm_reg(addr): + d = fprd(addr, 8) + if d is None: + return None + start, length = struct.unpack("> 3 & 1})", flush=True) + +# 同步看 SM0 侧(请求是否被读走) +st0 = sm_reg(0x0800) +print(f"SM0 st=0x{st0['st']:02X}(bit3={st0['st'] >> 3 & 1})", flush=True) + +es.api_close({}) +print("DONE", flush=True)