找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

手机号码,快捷登录

Flux电机有限元分析教程西莫团购入口 | 奖励入口当当网购物入口 | 奖励入口欢迎使用!西莫论坛App开放下载Motor-CAD电机多物理域设计教材购买入口 | 奖励入口
★新会员论坛须知★《西莫电机技术》第46期发售火热进行中
Flux电机电磁阀有限元分析教程团购入口 | 奖励入口论坛微信公众平台欢迎入驻
西莫电机及相关产品供需交流群开放邀请★ 论坛VIP会员申请 ★Motor-CAD.MANATEE电磁热振动噪声教程 | 奖励入口西莫团队欢迎您的加盟!
宣传推广合作请联系QQ:25941174西莫电机论坛微信群正式开放Flux变压器与电抗器有限元分析团购入口 | 奖励入口西莫电机论坛技术版区QQ群汇总
查看: 798|回复: 5

[分享] Motor-CAD 自动化扫描与多目标优化:完整调用链与六个必踩的坑

[复制链接]

该用户从未签到

发表于 2026-9-20 11:34 | 显示全部楼层 |阅读模式 来自: 中国江苏

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
做电机电磁设计的人大概都有这个经历:想看看某个参数的影响规律,就得在 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. 热电磁耦合的时机,大家一般怎么判断"电磁已经接近达标"?我现在用的是
   目标函数变化的阈值,感觉不够严谨

有做过的同行欢迎交流。

评分

参与人数 1西莫币 +6 收起 理由
清思玉 + 6 感谢分享

查看全部评分

西莫电机论坛微信公众平台正式上线!★详情请点击★ 西莫电机论坛会员交流专用群欢迎您西莫电机论坛加群请注明论坛用户名及所从事专业,否则不予通过

签到天数: 8 天

连续签到: 5 天

[LV.3]偶尔看看II

发表于 2026-9-20 21:52 | 显示全部楼层 来自: 中国
其实最近我也想搞一个辅助设计的工具出来,但是一直没有实行。主要有一个问题一直困扰我,就是如何确定一个方案的电流与超前角,如果一个个进行参数化扫描太慢了,所以我觉得要完成这个辅助工具首先得解决电流、超前角的问题,请问楼主有什么好的解决办法吗?
西莫电机论坛微信公众平台正式上线!★详情请点击★ 西莫电机论坛会员交流专用群欢迎您西莫电机论坛加群请注明论坛用户名及所从事专业,否则不予通过
回复

使用道具 举报

签到天数: 8 天

连续签到: 5 天

[LV.3]偶尔看看II

发表于 2026-9-21 13:46 | 显示全部楼层 来自: 中国
楼主第二个问题应该可以使用新版的自定义模板做到,就是类似于maxwell的自定义参数,用python画一个磁钢,定义他的尺寸,软件中就会有你定义好的尺寸变量
西莫电机论坛微信公众平台正式上线!★详情请点击★ 西莫电机论坛会员交流专用群欢迎您西莫电机论坛加群请注明论坛用户名及所从事专业,否则不予通过
回复

使用道具 举报

签到天数: 8 天

连续签到: 5 天

[LV.3]偶尔看看II

发表于 2026-9-21 13:51 | 显示全部楼层 来自: 中国
本帖最后由 交技能 于 2026-9-21 13:55 编辑
交技能 发表于 2026-9-20 21:52
其实最近我也想搞一个辅助设计的工具出来,但是一直没有实行。主要有一个问题一直困扰我,就是如何确定一个 ...


这个问题我以及解决了。还有另外的问题想请教楼主:按楼主所说,以及完成了相关案例,我主要是想问,楼主拟合的代理模型精度如何,是构建全局代码模型还是局部的代理模型,变量是多少个,采样点是多少个,优化算法如何选择?
西莫电机论坛微信公众平台正式上线!★详情请点击★ 西莫电机论坛会员交流专用群欢迎您西莫电机论坛加群请注明论坛用户名及所从事专业,否则不予通过
回复

使用道具 举报

签到天数: 8 天

连续签到: 5 天

[LV.3]偶尔看看II

发表于 2026-9-23 12:35 | 显示全部楼层 来自: 中国
为什么多目标优化环节,楼主不采用optislang呢
西莫电机论坛微信公众平台正式上线!★详情请点击★ 西莫电机论坛会员交流专用群欢迎您西莫电机论坛加群请注明论坛用户名及所从事专业,否则不予通过
回复

使用道具 举报

该用户从未签到

 楼主| 发表于 2026-10-8 09:05 来自手机 | 显示全部楼层 来自: 中国江苏
版权限制 黑盒子 看不到里面的东西  不能自动解决报错问题
西莫电机论坛微信公众平台正式上线!★详情请点击★ 西莫电机论坛会员交流专用群欢迎您西莫电机论坛加群请注明论坛用户名及所从事专业,否则不予通过
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

西莫电机论坛微信公众平台欢迎您的关注!

QQ|Archiver|手机版|小黑屋|西莫电机圈 ( 浙ICP备10025899号-3|浙公网安备33010502012192号 )

GMT+8, 2026-10-23 20:34 , Processed in 0.032147 second(s), 26 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表