准备工作
首先创建一个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 一个小示例。