一篇基于实测"排坑"的 HYSYS COM 接口操作指南, 告诉你什么能跑、什么不能跑、怎么才能跑起来。
HYSYS 是个强大的流程模拟工具,但如果每次调参都要手动点界面,那就太折磨了。 用 Python 写脚本去操控 HYSYS,听起来很美,但网上的资料要么过时、要么不全。 这篇文章是我自己踩了一圈坑之后整理出来的实战笔记——每一步都跑通过。
bash复制
# 安装 Python(如果还没装)winget install Python.Python.3.13# 安装 COM 桥接库pip install pywin32# 注册 COM 组件python Scripts/pywin32_postinstall.py -install
⚠️ Python 和 HYSYS V14 都必须是 64 位(默认就是,不用特别配置)。
这是花时间最多、踩得最深的一个坑。
HYSYS V14 的 COM 接口根本不能从头创建可用的案例。如果你调用 SimulationCases.Add(),表面上能创建一个空白案例,但只要一试图添加物料流,COM 服务器就会直接崩溃,报 RPC_E_SERVERFAULT。
正确的做法:永远从一个已有物性包的 .hsc 模板文件出发。
C:\Users\你的用户名\Documents\Claude\template.hsc一次配置,终身复用。后面所有脚本都会复制这个模板再操作。
python复制
import pythoncomimport win32com.clientimport shutil, os# ── 初始化 COM ──pythoncom.CoInitializeEx(pythoncom.COINIT_APARTMENTTHREADED)app = win32com.client.gencache.EnsureDispatch("HYSYS.Application.V14.0")app.Visible =True# 显示 HYSYS 界面(设 False 则后台运行)# ── 从模板创建案例 ──TEMPLATE =r"C:\Users\zjmch\Documents\Claude\template.hsc"case_path =r"C:\Users\zjmch\Documents\Claude\my_case.hsc"if os.path.exists(case_path): os.remove(case_path)shutil.copy2(TEMPLATE, case_path)case= app.SimulationCases.Open(case_path)fs =case.Flowsheet# ── 添加物料流 ──feed = fs.MaterialStreams.Add("Feed")feed.Temperature.SetValue(150,"C")feed.Pressure.SetValue(500,"kPa")feed.MolarFlow.SetValue(100,"kgmole/h")# ── 设置组成 ──feed.ComponentMolarFractionValue.SetValue("Methane",0.5)feed.ComponentMolarFractionValue.SetValue("Ethane",0.5)# ── 添加闪蒸罐 ──vapour = fs.MaterialStreams.Add("Vapour")liquid = fs.MaterialStreams.Add("Liquid")sep = fs.Operations.Add("Separator","Flash Drum")sep.FeedConnection(0).Attach("Feed")sep.VapourProductConnection(0).Attach("Vapour")sep.LiquidProductConnection(0).Attach("Liquid")# ── 运行求解 ──case.Solver.CanSolve =Truecase.Solver.Run()# ── 读取结果 ──print(f"气相出口温度 = {vapour.Temperature.GetValue('C'):.1f} °C")print(f"气相出口压力 = {vapour.Pressure.GetValue('kPa'):.1f} kPa")print(f"液相出口温度 = {liquid.Temperature.GetValue('C'):.1f} °C")# ── 清理退出 ──case.Save()case.Close()app.Quit()
这些是从 HYSYS V14 类型库中自动生成的官方名称,别去猜。
Temperature | .SetValue(150, "C").GetValue("C") | |
Pressure | .SetValue(500, "kPa") | |
MolarFlow | .SetValue(100, "kgmole/h")MoleFlow! | |
MassFlow | .SetValue(1000, "kg/h") | |
VapourFraction | .GetValue("") | |
MassEnthalpy | .GetValue("kJ/kg") | |
MolarEnthalpy | .GetValue("kJ/kgmole") | |
MolecularWeight | .GetValue("") | |
name | .name | |
ComponentMolarFractionValue | .SetValue("Methane", 0.5) |
💡 不确定属性名的时候,直接翻生成的文件:
C:\Users\xxx\AppData\Local\Programs\Python\Python313\Lib\site-packages\ win32com\gen_py\DFC1C58B-AE9F-11CF-8EB2-0020AF119B90x0x3x1\ProcessStream.py
每种设备有不同的连接方式,这里列几个常用的。
python复制
op = fs.Operations.Add("Separator","闪蒸罐")op.FeedConnection(0).Attach("进料")op.VapourProductConnection(0).Attach("气相出口")op.LiquidProductConnection(0).Attach("液相出口")
python复制
op = fs.Operations.Add("Heater","加热器")op.FeedConnection(0).Attach("进料")op.ProductConnection(0).Attach("出料")op.DeltaTemperature.SetValue(50,"C")# 或者用 op.Duty.SetValue(...)
python复制
op = fs.Operations.Add("Valve","阀门")op.FeedConnection(0).Attach("进料")op.ProductConnection(0).Attach("出料")op.DeltaPressure.SetValue(200,"kPa")
python复制
op = fs.Operations.Add("Mixer","混合器")op.FeedConnection(0).Attach("进料1")op.FeedConnection(1).Attach("进料2")op.ProductConnection(0).Attach("出料")
如果你有一个现成的 .hsc 文件,COM 接口的读取功能非常稳定:
python复制
case= app.SimulationCases.Open("已有案例.hsc")fs =case.Flowsheet# 读取物性包信息fp = fs.FluidPackageprint(f"物性包: {fp.PropertyPackageName}")# 遍历所有物料流for i inrange(fs.MaterialStreams.Count): s = fs.MaterialStreams.Item(i)print(f"流股 {i}: {s.name}")# 遍历所有设备for i inrange(fs.Operations.Count): op = fs.Operations.Item(i)print(f"设备 {i}: {op.name}")# 读取流股数据s = fs.MaterialStreams.Item(0)# 或者 Item("Feed Gas")T = s.Temperature.GetValue("C")P = s.Pressure.GetValue("kPa")
DispatchEnsureDispatch 均可 | ||
.hsc | ||
| 仅限 | ||
SimulationCases.Add() | ||
EndBasisChange | ||
SimulationCases.Count |
RPC_E_SERVERFAULT | 0x80010105 | |
E_FAIL | 0x80004005 | EndBasisChange 但实际没任何改动 |
E_INVALIDARG | 0x80070057 | |
仓库里的 hysys_controller.py 是一个完整的封装类 HysysController,包含上面所有确认可用的 API 模式。直接 import 就能用。
说实话,HYSYS V14 的 COM 接口体验并不算好——文档匮乏、错误信息晦涩、从零创建案例的功能基本是坏的。
但一旦摸清楚它的脾气,走通"模板 + 打开已有文件"这条路线,日常的自动化需求基本都能满足:
如果你也在折腾 HYSYS 自动化,希望这篇文章能帮你少走点弯路。 有问题或新发现,欢迎交流 🙌