Aspen HYSYS 二次开发系列教程2COM 对象模型逐层拆解——两个 ProgID 入口不可混用版本声明块软件aspenONE V15基线同第 1 篇文档现实公开手册为 Customization Guide V7.32011-03V8–V15 无公开更新版语言/环境Python(pywin32) VBA未证实属性名一律标注未证实并给本机 dir() 自查步骤本文目标把对象四层链从概念变成可导航的结构说清两个 ProgID 的语义差异铁律 2一句话结论HYSYS COM 对象链是 Application → SimulationCase一个 case 文档经ActiveDocument或 ProgIDHYSYS.SimulationCase进入→ Flowsheet → Operations/Streams 容器两个 ProgID 语义不同——HYSYS.Application面向应用与文档生命周期HYSYS.SimulationCase直接面向 case——混用会在多窗口/多 case 场景产生操作对象挂错文档的事故。〇、本篇要解决的认知问题ActiveDocument和 ProgIDHYSYS.SimulationCase直连的区别是什么Operations 与 Streams 两个容器的索引语义Item(“Feed”)在什么情况下会拿不到对象多 case/多窗口场景下当前文档的判定规则是什么——脚本为什么会操作错文件对象生命周期关闭 case 后引用还在吗释放顺序有什么要求属性访问失败Object doesn’t support this property的排查路径是什么一、机制解析1.1 四层链与两个入口价值锚点多窗口事故都源于把当前活动当目标文档Application (ProgID: HYSYS.Application) ← 应用层文档生命周期、可见性 │ ├─ ActiveDocument → SimulationCase ← 入口A当前活动 case受 GUI 焦点影响 │ └─ ProgID: HYSYS.SimulationCase ← 入口B直接面向一个 case 实例 │ Flowsheet稳态流程容器 ├─ Operations.Item(Feed) ← 单元操作集合按名索引 └─ MaterialStreamFlowsheetStreams ← 流股集合按名索引两个入口的语义差异入口 A 的ActiveDocument是应用当前活动文档——GUI 里切换窗口会改变它脚本若假设 ActiveDocument 就是目标 case在多窗口场景会读写错对象。入口 B 直接绑定一个 case不依赖 GUI 焦点——自动化服务必须用 B或显式遍历 Application.Documents 找目标。1.2 Item() 索引失败的三种情形现象根因Item(“Feed”) 返回空/报错名称与 GUI 定义不一致大小写、后缀——以本机为准铁律 7稳态脚本在动态 case 上取不到单元两模式可用单元不同第 12 篇属性不存在该对象类不支持此属性——未证实属性名不可照搬旧文档1.3 生命周期与释放顺序经验法则先取数据、后关 case引用在 case 关闭后失效。脚本收尾顺序读结果 → 保存如需→ Close/Exit。跨版本时 ProgID 不带版本号解析到当前安装版本——这既是便利也是风险铁律 1报告里写实际运行版本。二、完整代码与逐行剖析2.1 显式绑定目标 case避免 ActiveDocument 陷阱可运行importwin32com.client appwin32com.client.Dispatch(HYSYS.Application)# 应用层入口铁律 3位数一致# ——多窗口安全写法遍历文档找目标 case不依赖 GUI 焦点——targetNonefordocinapp.Documents:# Documents 集合以本机为准ifmycaseinstr(getattr(doc,FileName,)):targetdoc;breakiftargetisNone:raiseSystemExit(target case not open — ActiveDocument fallback NOT safe here)streamtarget.Flowsheet.MaterialStreamFlowsheetStreams.Item(Feed)# 名称以本机为准铁律 7print(T:,stream.Temperature.Value,P:,stream.Pressure.Value)逐行要点Documents遍历与FileName匹配是服务形态的最小守卫直接ActiveDocument只适合单窗口手动场景。2.2 VBA 对照官方一手路线的显式文档引用Sub BindCase() Dim app As Object, doc As Object Set app GetObject(, HYSYS.Application) 连接已运行实例不存在则 CreateObject For Each doc In app.Documents 以本机集合名为准未证实处自查 If InStr(doc.FileName, mycase) 0 Then Set target doc: Exit For End If Next Debug.Print target.Flowsheet.MaterialStreamFlowsheetStreams.Item(Feed).Temperature.Value End Sub2.3 属性自查方法铁律 7 的可执行形态Pythonprint([a for a in dir(stream)])VBA用对象浏览器或CallByName试探。判定标准练习用对 “Feed” 流股列出 ≥10 个属性并确认 Temperature/Pressure 在列——凡不在列的属性名不得写进脚本。三、常见报错与排查“Object doesn’t support this property or method”—— 根因照搬旧文档属性名V7.3 手册时代的名称在新版本可能不存在或对象类不匹配铁律 7。解法本机 dir() 自查未证实处标注以本机实测为准。多窗口读写错 case—— 现象结果与 GUI 显示不一致。根因ActiveDocument 随焦点变化1.1。解法显式遍历 Documents 绑定目标服务场景禁用 ActiveDocument。Item(“Feed”) 拿不到对象—— 根因名称大小写或流股在另一 case。解法先列容器成员再索引——把名字当契约管理第 19 篇命名约定。case 关闭后引用报错—— 现象脚本后半段崩溃。根因生命周期顺序错误1.3。解法读结果→保存→Close不要在 Close 后取值。四、动手练习显式绑定复现开两个 case用 2.1 脚本绑定目标。判定标准输出与 GUI 一致且切换焦点后仍正确——这就是服务形态的最小验证。属性清单自查对 Feed 流股输出 dir() 全清单存档。判定标准≥10 属性凡本文示例用过的属性Temperature、Pressure在清单内不在清单内的旧文档属性名全部标注未证实。思考题无标准答案为什么 ProgID 不带版本号是双刃剑验证要点清单① 写出晚期绑定解析机制② 说明报告版本与运行版本可能不一致的场景③ 给出多版本共存时锁定版本的办法对照 Aspen Plus 系列铁律 1。五、小结与下一篇预告本篇确立两个 ProgID 入口的语义差异与显式绑定纪律把ActiveDocument 陷阱钉死为多窗口事故根因。下一篇进入 VBA 环境启用与第一个宏——包括那个最容易被误认为 bug 的默认禁用状态铁律 4。本篇认知问题回显FAQQ1HYSYS COM 对象链的四层结构是什么AApplication应用与文档生命周期→ SimulationCase一个 case 文档经 ActiveDocument 或 ProgID HYSYS.SimulationCase 进入→ Flowsheet → Operations/Streams 两个按名索引的容器。Q2HYSYS.Application 和 HYSYS.SimulationCase 两个 ProgID 的区别是什么AHYSYS.Application 面向应用与文档生命周期ActiveDocument 受 GUI 焦点影响HYSYS.SimulationCase 直接绑定一个 case 实例——多窗口自动化必须用后者或显式遍历 Documents混用会读写错文档铁律 2。Q3脚本为什么会在多窗口场景操作错文件AActiveDocument 是当前活动文档随 GUI 焦点变化服务形态应显式遍历 Application.Documents 按 FileName 绑定目标 case不依赖焦点。Q4Item(“Feed”) 拿不到对象的常见原因是什么A名称与 GUI 定义不一致大小写或后缀、流股属于另一 case、或稳态脚本在动态 case 上取单元两模式可用对象集不同——先列容器成员再索引把名称当契约管理。Q5HYSYS COM 对象的属性访问失败如何排查A用本机 dir()Python或对象浏览器VBA枚举该对象支持的属性——凡不在清单内的旧文档属性名一律标注未证实V7.3 手册时代的属性名在 aspenONE V15 可能不存在。