# 知识库 — Motor-CAD 轴向磁通电机轴向磁拉力仿真 > 本文件是项目的核心知识沉淀,供人和任何 AI 工具阅读使用。 > 全部结论均经实测验证 (2026-08-25, Motor-CAD 2026R1);每条坑都真实踩过。 > 入口文件: 仓库根 AGENTS.md (AI) / README.md (人)。 ## 1. 环境事实 (本机实测) | 项 | 值 | |---|---| | Motor-CAD | 2026R1 (v261); 原机: `E:\Program Files\ANSYS Inc\v261\motorcad\MotorCAD.exe`; 复现机(2026-08-26): `D:\Program Files\ANSYS Inc\v261\motorcad\MotorCAD.exe` | | 定位方式 | 环境变量 `MOTORCAD_ACTIVEX` → activex.bat → exe 路径 (PyMotorCAD 自动发现); activex.bat 在 GUI 内 Defaults→Automation→Update to Current Version 后生成于 `%APPDATA%\Ansys\v261\motorcad\activex.bat`; 未注册时脚本内用 `set_motorcad_exe()` 回退 (axial_force_final.py 已内置, `MOTORCAD_EXE` 可覆盖) | | Python | 3.12 (系统), `pip install ansys-motorcad-core`; **或直接用 Motor-CAD 自带 Python** (含 pymotorcad 0.8.4, 免安装): `<安装根>\v261\motorcad\Python\Python\python.exe` | | 许可证 | FlexNet: `ANSYSLMD_LICENSE_FILE=1055@localhost` (机器级环境变量), lmgrd + **ansyslmd vendor daemon 都必须在跑**; 无许可时 Motor-CAD 启动后 ~30s 静默退出, pymotorcad 报 psutil.NoSuchProcess —— 见此报错先查 ANSYS License Management Center (http://localhost:1084) | | 非登录 shell 陷阱 | Kimi/Cursor 等 AI 工具的 shell 可能**不继承机器级环境变量** (MOTORCAD_ACTIVEX / ANSYSLMD_LICENSE_FILE 为空); 运行前 `export MOTORCAD_ACTIVEX="%APPDATA%\Ansys\v261\motorcad\activex.bat"` 和 `export ANSYSLMD_LICENSE_FILE=1055@localhost` | | 单次电磁求解耗时 | 88~112 s (原机) / 151 s (2026-08-26 复现机) | | PDF 排版 | Edge 无头: `msedge.exe --headless=new --print-to-pdf=...` (中文文件名会失败, 用 ASCII 名; 用 cmd /c 包住避免 PS 5.1 stderr 包装) | | PDF 目检 | `pip install pypdfium2 pillow`, 渲染 PNG 后人工/AI 看图 | | 注意 | python 脚本退出后 Motor-CAD 进程可能随之退出, 属正常 | | 窗口不可见陷阱 | pymotorcad 用 `MotorCAD.exe /PORT=n /SCRIPTING` 启动, 该模式**默认主窗口隐藏** (2026-08-26 双机 Win32 API 实测: 主窗口 IsWindowVisible=False, 任务栏图标是坐标 −32000 的代理窗口, 故"有图标但点不开")。脚本已在启动后调 `mc.set_visible(True)` 强制可见 (实测有效: 调后主窗口可见且在屏内); 对已在运行的隐形实例跑 `python show_motorcad.py` 召回 (attach 不新开实例、不打断求解)。若可见后仍找不到 = 真·挪到屏幕外: 点任务栏图标 → Win+↑ 最大化拉回 | ## 2. 核心方法: AFM 轴向力的唯一数据口 Motor-CAD 2026R1 对轴向磁通电机 (AFM) 的轴向力**没有输出变量、没有 2D 结果图、chm 帮助全文无 "Axial Force"** (110MB chm 反编译验证过)。唯一入口: ```python mc.get_magnetic_3d_graph_point(graph_name, section, node, timestep) # graph_name ∈ {Fr|Ft}_{Rotor|Stator}_{OL|OC}_Lumped ``` - **Fr (法向力) 就是轴向力**: AFM 的 2.5D 多切片模型把电机展开成直线电机, 沿用径向机命名。Ft 是切向力 (可由 Σ(Ft×r) 交叉核对转矩)。 - OL=负载, OC=空载开路 —— **一次求解两者全出**, 无需改电流跑两遍。 - 单位: N/节点/切片。节点数 = 转子极数 / 定子槽数 (本模型 10/12), x 为圆周角, **0° 与 360° 是同一节点, 求和须去重** (判据: `x[-1]-x[0]==360` 则丢末点)。 - **净轴向力 = 对全部去重节点求和, 再对全部径向切片求和**。 切片中心半径在 .mot 的 `AFM_SectionCentreRadius_Array[i]`。 - 求解前必须打开开关 (默认关, 关了没有任何力结果): `ElectromagneticForcesCalc_Load=True`, `ElectromagneticForcesCalc_OC=True` - 求解: `mc.do_magnetic_calculation()`。 ## 3. .mot 参数语义 (AFM 模板, 易错!) | 参数 | 语义 | 本模型值 | |---|---|---| | `Magnet_Length` | **磁钢轴向厚度** | 3 mm | | `Magnet_Thickness` | 磁钢环**径向深度** (=(D_out−D_in)/2), 不是厚度! | 13 mm | | `Magnet_Arc_[ED]` | 极弧 (电角度) | 121° (=24.2°mech, 67.2% 覆盖) | | `Pole_Arc` | 其它转子类型参数, **本模型不生效** | 150 (勿误读) | | `CurrentDefinition` | 1=RMS 口径 → **改电流设 `RMSCurrent`**, 改 `PeakCurrent` 无效且不报错 | 1 | | `Magnet_Temperature` | 磁钢温度, **模型默认 100°C (热态)** | 100 | | `Magnet_Br_at_20` / `Magnet_TBr_Coeff` | Br 及温度系数 | 1.31 T / −0.12 %/K | | `AFM_SectionCentreRadius_Array` | 径向切片中心半径 | 28.25 / 34.75 mm | 温度定律 F∝Br² 经实测精确成立 (100°C 实测 343N ↔ 由 20°C 折算 340N, <1%)。 ## 4. 图名/变量名探测技术 (通用, 遇到未知输出时用) 1. **报错文案筛查** (无需求解, 秒级): `get_magnetic_graph_point(名, 0)` — "Graph name does not exist" = 图不存在; "No points exist" = 存在但未求解。 注意: 某些图 (力图) 需先打开对应计算开关才注册。 2. **图 ID 枚举**: graph 参数可传 int; 求解后逐 ID 读波形按量级辨认 (本模型 id17=总转矩, id16=RMS 电流常量, id0-2=相电流)。 3. **权威清单**: GUI 内 Help → Graph Viewer (全部图名); Help → Automation Parameter Names / F2 (全部变量名)。 4. **exe 字符串挖掘**: MotorCAD.exe 的 UTF-16 字符串含图名后缀 (如 `_Axial_Force_Rotor`)、GUI 文案, PowerShell 正则可提取。 5. Motor-CAD 消息日志 (`<模型名>\MessageLogs\*.txt`) 记录每次 pymotorcad 调用, 但**重复错误行会被抑制**, 缺行不代表没调用。 6. pymotorcad 的 `get_magnetic_graph`(整线 API) 在 v261 上不可靠, **用 `get_magnetic_graph_point` 逐点读**。 ## 5. 新模型仿真工作流 (SOP) 1. 新模型 .mot 放仓库根, `git add` + **运行前先 commit**。 2. 复制/修改 `axial_force_final.py`: 改 `MOT_SRC`; 从新 .mot 里 grep `AFM_SectionCentreRadius_Array` 更新 `SEC_RADII_MM`; 节点数自动探测无需改。 3. 确认工况: 磁钢温度 (热态 100°C / 冷态 20°C, 按报告口径选)、RMS 电流、气隙。 4. 运行: `python -X utf8 axial_force_final.py` (Motor-CAD **前台**弹出, ~2 分钟; `--quit` 自动关闭)。 5. **三判据全过才采信** (脚本自动输出到 results JSON): - 作用-反作用: 定/转子合力反号, 偏差 <5% - 转矩交叉: Σ(Ft×r) vs 转矩图, 偏差 <10% - 解析量级: B²A/2μ0 与 FEA 同量级 (解析偏高 ~1.15~1.2× 属正常) 6. 结果记录纪律 (见 §7): 时间戳 + 简要说明 + git 提交。 7. 需要气隙敏感性/磁负刚度: 参照 `axial_compare.py` (扫气隙+有限差分)。 8. 报告: 参照 `docs/report_axialforce_V2.html` 改数据数组 → Edge 无头出 PDF → 文件名带新版本号, 旧版保留。 ## 6. 已有成果与对照 (2026-08-25 定版) 模型 `MARS-12S10P_SSSR_D76-C150_V5.0-0819.mot` (12槽10极 SSSR, 气隙1mm, 磁钢 3mm/67.2%, 5000rpm, 21A RMS): | 工况 | 转子净轴向力 (指向定子) | 数据文件 | |---|---|---| | 100°C, 1.0mm, 空载 | 342.9 N (纹波峰峰 3.5N) | axialforce_final_0825_212518.json | | 100°C, 1.0mm, 负载 21A | 343.2 N (+0.1%) | 同上 | | 20°C, 0.6/1.0/1.5mm 空载 | 513.1 / 416.5 / 326.7 N | compare_results_0825_215456.json | | 磁负刚度 @1mm, 20°C | ~207 N/mm (中心差分) | 同上 | 对照《轴向磁拉力计算与轴承选型校核报告 V3.0-20260826》(解析法, 仓库根): **同温度基准下 FEA/解析 = 0.85~0.86 (三气隙稳定)** —— 磁路法系统性偏高 ~16% (不计齿槽/边缘/侧漏), 结论"对得上"; 轴承结论链 (708AC 疲劳寿命不足 → 推荐 7004AC) 双方互证。唯一修正建议: 600N 设计载荷依据应为 "低温+气隙公差包络 (最恶劣 −20°C+0.6mm ≈563N)", 而非"电枢反应+20%" (FEA 实测仅 +0.07%)。详见 docs/COMPARISON_V3.md。 ### 复现验证 (2026-08-26, 第二台机器) 另一台机器 (Motor-CAD 装于 D: 盘, 无 MOTORCAD_ACTIVEX 初始注册, 需先修许可) 按 SOP 原样重跑 `axial_force_final.py`, 求解 150.9 s: | 工况 | 转子净轴向力 | 与 08-25 定版比对 | |---|---|---| | 100°C, 1.0mm, 空载 | 342.9 N (纹波峰峰 3.53 N) | **完全一致** | | 100°C, 1.0mm, 负载 21A | 343.2 N (纹波峰峰 3.87 N) | **完全一致** | 三判据全过: 作用-反作用偏差 1.70%/1.69% (<5%), 转矩交叉 0.505 vs 0.522 Nm (3.2%, <10%), 解析 485 N ≈ 1.41× FEA (同量级)。 数据: axialforce_final_0826_130316.json。**结论: 方法与结果跨机可复现。** ## 7. 项目纪律 (硬性) 1. **每次运行仿真前 git commit** (脚本改动先入库再跑)。 2. **结果与报告必须带时间戳 + 简要说明, 并 git 提交**: 结果 JSON/CSV 文件 名含时间戳 (脚本自动); 提交信息写清"什么工况、什么结果、为什么跑"; 报告文件名带版本号 (V1/V2...), **出新版保留旧版不覆盖**。 3. Motor-CAD **前台运行**, 跑完保持打开供人工检查 (`--quit` 显式关闭)。 4. 生成物 (output_motorcad/, *.log) 不入库; 结果 JSON 的关键数值要转录进 RESULTS.md / 报告 (入库的文档) 里。 5. 对话与决策带时间戳记入 docs/CONVERSATION_LOG.md。 6. 原始 .mot 只读; 一切修改在另存的时间戳副本上进行。 ## 8. 探索过程档案 (为什么是这个方法) 5 轮探测的完整过程见 git 历史 (dc56046→22658e4) 与 docs/CONVERSATION_LOG.md。速览: 猜变量名(败) → 报错文案筛查法(建立) → 114 图名全不存在 → 图 ID 枚举锁定 51 条波形无一像力 → 开力开关后按径向机 命名惯例猜 3D 图 → `Fr_Rotor_OL_Lumped` 命中。教训: 未知输出先建立 "存在性探测"手段, 再穷举; 对照组 (已知图) 必不可少。