用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