cbb
|
a56b702d83
|
feat!: Python 后端整体切换为原生 C/SOEM 守护进程(ecat_native)
big-bang 迁移(硬约束: Npcap 网卡独占, 无法双主站并存), 四阶段真机验收的
完整契约与对拍记录见 MIGRATION.md —— Python 已删, 该文件是唯一行为基准。
- 新增 ecat_native.c: 与 Python 同构的全路由 native 守护 —— 总线生命周期
open/close/status/op.start/op.stop, 电机 motor.start/stop/spin/state/
send/rx/period/dbg, can/send|state, 配置维护 sdo/eeprom.read|write|
verify/flash/sync_diag, 静态托管 src/web, shutdown/focus/--parent-pid
看门狗/独立启动清场/端口漂移; 独占 8090 即生产链路。PDO 热循环天花板
~5kHz → ~7kHz。
- 删除 src/ecat_server.py(2826 行)、src/test_motor_backend.py(684 行)、
ecat_app.vbs(桌面窗口随 pywebview 依赖一并移除): Python 后端不留副本。
- 编码回归改金标准: native_enc_diff.py 对照 native_enc_golden.json
(阶段 2 与 Python _fill_can_out 逐字节对拍通过后固化, 不碰网卡),
当场抓掉 json_tok 不跳闭合引号会静默丢 motor/send 参数的真 bug。
- build_native.bat: 编译前跑 gen_eeprom.py 生成 eeprom_image.h 供 native
#include —— 同一生成器同一套断言, 断言失败构建中止; 改 SII 重跑即可。
- 修 flash 探针字历史隐患(本文件与 ecat_native.c 同步改): SCRATCH_WORD
0x0200 实际落在 TxPDO 类别区内部(类别区已长到 0x0281), 单独跑 eeprom
探针不烧录会把真数据擦成空洞; 移到 SII END 之后的 0x0400。
- 启动器 ecat_web.vbs/bat 改拉 build_native\ecat_native.exe
(--substr I226 --web src\web)。
- 收录 soem-src wpcap 链接库(vendored, 构建必需)。
两轮回归修复(细节见 MIGRATION.md):
1) op/start 卡 AL 0x001B(SM 看门狗): 固件"自己写 1s 看门狗"的假设破产,
do_op_start 第 5 步改为 ~5ms 节奏喂帧 ≥1s 再请求 OP, 24s 两次失败
变 1.2s 进 OP。
2) OP 态数据冻结(从站 PDI_Isr SM2 分支被旗标挡住, 固件侧根因): 主站加
楔死看门狗(输出窗口轮转 + 回显冻结 128 周期判死)与 /api/motor/state
自动恢复(10s 冷却, 快照新增 wr 字段)。
已知差异: SDO 失败文本无 pysoem abort code 粒度; 250µs 亚毫秒周期从站
吃不下, 修复前勿用。build_native/ 构建产物入 .gitignore, 由脚本重建。
|
2026-09-05 16:01:15 +08:00 |
|
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 |
|
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 |
|