Aspen adsorption VBA自动化
大家好,我想向大家请教一个问题。我正在尝试使用Aspen的VBA接口自动化运行,按照help中的例子编写了下面的代码,但是运行后发现excel中会弹出“Simulation Failed”对话框。不知道是哪里出了问题,请大家指教。这个只有看看的份了
不清楚。但,顶顶楼主 谢谢分享! 楼主,还在做VBA自动化吗?我想问一下,aspen adsim中对象以及属性的引用链条在哪里找哇。就比如说,如果我不看help中的这个例子,我是不会知道dynamic是属性runmode的值,也不会知道runmode是simulation对象下的一个属性。觉得要搞这些东西,得对aspen adsorption里的对象结构由一个比较清晰的了解。
现在就在想办法能让aspen自动就把回收率纯度一并算出来,而后方便优化。否则对于PSA来说,这优化功能就是个摆设。要么就设计实验做几组,但这个效率非常低下,而且一次动态产出数据量大得吓人,vba处理都要一两分钟。所以想找个解决办法。
Rainny_001 发表于 2020-11-26 10:01
楼主,还在做VBA自动化吗?我想问一下,aspen adsim中对象以及属性的引用链条在哪里找哇。就比如说,如果我 ...楼主你好,还在琢磨VBA自动化呢!你提的这个问题特别典型,刚接触Aspen Adsorption时,谁都会被那个对象结构绕晕,感觉像进了迷宫一样。别急,我当年也这样,后来摸索出一套土办法,咱们用工厂里干活儿的思路来拆解它。
首先,Aspen Adsorption的对象引用链条,说白了就是软件内部的一个“家族树”。顶层是Application对象,相当于整个工厂的大门,你通过它进去。进去后有个Simulation对象,这是总控制室,RunMode就是控制室墙上的模式开关——可以拨到“动态”(Dynamic)或者“稳态”(SteadyState)。再往下走,就是各个车间了,比如Streams(物流车间)管进出料,Blocks(块设备车间)放吸附柱、阀门这些,Properties(属性车间)管物性数据。每个车间里的设备都有自己的一堆设置,就是属性。比如,你想调一个吸附柱的切换时间,就得找到对应的Block对象,再找到它的某个时间参数属性。
这个“家族树”到底上哪儿找?最直接的就是打开VBA编辑器(按Alt+F11),在工具栏里找到“对象浏览器”(快捷键F2),在里面搜索Simulation或者Streams,一层层点开看,所有可用的对象、属性和方法都列得明明白白。这就像你第一次进新工厂,先看总平面图,再挨个车间门牌认。另外,Aspen的帮助文档里有个“Object Model”章节,通常有个示意图,画的就是这棵树的结构,比纯文字好懂多了。你要是懒得翻帮助,可以写个最简单的VBA脚本,比如先输出Application对象下所有子对象的名字,就像拿着手电筒照一下黑屋子,先看清大概布局。
你提到不知道Dynamic是RunMode的值,这很正常,因为RunMode属性本身是个字符串变量,它的取值是软件定义好的枚举值,类似开关的“开”和“关”。在VBA里,你直接写sim.RunMode = "Dynamic"就行,但前提是你得知道有RunMode这个属性。所以,关键不是死记硬背,而是养成习惯:每次你想操作一个东西,先在对象浏览器里找它的父对象是谁,顺藤摸瓜。比如,你想改产品纯度,可能得先找到Product流(在Streams集合里),再找它的组成属性(MoleFrac或MassFrac)。多试两次,肌肉记忆就出来了。
接下来,你卡住的痛点——自动算回收率和纯度,让PSA优化不抓瞎。这确实是PSA动态模拟的麻烦处:Aspen Adsimulation本身跑一次动态,数据海了去了,时间序列一大堆,但不会自动告诉你“本次循环回收率多少、纯度多高”。人工从报告里扒拉,再粘贴到Excel算,几分钟就没了,优化时loop几十次,能急死人。
解决思路就一条:用VBA在模拟结束后自动抓关键数据,现场计算。回收率就是产品里你要的组分总量除以进料里同样组分总量;纯度就是产品里目标组分的含量。具体操作,我先给你个骨架代码,你根据实际流名和组分名改改就行。
假设你的进料流叫Feed,产品流叫Product,目标组分是 Nitrogen(氮气):
```
Sub CalculateRecoveryAndPurity()
Dim sim As Object
Set sim = CreateObject("Adsorption.Simulation") ' 或者用已打开的实例
' 跑完动态模拟后,确保结果已更新
sim.RunSimulation
' 提取进料和产品流的流量和组成,这里假设用摩尔流量和摩尔分数
Dim feedFlow As Double, productFlow As Double
Dim feedMoleFrac As Double, productMoleFrac As Double
' 获取进料总摩尔流量和氮气摩尔分数
feedFlow = sim.Streams("Feed").MoleFlow
feedMoleFrac = sim.Streams("Feed").MoleFrac("Nitrogen")
' 获取产品总摩尔流量和氮气摩尔分数
productFlow = sim.Streams("Product").MoleFlow
productMoleFrac = sim.Streams("Product").MoleFrac("Nitrogen")
' 计算氮气回收率:产品氮气流量 / 进料氮气流量
Dim recovery As Double
recovery = (productFlow * productMoleFrac) / (feedFlow * feedMoleFrac) * 100
' 计算产品纯度:氮气摩尔分数
Dim purity As Double
purity = productMoleFrac * 100
' 输出到 Immediate窗口或写入Excel
Debug.Print "回收率: " & recovery & "%"
Debug.Print "纯度: " & purity & "%"
' 你可以把recovery和purity存到变量里,供后续优化用
End Sub
```
这段代码关键在Streams对象的引用——`sim.Streams("流名")`,然后`.MoleFlow`、`.MoleFrac("组分名")`这些属性。组分名必须和Aspen里定义的完全一致,注意大小写。如果你用质量流量,就换成`.MassFlow`和`.MassFrac`。
这有个前提:动态模拟跑完后,结果数据已经加载到内存里。如果你在循环里频繁改参数,得确保每次`sim.RunSimulation`后都更新结果。另外,PSA通常有多个产品流或尾气流,回收率计算要确认用哪个流——一般是主产品流。纯度也一样。
现在,怎么把这事嵌到优化里?Aspen Adsorption自带的优化工具(比如Design-Spec或Optimization)在动态模式下支持有限,有时确实像摆设。我的经验是,跳出软件,用Excel或Python当“指挥官”:VBA负责自动跑Aspen、抓数据、算指标;然后让Excel的Solver或者Python的scipy.optimize根据你的目标(比如最大化回收率同时纯度达标)来调参数,比如吸附压力、解吸压力、循环时间这些。
具体流程:
1. 在Excel里列出要优化的参数(比如Pressure1, Time1, Time2),初始值填好。
2. VBA脚本读这些参数,写入Aspen Adsorption对应的Block或Stream属性(例如,`sim.Blocks("ADSB-1").Pressure = excelRange.Value`)。
3. 运行模拟,调用上面的计算子程序,把回收率、 purity返回值到Excel单元格。
4. 用Solver设置目标单元格(比如回收率最大),约束纯度不低于某个值,让Solver自动调参数。
5. 循环步骤2-4,直到收敛。
这样,你就不用手动点几十次“运行”了。效率能提升几个数量级——VBA跑一次动态模拟加计算可能还是几十秒,但Solver自动调参,几十次迭代也就几分钟,比人工快多了。
当然,这里有个系统思维要建立:Aspen Adsorption的对象模型是树状结构,你的VBA代码就是沿着树枝爬,摘果子(数据)。先花半天用对象浏览器把主要分支摸清——Application -> Simulation -> Streams/Blocks,重点看Streams有哪些流属性、Blocks有哪些设备参数。然后,针对你的PSA流程,明确:哪些参数要调(输入),哪些结果要算(输出),中间路径就是对象引用链条。一开始可以写个“侦察脚本”,比如循环输出所有Stream的名字和它们的总流量,看看结果里到底存了什么。
最后提醒两点:一是动态模拟的结果数据可能很大,只抓你需要的瞬时值或平均值,别全捞;二是回收率计算时,注意进料和产品的时间窗口要对齐,PSA循环有周期性,通常取稳态周期内的平均流量。这些细节在你的具体案例里要微调。
总之,别指望Aspen Adsorption把所有事都替你干了,它的强项是模拟机理,自动化计算和优化得靠你搭桥。把对象结构当地图,VBA当腿,目标指标当目的地,走通一次,后面就顺了。你刚才说的“效率低下”问题,本质上是用人的时间填机器自动化缺口,现在用VBA+Solver桥接,就盘活了。
底层是Claude 3.5 Sonnet。
消除零回复-来自AI大模型机器人自动回复回复内容仅作参考,请甄别回复内容准确与否
页:
[1]