用Python与Aspen Plus通信

Devin

欢迎关注我的知乎账号过程系统工程专栏,专注于化工、过控、制药、优化的学习心得体会分享。如需转载,请私信收藏前,欢迎点赞!

声明:代码仅供参考,作者不对代码产生的后果负法律责任。

上文写到,用Matlab与Aspen Plus(AP)通信,上文链接。本文继续前文,用同样的例子三效蒸发器说明如何用Python与AP通信。Matlab虽好,但毕竟是商业软件有运用成本,而且现在很多学校也被美国禁用了,Python作为一种广泛使用的胶水语言、开源语言,有很多独到的优势。

用Python与AP通信的详细步骤和思路,完全和Matlab一模一样,只是在具体的代码上有不同。所以详细细节请参看上文,这里只把代码放上来,代码有详细注释。

# -*- coding: utf-8 -*-
"""
Created on Tue Nov 10 11:36:45 2020

@author: Devin @Zhihu https://www.zhihu.com/people/devins/posts
"""

# 导入需要的库
import os
import win32com.client as win32
import time
import numpy as np

# 创建AP的本地服务器

# AP8.8版替换下面的36.0为34.0; 9.0替换为35.0; 10.0替换为36.011.0替换为37.0
Application = win32.Dispatch('Apwn.Document.36.0')

# 获取当前文件夹的地址,三效蒸发器文件和本程序文件需放置在同一个文件夹
address = os.getcwd()

# AP的bkp文件的文件名,即三效蒸发器bkp文件的文件名
SimulationName = 'Triple-Effect Evaporator'

# 打开三效蒸发器文件
Application.InitFromArchive2(os.path.abspath(SimulationName + '.bkp'))

# 设置AP用户界面的可见性,1为可见,0为不可见
Application.Visible = 1

# 压制对话框的弹出,1为压制;0为不压制
Application.SuppressDialogs = 1

# 试运行三效蒸发器模拟
Application.Engine.Run2(1)

# 因为AP运行比较慢,所以用一个循环语句,每两秒钟检查一次是否运行完毕
while Application.Engine.IsRunning == 1:
    time.sleep(2)

# 定义输入、输出变量、收敛标签
FeedFlow = [1200,1400]
HeatDuty = []
SimulationConvergency = []

 
# 程序核心部分

# 用for循环依次改变流量为12001400,并运行模拟,然后存储数据,检查历史文件
for ii in range(len(FeedFlow)):
    # 设置输入流量
    Application.Tree.FindNode("\Data\Streams\BRINE\Input\TOTFLOW\MIXED").Value = FeedFlow[ii]
    
    # 初始化,用于清除之前的数据
    Application.Reinit
    
    # 运行程序
    Application.Engine.Run2(1)

    # 定义本次的输出数据
    heatduty = []

    # 每两秒钟检查一次是否运行完毕
    while Application.Engine.IsRunning == 1:
        time.sleep(2)

    # 获取三个蒸发器的热负荷
    heatduty.append(Application.Tree.FindNode("\Data\Blocks\STAGE-1\Output\QCALC").Value)
    heatduty.append(Application.Tree.FindNode("\Data\Blocks\STAGE-2\Output\QCALC").Value)
    heatduty.append(Application.Tree.FindNode("\Data\Blocks\STAGE-3\Output\QCALC").Value)

    # 存储到HeatDuty中
    HeatDuty.append(heatduty)

    # 获取运行ID,并以文本格式打开相应的历史文件,搜索文件中是否有关键词
    name = Application.Tree.FindNode("\Data\Results Summary\Run-Status\Output\RUNID").Value
    Filename = address + '\\' + name + '.his'

    # 如果关键词出现,则标记这一次结果为没有收敛
    with open(Filename,'r') as f: 
        isError = np.any(np.array([line.find('SEVERE ERROR') for line in f.readlines()])>=0)
        SimulationConvergency.append(not isError)

# 关闭AP        
Application.Close
Application.Quit

参考文献

Aspen Plus User Guide