Python调用Aspen进行灵敏度闪蒸的示例

准备工作

首先创建一个Aspen模拟文件FlashTest.bkp,模块闪蒸罐FLASH,物性方法NRTL,

入口流股FEED,水(7732-18-5)41.3% 质量分数,乙醇(64-17-5)58.7% 质量分数,温度 25 ℃,压力 1.3 bar,流量 500 kg/h,

闪蒸罐温度 93 ℃,压力 1.2 bar,

气相流股 VAPOR,液相流股 LIQUID:

运行之后 结果和收敛正常,保存为 FlashTest.bkp

安装 matplotlib 和 numpy 包:

pip install matplotlib --proxy=http://127.0.0.1:10808
pip install pywin32 --proxy=http://127.0.0.1:10808

可以不加代理,安装 matplotlib 时会自动安装 numpy。

查看 Aspen 版本:

查找需要的变量

点击用户自定义 - 对象资源浏览器,查找到自己需要的变量,这里以进口流股FEED的温度为例:

那么要读取这个值的时候,需要查找的节点路径就是:

Application.Tree.FindNode("\Data\Streams\FEED\Input\TEMP")

对应的,其的值就是 25,至于单位,则是根据 bkp 文件中所设置的单位;

其他的参数也是同样的道理,在该节点树中进行查找即可,例如:

# 液相乙醇质量流量
Application.Tree.FindNode("/Data/Streams/LIQUID/Output/MASSFLOW/MIXED/ETHAN")
# 液相水质量流量
Application.Tree.FindNode("/Data/Streams/LIQUID/Output/MASSFLOW/MIXED/WATER")
# 气相乙醇质量流量
Application.Tree.FindNode("/Data/Streams/VAPOR/Output/MASSFLOW/MIXED/ETHAN")
# 气相水质量流量
Application.Tree.FindNode("/Data/Streams/VAPOR/Output/MASSFLOW/MIXED/WATER")
# 进料总质量流量
Application.Tree.FindNode("/Data/Streams/FEED/Input/TOTFLOW/MIXED")

获取该变量的值,直接访问其 Value 值即可,类似的:

# 液相乙醇质量流量
eL_out = aspen.Tree.FindNode("/Data/Streams/LIQUID/Output/MASSFLOW/MIXED/ETHAN").Value
# 气相乙醇质量流量
eV_out = aspen.Tree.FindNode("/Data/Streams/VAPOR/Output/MASSFLOW/MIXED/ETHAN").Value
print("出口液相乙醇:{0},出口气相乙醇:{1}".format(eL_out,eV_out))

这里需要注意的点就是在节点树中的变量名,对应的是自己 bkp 文件中的流股、模块的命名,如果你的命名不一样的话,那么查找的节点路径是不一样的。

代码示例

其实很简单:

import win32com.client as win32
import numpy as np
import os
from matplotlib import pyplot as plt

# 根据 bkp 文件启动 Aspen,并附加对应的 Aspen 版本号,V14 为 40.0
aspen = win32.Dispatch('Apwn.Document.{}'.format(40.0))

# 启动的 bkp 文件
aspen.InitFromArchive2(os.path.abspath('BkpDir/FlashTest.bkp'))

## 获取输入的参数
# 进料温度
feed_temp = aspen.Tree.FindNode('/Data/Streams/FEED/Input/TEMP/MIXED').Value
print('Feed temperature {0}'.format(feed_temp))

# 闪蒸温度
flash_temp = aspen.Tree.FindNode('/Data/Blocks/FLASH/Input/TEMP').Value
print('Flash temperature = {0}'.format(flash_temp))

## 获取输出的参数
# 原始节点:Application.Tree.FindNode("\Data\Streams\LIQUID\Output\MASSFLOW\MIXED\WATER")
# 液相乙醇质量流量
eL_out = aspen.Tree.FindNode("/Data/Streams/LIQUID/Output/MASSFLOW/MIXED/ETHAN").Value
# 液相水质量流量
wL_out = aspen.Tree.FindNode("/Data/Streams/LIQUID/Output/MASSFLOW/MIXED/WATER").Value
# 气相乙醇质量流量
eV_out = aspen.Tree.FindNode("/Data/Streams/VAPOR/Output/MASSFLOW/MIXED/ETHAN").Value
# 气相水质量流量
wV_out = aspen.Tree.FindNode("/Data/Streams/VAPOR/Output/MASSFLOW/MIXED/WATER").Value
# 进料总质量流量
tot = aspen.Tree.FindNode("/Data/Streams/FEED/Input/TOTFLOW/MIXED").Value

# 打印测试
print("进口总流量:{0},闪蒸温度:{1}".format(tot,flash_temp))
print("出口液相乙醇:{0},出口气相乙醇:{1}".format(eL_out,eV_out))

# 手动模拟灵敏度
T = np.linspace(85, 95, 10) # 85-95 摄氏度,10 个点(单位是 bkp 文件中所设置的)
x_ethanol, y_ethanol = [], []
for temperature in T:
aspen.Tree.FindNode('/Data/Blocks/FLASH/Input/TEMP').Value = temperature
aspen.Engine.Run2()
x_ethanol.append(aspen.Tree.FindNode('/Data/Streams/LIQUID/Output/MASSFRAC/MIXED/ETHAN').Value)
y_ethanol.append(aspen.Tree.FindNode('/Data/Streams/VAPOR/Output/MASSFRAC/MIXED/ETHAN').Value)

# 绘图
plt.plot(T, y_ethanol, T, x_ethanol)
plt.legend(['vapor', 'liquid'])
plt.xlabel('Flash Temperature')
plt.ylabel('Ethanol MASS fraction')

# 输出图像
plt.savefig('Images/water-ethan-flash.png')
print("图像已输出到 ./Images/water-ethan-flash.png")

## 关闭 Aspen 进程
aspen.Close()

注意代码中的文件名、版本号、路径等需要根据自己的情况进行替换,

等后面有时间了可以对这些进行一个封装。

完整的项目源码地址:

laugh0608/PythonToAspen: 使用 Python 调用 Aspen 一个小示例。

参考

演示视频: