通过原生 COM 接口自动化 Aspen HYSYS V11,从零搭建并求解简单流程、严格精馏塔、胺包吸收塔及含循环反应的全流程,并落盘 .hsc 工况文件。
✓已通过基础校验
名称、分类、版本与作者信息完整,安装包与文档齐备。
✓可直接使用
提供 Markdown 文档与配置示例,下载后按文档说明使用即可。
全部结论在 Aspen HYSYS V11.0 (37.0) 上用
hysys.tlb类型库 + 真实工况逐节点实测。
全部结论在 Aspen HYSYS V11.0 (37.0) 上用hysys.tlb类型库 + 真实工况逐节点实测。
动手前先读references/v11_com_recipes.md——那里是验证过的配方,本文件是索引 + 铁律。
动手前先读references/v11_com_recipes.md——那里是验证过的配方,本文件是索引 + 铁律。
逐版本原始证据(实验输出、对照变体、旧结论推翻记录)在references/changelog.md,日常不必读。
逐版本原始证据(实验输出、对照变体、旧结论推翻记录)在references/changelog.md,日常不必读。
| 能不能 | 内容 | 证据 |
|---|---|---|
| Can or Cannot | Content | Evidence |
| ✅ | 简单模块从零搭建并连通:混合器/泵/加热/冷却/闪蒸/三相分离/阀/三通/管段/压缩机/膨胀机/组分分流器/Gibbs/循环/SET/BALANCE/电子表格 | examples/02 真机全链路收敛 |
| ✅ | 简单模块从零搭建并连通:混合器/泵/加热/冷却/闪蒸/三相分离/阀/三通/管段/压缩机/膨胀机/组分分流器/Gibbs/循环/SET/BALANCE/电子表格 | examples/02 真机全链路收敛 |
| ✅ | 严格塔(精馏/吸收/萃取)从零搭成可收敛塔:入口必须是 LoadColumnTemplate(<真实 .col/.tpl 文件路径>),它一次建好塔板段/冷凝器/再沸器 + 内部流股 + 子求解器 + 进料产品端口(+ 列规格);随后修进料端口(§3.8.4)。v2.3.0 已做到与 GUI 手工工况逐位一致 |
苯-甲苯 30 板塔从零收敛(examples/18);乙苯-苯乙烯 68 板真空塔从零搭出,顶/底组成与教程 .hsc 偏差 0.0(examples/26,§3.8.7) |
| ✅ | 严格塔(精馏/吸收/萃取)从零搭成可收敛塔:入口必须是 LoadColumnTemplate(<真实 .col/.tpl 文件路径>),它一次建好塔板段/冷凝器/再沸器 + 内部流股 + 子求解器 + 进料产品端口(+ 列规格);随后修进料端口(§3.8.4)。v2.3.0 已做到与 GUI 手工工况逐位一致 |
苯-甲苯 30 板塔从零收敛(examples/18);乙苯-苯乙烯 68 板真空塔从零搭出,顶/底组成与教程 .hsc 偏差 0.0(examples/26,§3.8.7) |
| ✅ | 胺包(酸性气体-化学溶剂)吸收塔从零搭成并求解:走 MEA-Absorber.tpl 模板 + cf.Pressures=<list> 压力剖面 + 母流程直读产品。曾经被误判为"COM 不可解",v2.1.0 已推翻 |
天然气脱硫脱碳塔从零收敛,H₂S/CO₂ 脱除率 99.6%/98.0%(examples/24,columns.md §3.2) |
| ✅ | 胺包(酸性气体-化学溶剂)吸收塔从零搭成并求解:走 MEA-Absorber.tpl 模板 + cf.Pressures=<list> 压力剖面 + 母流程直读产品。曾经被误判为"COM 不可解",v2.1.0 已推翻 |
天然气脱硫脱碳塔从零收敛,H₂S/CO₂ 脱除率 99.6%/98.0%(examples/24,columns.md §3.2) |
| ✅ | 整条工艺(含塔 + 循环 + 反应)从空白工况从零搭成并收敛 | 第八章三案例全部达标(§3.9),examples/19~23 |
| ✅ | 整条工艺(含塔 + 循环 + 反应)从空白工况从零搭成并收敛 | 第八章三案例全部达标(§3.9),examples/19~23 |
| ✅ | 反应集:在空白模板阶段继承自带目标反应的捐献工况 → 会话里只改参数 | 13 个对照变体定案(§3.9.7) |
| ✅ | 反应集:在空白模板阶段继承自带目标反应的捐献工况 → 会话里只改参数 | 13 个对照变体定案(§3.9.7) |
| ⚠️ | cf.Operations.Add 手工装配塔内结构:能造出三个对象名,但未接入塔内部网络(cond.LiquidStream 直接 E_FAIL、求解后产品全 -32767) |
6 轮实证(§3.8.1) |
| ⚠️ | cf.Operations.Add 手工装配塔内结构:能造出三个对象名,但未接入塔内部网络(cond.LiquidStream 直接 E_FAIL、求解后产品全 -32767) |
6 轮实证(§3.8.1) |
| ⚠️ | 对含塔工况用 COM 改进料:视工况而定。异丙苯全流程改苯进料正常重收敛(examples/17);个别工况(三氯乙烷萃取 .hsc)会失效(examples/13)→ 改完做 §3.8.3 三项校验 |
examples/13 / examples/17 |
| ⚠️ | 对含塔工况用 COM 改进料:视工况而定。异丙苯全流程改苯进料正常重收敛(examples/17);个别工况(三氯乙烷萃取 .hsc)会失效(examples/13)→ 改完做 §3.8.3 三项校验 |
examples/13 / examples/17 |
| ✅ | 含塔流程「打开即用」:打开 GUI 已收敛的含塔工况 → 读取/另存/改非塔侧 | examples/13 / examples/15 |
| ✅ | 含塔流程「打开即用」:打开 GUI 已收敛的含塔工况 → 读取/另存/改非塔侧 | examples/13 / examples/15 |
| ✅ | 简捷塔 shdistop「打开即用」:打开 GUI 已配好的含简捷塔工况 → 读产品 / 重解 / 另存 |
乙苯-苯乙烯双塔跑通(examples/25,§3.10) |
| ✅ | 简捷塔 shdistop「打开即用」:打开 GUI 已配好的含简捷塔工况 → 读产品 / 重解 / 另存 |
乙苯-苯乙烯双塔跑通(examples/25,§3.10) |
| ✅ | 简捷塔「骨架继承」(v2.3.0 新增):从含简捷塔的工况剥离其余单元 → 得到「只剩简捷塔 + 必要流股」的骨架 → 之后任意改进料/负荷,纯度自动保持(塔本体的回收率类规格仍不可改) | 乙苯-苯乙烯骨架进料 ×1.5 → 顶/底产品精确 ×1.5、纯度逐位不变(§3.10.6) |
| ✅ | 简捷塔「骨架继承」(v2.3.0 新增):从含简捷塔的工况剥离其余单元 → 得到「只剩简捷塔 + 必要流股」的骨架 → 之后任意改进料/负荷,纯度自动保持(塔本体的回收率类规格仍不可改) | 乙苯-苯乙烯骨架进料 ×1.5 → 顶/底产品精确 ×1.5、纯度逐位不变(§3.10.6) |
| ❌ | 简捷塔的列级规格 COM 不可读写(塔板数/进料板/回流比/关键组分回收率/操作压力)——运行时接口就是通用 _IOperation |
v2.3.0 三层证据:① 反向 GetTypeInfo(0) = _IOperation(严格塔 = ColumnOp);② Classification = 8 = oc_ShortCutColumn(严格塔 = 9 = oc_SubFlowsheet);③ 可解析成员 19 vs 35。另:GetUserVariable / OpenStorage / Moniker 三条私有存储通道全死(§3.10.1) |
| ❌ | 简捷塔的列级规格 COM 不可读写(塔板数/进料板/回流比/关键组分回收率/操作压力)——运行时接口就是通用 _IOperation |
v2.3.0 三层证据:① 反向 GetTypeInfo(0) = _IOperation(严格塔 = ColumnOp);② Classification = 8 = oc_ShortCutColumn(严格塔 = 9 = oc_SubFlowsheet);③ 可解析成员 19 vs 35。另:GetUserVariable / OpenStorage / Moniker 三条私有存储通道全死(§3.10.1) |
| ❌ | 不能靠 COM 从零定义一座可求解的简捷塔:Add(name,'shdistop') 建得出对象,但规格填不进去 |
§3.10 |
| ❌ | 不能靠 COM 从零定义一座可求解的简捷塔:Add(name,'shdistop') 建得出对象,但规格填不进去 |
§3.10 |
结论:「简单流程」与「严格塔」都能用 COM 从零搭(塔走
.col模板入口,§3.8.4)。
结论:「简单流程」与「严格塔」都能用 COM 从零搭(塔走.col模板入口,§3.8.4)。
另:「空白工况」不能靠SimulationCases.Add()造,要"捡"一张干净现成.hsc当模板(§3.8.5)。
另:「空白工况」不能靠SimulationCases.Add()造,要"捡"一张干净现成.hsc当模板(§3.8.5)。
Operations.Add(名字, 内部类型名) 是两个参数,类型名是 HYSYS 内部小写串Operations.Add(名字, 内部类型名) 是两个参数,类型名是 HYSYS 内部小写串SimulationCases.Add()(新工况里物性包拿不到组分 →SimulationCases.Add()(新工况里物性包拿不到组分 →heaterop/coolerop 用 Duty(且先挂 EnergyStream);heaterop/coolerop 用 Duty(且先挂 EnergyStream);.hsc(含求解结果),否则无法在 HYSYS 里复核。.hsc(含求解结果),否则无法在 HYSYS 里复核。.hsc 内改接:单元一旦接好 FeedStream/ProductStream(或 mixer 的.hsc 内改接:单元一旦接好 FeedStream/ProductStream(或 mixer 的mixerop.EqualizePressures(头号静默杀手):两股进料压力不同时写它 →mixerop.EqualizePressures(头号静默杀手):两股进料压力不同时写它 →ReactionSets.Add() 建的对象**一律抛ReactionSets.Add() 建的对象**一律抛fs.op('E-100','heaterop') 裸建时 PressureDropfs.op('E-100','heaterop') 裸建时 PressureDropCurrentIteration 恒 0 = "塔拒绝迭代",先查两件事:CurrentIteration 恒 0 = "塔拒绝迭代",先查两件事:pip install pywin32
DispatchEx 后必须轮询 app.Version 直到可读。DispatchEx 后必须轮询 app.Version 直到可读。AspenHysys.exe,下次跑前先清:AspenHysys.exe,下次跑前先清:不要硬编码 ProgID 和安装路径。 先跑探测:
不要硬编码 ProgID 和安装路径。 先跑探测:
python scripts/hysys_discovery.py # 人类可读报告
python scripts/hysys_discovery.py --json # 给脚本消费
python scripts/hysys_discovery.py --refresh # 忽略缓存重扫
三级探测(可信度从高到低):① 注册表 ProgID HKCR\HYSYS.Application[.Vxx.y] → CLSID →
LocalServer32 → exe(唯一能确定 COM 连得上);② 卸载项(识别内部版本号 V11=37.0);
③ 文件系统 Program Files\AspenTech、X:\Aspen V* 找 AspenHysys.exe(兜底诊断)。
结果缓存 7 天(skill 目录 .hysys_installs.json)。
三级探测(可信度从高到低):① 注册表 ProgID HKCR\HYSYS.Application[.Vxx.y] → CLSID →
LocalServer32 → exe(唯一能确定 COM 连得上);② 卸载项(识别内部版本号 V11=37.0);
③ 文件系统 Program Files\AspenTech、X:\Aspen V* 找 AspenHysys.exe(兜底诊断)。
结果缓存 7 天(skill 目录 .hysys_installs.json)。
HysysClient 默认就开着自动探测,正常写代码不用管:
HysysClient 默认就开着自动探测,正常写代码不用管:
h = HysysClient(visible=False) # 自动挑最优版本
h = HysysClient(version=11) # 锁定 V11
h = HysysClient(progid="HYSYS.Application.V12.0")
h.install_report() # 打印版本/路径/ProgID/兼容提示
连接失败会自动换候选 ProgID 重试。⚠️ 若报告里全是 [未注册],说明装了但 COM 没注册:
手工启动一次 HYSYS,或在安装目录执行 AspenHysys.exe /RegServer。
版本兼容(compat_notes(major)):V8/V9 类型名与 V10+ 基本一致;V12+ 若 op.Duty 取不到
改用 op.DutyValue 或 op.EnergyStream.HeatFlow;V15 未逐节点实测,遇不匹配照 recipes §4.1 逐个试。
连接失败会自动换候选 ProgID 重试。⚠️ 若报告里全是 [未注册],说明装了但 COM 没注册:
手工启动一次 HYSYS,或在安装目录执行 AspenHysys.exe /RegServer。
版本兼容(compat_notes(major)):V8/V9 类型名与 V10+ 基本一致;V12+ 若 op.Duty 取不到
改用 op.DutyValue 或 op.EnergyStream.HeatFlow;V15 未逐节点实测,遇不匹配照 recipes §4.1 逐个试。
```python
from hysys_client import HysysClient
from basic_modules import Flowsheet
with HysysClient(r"C:\Cases\demo.hsc", visible=False) as h:
fb = Flowsheet(h)
h.solver(False) # 批量改动前
4e868f1df24867110b87abedb7e2bfc27a127457474fe8e96477e99cb5f99836