- 积分
- 2548
- 回帖
- 0
- 西莫币
-
- 贡献
-
- 威望
-
- 存款
-
- 阅读权限
- 40
- 最后登录
- 1970-1-1
该用户从未签到
|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
做电机电磁设计的人大概都有这个经历:想看看某个参数的影响规律,就得在 Motor-CAD 里
改一个值、点一次计算、抄一次结果,反复几十遍。单次电磁仿真十几秒看着不快,
但乘以参数组合数量,一下午就没了,而且抄数据本身容易出错。
这篇帖子里我把用 COM 接口把 Motor-CAD 做成自动化优化引擎的完整过程写出来,
重点放在踩过的坑上——这些坑网上资料很少,但每一个都能让你卡住半天。
──────────────────────────────────
【一、为什么必须自动化】
先说量级,不然体会不到痛点在哪。
一个三变量问题,每变量取 5 个水平,就是 125 个设计方案。单次电磁仿真约 17 秒,
光计算时间就是 35 分钟,再加人工改参数、读结果、记录的时间,实际要按天算。
如果加上热校验(每次 40~60 秒),时间还要翻几倍。
而且手工扫描有个致命问题:你不知道下一个该试哪里。参数响应经常是非单调的,
存在陡峭的深谷和尖峰,按固定步长扫很容易整个跳过去。
自动化解决的就是这两件事:把算力打满 + 让算法决定采样点。
──────────────────────────────────
【二、完整调用链】
这是经过反复验证能跑通的顺序,缺一步就可能出问题:
import win32com.client
mc = win32com.client.Dispatch("MotorCAD.AppAutomation")
# 1. 加载模型
mc.LoadFromFile(r"D:\model.mot")
# 2. 切到电磁上下文
mc.ShowMagneticContext()
# 3. 切到 Scripting 显示页
mc.DisplayScreen("Scripting")
# 4. 设参数
mc.SetVariable("Slot_Depth", 8)
# 5. 计算
mc.CalculateMagnetic()
# 6. 取结果(推荐导出 CSV,比逐个 GetVariable 可靠)
mc.ExportResults("EMagnetic", r"D:\result.csv")
# 7. 保存
mc.SaveToFile(r"D:\model_out.mot")
看着很简单,但每一行背后都有讲究。
──────────────────────────────────
【三、六个必踩的坑】
【坑 1:直接 SetVariable 然后计算,参数被吞掉】
现象:脚本没报错,参数也"设置成功"了,但计算结果跟没改一样。
原因:Motor-CAD 必须处于正确的显示上下文和页面状态下,参数设置才会生效。
只 Dispatch 上来就直接设参,值会被忽略。
解法:严格按 LoadFromFile → ShowMagneticContext → DisplayScreen('Scripting')
的顺序走完,再设参。这三步不是可选的装饰,是前提。
──────────────────────────────────
【坑 2:GetVariable 对部分变量返回 -2】
现象:读绕组相关参数时,返回值是 -2,不是报错也不是真实值,很容易被当成
合法数据继续算下去,最后结果全错。
受影响的变量包括:每线圈匝数、每槽导体数、并联支路数、极数、槽数、相数等。
原因:这些变量不支持通过 GetVariable 读取。
解法:改从 .mot 文件里解析。.mot 是纯文本格式的键值对,直接读文件更稳:
MagTurnsConductor=12
ConductorsPerSlot=24
ParallelPaths=4
Pole_Number=20
Slot_Number=24
number_of_phases=3
踩这个坑的代价是:如果没注意 -2,前面的优化结果全部作废。
──────────────────────────────────
【坑 3:内部变量名和 GUI 显示名不一致】
现象:GUI 里明明写着 Magnet_Arc_[ED],脚本里照抄却设不进去。
原因:部分是内部名和显示名不同。带方括号的往往是显示名。
解法:老老实实做一张映射表,别猜。比如内部名 Magnet_Arc_ED 对应
GUI 里的 Magnet_Arc_[ED]。
另外还有个更隐蔽的:有些参数是真旋钮,有些是假旋钮。
真旋钮(改了确实生效):
VSimpleWidth、Stator_Bore、Airgap、Tooth_Width、Slot_Depth
假旋钮(GUI 上能改,但脚本设了没效果):
Magnet_Thickness、UShape_BridgeThickness、Pole_V_Angle
这个只能靠实测确认,官方文档里不会写。
──────────────────────────────────
【坑 4:SaveAs / Save 会失败】
现象:保存模型时报错或者静默失败。
解法:用 SaveToFile(path)。
──────────────────────────────────
【坑 5:Dispatch 会静默新开实例(最危险的一个)】
现象:你以为连上了当前打开的那个 Motor-CAD,实际上它新开了一个实例。
为什么危险:
1. Motor-CAD 是单窗口软件,多开会互相干扰
2. 许可证是 node-locked 的,多开的实例会抢占席位
3. 新开的实例很可能是无证空壳,脚本看着在跑,实际什么也算不出来
更麻烦的是:GetActiveObject 永远不可用——Motor-CAD 不注册到
Running Object Table,所以你没法"附着到已有实例",只能 Dispatch。
解法:
- 连接前后核对进程数,确认没有多开
- GUI 已经开着的时候,不要 Dispatch
- 需要重开时,先优雅关闭原窗口
- 绝对不要用 taskkill 强杀——会泄漏 node-locked 许可席位
这一条我吃过大亏,四个空壳窗口同时开出来,许可证直接占满。
──────────────────────────────────
【坑 6:Scripting 页里脚本找不到 MotorCAD 对象】
现象:脚本在 GUI 里手动跑没问题,贴到 Scripting 页里跑就报没有
MotorCAD 对象,而且不报错、静默失败。
原因:Scripting 页执行脚本时,宿主会按 Defaults.INI 里的
External_Python_Exe 去拉起外部 Python,并且会清掉环境变量。
如果 pywin32 只装在用户自己的 site-packages 目录,宿主环境下就不可见,
于是宿主自建的 COM API 引导就失败。
解法:把 External_Python_Exe 指向 ANSYS 捆绑的那个 Python
(它的 pywin32 在任何环境都可见)。改这个配置之前先优雅关掉 Motor-CAD。
顺带的经验:如果要交付脚本给别人用,**写成纯 ASCII 单文件、零依赖、
直接贴 Scripting 页就能跑**是最稳的形态。外部驱动版(自己写 win32com 客户端)
只适合自己在本机批量跑,不适合交付。
──────────────────────────────────
【四、优化算法怎么选】
流程通了之后,下一个问题是"下一个点该算哪里"。三种候选生成方式,适用场景不同:
网格扫描
适合变量少(≤3 个)、范围已知、想要完整响应曲面的场合。缺点是维度一高就爆炸。
进化算法(NSGA-II)
适合多目标。转矩、效率、脉动、电流密度这几个目标之间本身是冲突的,
不存在"全都更好"的单点解,需要的是 Pareto 前沿。
顺带提一个坑:pymoo 装不完整(缺 termination 模块)时会直接崩,
如果不想折腾环境,用 numpy 手写一个 NSGA-II 也就两三百行。
贝叶斯优化(GP + 期望改进 EI)
适合仿真代价高的场合。用高斯过程拟合已有采样点,用 EI 准则挑"最可能变好
且不确定性大"的点,用最少的仿真次数逼近最优。变量多、单次仿真慢的时候,
这个比网格扫描省得多。
──────────────────────────────────
【五、工程上的两个约束】
【单任务串行】
因为 Motor-CAD 只能开一个实例,优化任务必须串行。切换任务前要先关掉前一个。
所以做会话管理时需要一个跨进程的持久化单例守卫,防止两个任务同时抢实例。
【热校验的时机】
热仿真一次 40~60 秒,比电磁慢好几倍。如果每个候选点都做热电磁耦合,
时间会失控。
做法:先用纯电磁扫描,等电磁指标接近达标了,再对少数几个候选做热校验。
这样能省掉绝大部分热仿真次数。
──────────────────────────────────
【六、结果怎么呈现】
跑完一堆数据,如果只是甩一个 CSV 出去,没人看得懂。至少要给两张图:
Pareto 散点图:展示目标之间的权衡关系,让决策者看到"要效率就得牺牲脉动"
这类取舍。
收敛曲线:展示最优值随迭代次数的变化,判断算法是否已经收敛。
最后包成一个自包含的 HTML 报告(图内联,不依赖外部资源),发出去直接能看。
──────────────────────────────────
【七、两个真实案例的数据】
案例一:110 机座无刷直流电机,转矩脉动优化
三变量扫描(磁厚、极弧角、气隙),单次仿真 17 秒。
把转矩脉动从基线压到 8.84%(打进 10% 以内)。
过程中发现极弧角存在强非线性——在 120° 附近有个陡深谷底,
115° 时脉动是 51.6%,120° 掉到 13.6%,125° 又窜到 64.5%。
手工按 5° 步长扫,很容易整个跳过谷底。这就是自动化的价值。
案例二:某 20 极 24 槽无框力矩电机,多目标优化
跑了 4 轮共 53 个真实设计方案。这个机型的核心矛盾是:
空载转速和最大扭矩存在根本性物理权衡(NL ∝ V/Ke,T ∝ 磁链,
两者乘积近似恒定),没有设计能同时严格提升两者。
最终选 Pareto 折中点:
系统效率 87.97% → 90.40% (+2.4 个百分点)
空载转速 3010 → 3019 rpm (+0.32%)
最大扭矩 9.44 → 9.86 Nm (-0.34%,持平)
定子轭部磁密 1.795T → 1.033T (限值 1.9T,余量大)
这里有个必须说明的细节:该机型的绕组是按槽满率定义的
(Wdg_Definition = Copper_Slot_Fill)。改槽深会改变槽面积,
Motor-CAD 会自动重算线径以维持槽满率——基线 0.938mm 变成 1.104mm,
铜耗下降,这部分解释了效率的提升。
如果想保证绕组完全不变,必须改用固定线径定义。否则你会误以为
效率提升全部来自几何优化,实际上掺了绕组重算的贡献。
──────────────────────────────────
【八、小结】
整条链路的关键点,按重要性排:
1. 调用链顺序不能省(坑 1),这是能否跑通的根本
2. 实例管理要严(坑 5),这是最危险的,涉及许可证
3. 变量读取要绕过 GetVariable(坑 2),否则结果静默出错
4. 算法按场景选,别拿网格扫描硬扛高维问题
5. 热校验延后,省时间的大头在这里
6. 结果要给图,否则数据没人看
──────────────────────────────────
【九、想请教的问题】
1. 假旋钮(Magnet_Thickness、Pole_V_Angle 等)有没有更规范的设置途径?
目前只能靠 VBS 导出之类的方式绕,不够干净
2. 有没有人成功让 Motor-CAD 支持并行多实例?单窗口串行的限制在批量优化时
真的是瓶颈
3. 热电磁耦合的时机,大家一般怎么判断"电磁已经接近达标"?我现在用的是
目标函数变化的阈值,感觉不够严谨
有做过的同行欢迎交流。 |
评分
-
查看全部评分
|