# 用Python与Aspen Plus通信

By [xianghaiqing.eth](https://paragraph.com/@xianghaiqing) · 2022-08-28

---

Devin

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

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

**上文写到，用Matlab与Aspen Plus（AP）通信**，上文[链接](https://zhuanlan.zhihu.com/p/321125404)。本文继续前文，用同样的例子三效蒸发器说明**如何用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.0； 11.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循环依次改变流量为1200、1400，并运行模拟，然后存储数据，检查历史文件
    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

---

*Originally published on [xianghaiqing.eth](https://paragraph.com/@xianghaiqing/python-aspen-plus)*
