aspen plus python_用Matlab与Aspen Plus通信

本文介绍了如何使用Matlab与Aspen Plus进行通信,以实现对Aspen Plus流程模拟的高级功能,如多目标优化。通过Matlab调用Aspen Plus的API,可以改变输入变量、获取输出数据,实现自定义的优化算法和数据处理。详细步骤包括建立模型、确定输入输出变量、获取变量调用地址,并通过Matlab程序控制Aspen Plus的运行,处理可能的错误和警告。
摘要由CSDN通过智能技术生成

用Matlab与Aspen Plus通信

Devin

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

收藏前,欢迎点赞!

Aspen Plus (下文简称AP)有的时候难以实现一些特殊的高级用户需求,比如多目标优化等。

举个例子,买东西的时候我们都喜欢物美价廉,但是物美和价廉两个目标在现实生活中是一定程度矛盾的,这种问题在运筹学里就叫多目标优化。在工程学里,操作费用和设备费用,也是某种多目标优化问题。要实现多目标优化,我们就需要在AP中植入多目标优化的算法,对于这种封装好的软件是非常难的,除非利用一些软件已有的接口(API)。Matlab的NSGA-II算法(一种多目标优化遗传算法)

Matlab、Python中有很多的库可以实现多目标优化算法。如果我们能把AP里建好的流程模拟当做一个函数,在Matlab、Python中调用这个函数,那么结合各种库就可以实现多目标优化了。不仅多目标优化,像自建的软测量、故障分析等都很难直接在AP中实现。更甚至,我要基于AP的流程模拟,产生大量数据,用来训练各种机器学习算法,也很难依靠手动去操作去一个一个完成;AP自带的优化、敏感性分析,也可能不能满足我的需求。为了实现这些复杂的高级需求,突破AP既有的功能,都需要与AP通信,修改AP中模拟流程的参数,然后获取搜需要的数据。实现Matlab与Python通信,相当于打开了更大的可能性。这篇文章和另一篇文章,我讲简单介绍如何利用Matlab、Python去实现对AP的输入和输出。(另一篇文章链接:

AP的用户界面是一种基于ActiveX自动化的服务端。其他编程语言可以利用ActiveX技术,实现与AP的直接交互。AP的有户手册第38章节里,提供了详细的基于Visual Basic (VB)语言与AP交互。网上比较常见的资料,通常采取一种曲折的方法,通过Matlab与VB通信,然后用VB与AP通信,这样可以实现更多的功能。这种方法需要你的懂一点VB。但客观说,今天用VB的人越来越少了。

Matlab、Python其实可以直接跟AP通信,但很遗憾AP的有户手册里,没有提到如何利用Matlab和Python进行交互,网上资料也是非常非常少。不过用户手册里依然有很多有用的信息值得参考,如有疑问请参考用户手册。

步骤概述

1.在AP中构建好流程模拟,运行成功后,保存成bkp文件格式。

2.确定输入变量和输出变量的变量名,并在AP的变量浏览器(Variable Explorer)中查找到相应变量的调用地址(Call)。

3.在Matlab的程序中根据需要,利用调用地址(call)改变输入变量、获取输出变量。

4.检查该次运算中,AP是否存在你认为严重的警告(Warning)或者错误(Error),从而在Matlab中取舍某些结果。

详细步骤

1.构建模型

为了方便解说和读者实验,这里将用AP自带的三效蒸发的例子来解说。在AP的默认安装目录下,找到用户图形界面(GUI)文件夹下的案例(Examples)文件夹,里面是各种Aspen公司构建的各行业的经典案例。在其中找到大宗化学品(Bulk Chemical)文件夹,其中有一个Triple-Effect Evaporator.bkp文件(即三效蒸发器),同名的pdf是该模型的背景介绍。下文讲通过Matlab操作这个三效蒸发器文件,所以可以拷贝到其他文件夹,以供实验。(读者可以根据自己的需要在AP中构建、调试自己的流程模拟过程。)三效蒸发器文件的目录

2.运行调试,确保可以正常运行。三效蒸发器的流程图

3.从结果汇总(Results Summary)的运行状态(Run status)中,确定软件版本。AP第10版对应的是36.0,11版对应37.0,以此类推。这个信息在程序里面会用到确定AP的版本

4.确定输入变量和输出变量。在这个项目中, 输入变量是进料总流量,输出变量是蒸发器的热负荷,如下图黄色标记所示。我将用Matlab修改输入流量1000为1200、1400,然后用Matlab获取,运行AP的模拟后,三个蒸发器相应的热负荷。

5.单击鼠标左键进料流股BRINE的对话框。在总流量一栏,选定这个变量,单击右键复制这个变量。

6.复制变量后,选择自定义(Customize)的标签页。在设置(Settings)下,找到变量浏览器(Variable Explorer)。

7.进入变量浏览器,在空白处鼠标单击右键,选择“去节点(Go to Node)”。(注:这里的Node是指AP的各种对象。在AP中,各种数据、各种参数,都是在面向对象编程的思想,组织起来的复杂数据结构。这种数据结构是树状的,每一个分叉都可以看做一个节点,节点上又有各种子节点。详细内容请查看AP的用户手册第38章。)

8.弹出一个对话框,点击确定(OK)。

9.在TOTFLOW下面找到混合(MIXED)一项,即为混合物的进料总流量的节点。下图右侧显示了这个节点的各种属性(Attribute)和相应的属性值(Value)。其中有两个最重要,一个是Call(变量的调用地址),另一个是Value(变量值)。Call就是在Matlab中,要调用这个变量时的调用地址,Value就是目前这个变量的值,此时流量是1000。

10.类似上面的操作,我们可以找到输出变量,即三个蒸发器的热负荷的Call和Value。

11.运行Matlab程序,分别修改流量为1200、1400。流量为1200时流量为1400时

12.Matlab运行中,我的电脑上流量为1200时会报错,不收敛。原因是温度超过Solver默认的上限,修改默认的上限会收敛。但有趣的是,继续进行流量为1400的计算时,能收敛不报错。我推测,原因是1400的迭代计算中应该没有触碰到上限,所以1400的能收敛,反倒1200的不能收敛。

既然AP计算时,会有各种的错误(Error)和警告(Warning),有的计算结果是不可靠,Matlab运行程序时,就需要处理这些复杂情况,取舍某些结果。实现的方法是检查历史文件(his),历史文件存储了所有输入变量和计算细节,所有的警告和错误都会被记录下来。需要注意历史文件是临时文件,历史文件的名字会变,每次计算可能都不一样。这个历史文件的名字变量是运行ID(Run ID),其Call为Application.Tree.FindNode("\Data\Results Summary\Run-Status\Output\RUNID")。利用这个Call,可以在Matlab中以文本格式读取历史文件,搜索报错和警告信息。计算中产生的各种临时文件,后缀为his的是历史文件

这里用记事本文件格式,展示下历史文件的内容。可以看到运行流量为1200的模拟时,AP有一个严重错误(Severe Error),原因是温度超过上限。所以这一次的计算结果不可靠。Matlab需要去搜索“Severe Error”这个关键词。如果有这个关键词,可以在Matlab中,通过条件语句,丢弃这次的模拟结果。(注:关键词的确定, 需要在前期的实验中,摸索尝试,确定可能会出现的各种报错、警告情况)

Matlab程序

计算过程中,可以在Matlab中使用断点,来暂停程序的运行;此时可以检查AP的运行,是否一切正常。需要注意,整个计算过程中有点容易死机,需要有耐心。

下面的Matlab程序,进行了详细的注释

clear;

clc;

%% 连接Aspen Plus

% AP8.8版替换下面的36.0为34.0; 9.0替换为35.0; 10.0替换为36.0; 11.0替换为37.0

% 创建AP的本地服务器

Application = actxserver('Apwn.Document.36.0');

% 获取当前文件夹的地址,三效蒸发器文件和本程序文件需放置在同一个文件夹

[~,address] = fileattrib;

% AP的bkp文件的文件名,即三效蒸发器bkp文件的文件名

SimulationName = 'Triple-Effect Evaporator';

%打开三效蒸发器文件

Application.invoke('InitFromArchive2',[address.Name '\' SimulationName '.bkp']);

% 设置AP用户界面的可见性,1为可见,0为不可见

Application.Visible = 1;

% 压制对话框的弹出,1为压制;0为不压制

Application.SuppressDialogs = 1;

% 试运行三效蒸发器模拟

Application.Engine.Run2(1);

% 因为AP运行比较慢,所以用一个循环语句,每两秒钟检查一次是否运行完毕

while Application.Engine.IsRunning == 1

pause(2);

end

% 定义输入、输出变量、收敛标签

FeedFlow = [1200 1400];

HeatDuty = zeros(2,3);

SimulationConvergency = zeros(2,1);

%% 程序核心部分

% 用for循环依次改变流量为1200、1400,并运行模拟,然后存储数据,检查历史文件

for ii = 1:length(FeedFlow)

%设置输入流量

Application.Tree.FindNode("\Data\Streams\BRINE\Input\TOTFLOW\MIXED").Value = FeedFlow(ii);

%初始化,用于清除之前的数据

Application.Reinit;

%运行程序

Application.Engine.Run2(1);

%每两秒钟检查一次是否运行完毕

while Application.Engine.IsRunning == 1

pause(2);

end

%获取三个蒸发器的热负荷

HeatDuty(ii,1) = Application.Tree.FindNode("\Data\Blocks\STAGE-1\Output\QCALC").Value;

HeatDuty(ii,2) = Application.Tree.FindNode("\Data\Blocks\STAGE-2\Output\QCALC").Value;

HeatDuty(ii,3) = Application.Tree.FindNode("\Data\Blocks\STAGE-3\Output\QCALC").Value;

%获取历史文件的名字

name = Application.Tree.FindNode("\Data\Results Summary\Run-Status\Output\RUNID").Value;

Filename = [address.Name,'\',name,'.his'];

fid = fopen(Filename,'r');

%读取历史文件信息,并存储在Data中

Data = textscan(fid,'%s','delimiter','\n','whitespace',' ');

fclose('all');

contents = Data{1};

%定义搜索关键词

SearchingString = 'SEVERE ERROR';

isStringExist = strfind (contents, SearchingString );

%检查关键词是否出现

isError = find(~ cellfun ('isempty', isStringExist),1);

%如果关键词出现,则标记这一次结果为没有收敛

if isempty(isError)

SimulationConvergency(ii) = true;

else

SimulationConvergency(ii) = false;

end

end

%% 关闭AP

Application.Close;

Application.Quit;

参考文献

Aspen Plus User Guide

Andrés F. Abril,MathWorks FileExchange, Aspen Plus - Matlab Link

  • 4
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值