# 知识库 — 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` 命中。教训: 未知输出先建立
"存在性探测"手段, 再穷举; 对照组 (已知图) 必不可少。
