Aspen与Python联动(6)-技巧总结

    各位好,这个文档主要来说明Python与Aspen联动的时候一些问题和答疑,之前第一章和第二章用到了一个叫做AspenPy的模块,不是原生态的(但是原理几乎一样),同时,在我做能量衡算的时候遇到了一些问题,这些问题网上几乎都没有侧重来讲,比如如何控制单位一样,以及Aspen与可迭代器的关系。而今天的内容是直接用原生态wincom32接口来实现用Python和Aspen通过COM接口的一些转化。

    本文档开源,可以进行分享!

第一部分 之前内容复习及其快速浏览

0-变量浏览器

1-Aspen怎么启动:

aspen = win32.Dispatch('Apwn.Document')
时间:13.560933828353882

两点

1.这个程序只是启动aspen,并不是aspen的某一个特定文件

2.版本其实无所谓

或者

aspen = win32.gencache.EnsureDispatch('Apwn.Document')
时间:13

2.启动哪个文件?

aspen.InitFromArchive2(os.path.abspath('BkpDir/FlashTest.bkp'))

os.path.abspath是相对路径转换成绝对路径

这个aspen.InitFromArchive2括号里面要求的是绝对路径,而你假设只有相对路径,则可以这么填,如果你有绝对路径,则

aspen.InitFromArchive2(r'D:\python pa chong\pythonwithaspen\bkpdir\FlashTest.bkp')

3.Aspen是否可视化

aspen.Visible=1 or aspen.Visible=0

注意:不管是0还是1,你这个Aspen都是有后台进程

4.关闭:

aspen.Close()

5.如何获取一个bkp的物质名字

concent=Aspen.Tree.FindNode("\Data\Components\Specifications\Input\CASN")
Concent_all=[j.Name for j in concent.Elements]

同理,如果是想获得CAS号就直接

concent=Aspen.Tree.FindNode("\Data\Components\Specifications\Input\CASN")
Concent_all=[j.Value for j in concent.Elements]

第二部分 一些比较偏的问题及其解决方法

这次主要是讲解三个问题

一.Aspen不同文件有不同的单位集,怎么切换单位

方法:

1.找到合适单位集,然后进行转化

2.运行,如果不运行的话不行

aspen.Tree.Elements('Data').Elements("Setup").Elements("Global").Elements("Input").Elements("INSET").Value="MET"
aspen.Run()

二.怎么获取流股数据

1.获取流股名字(使用Name)

两个方式:

(1).通过FindNode直接获取

Name_Block_All=aspen.Tree.FindNode("\Data\Streams")
Name_Block_List=[i.Name for i in Name_Block_All.Elements]

这个是Python的语法糖,相当于

Name_Block_All=aspen.Tree.FindNode("\Data\Streams")
Name_Block_List=[]
for i in Name_Block_All.Elements:
  Name_Block_List.append(i.Name)

这个可以当作使用了For循环的迭代思想

迭代器和生成器

aspen.Tree.FindNode().Elements是不是可迭代对象?

(2)可以用elements

Name_Block_All=aspen.Tree.Elements("Data").Elements("Stream")
Name_Block_List=[i.Name for i in Name_Block_All.Elements]

(3)通过Item列表


Name_Block_List=[]
streams_node=aspen.Tree.Elements("Data").Elements("Stream")
for i in range(1,streams_node.Elements.Count+1):
  Name_Block_List.append(streams_node.Elements.Item(i).Name)

这个等同于

Name_Block_List=[]
i=0
while i<streams_node.Elements.Count:
  Name_Block_List.append(streams_node.Elements.Item(i).Name)
  i+=1

或者由于列表的思想,我们可以再转化

elements = list(Name_Block_All.Elements)   # 一次性固化
for i in range(len(elements)):
    print(elements[i].Name)

或者,迭代器思想

it = iter(Name_Block_All.Elements)
while True:
    try:
        elem = next(it)
    except StopIteration:
        break
    print(elem.Name)

2.获取流股的的输入数据

Volumn_Flow=Aspen.Tree.Elements("Data").Elements("Streams").Elements(Stream_Name).Elements("input").Elements("VOLFLMX2").Value

3.获取流股的输出数据

Volumn_Flow=Aspen.Tree.Elements("Data").Elements("Streams").Elements(Stream_Name).Elements("Output").Elements("VOLFLMX2").Value

4.修改流股的输入数据

Aspen.Tree.Elements("Data").Elements("Streams").Elements(Stream_Name).Elements("input").Elements("VOLFLMX2").Value=0.06

5.修改流股的输出数据

Aspen.Tree.Elements("Data").Elements("Streams").Elements(Stream_Name).Elements("Output").Elements("VOLFLMX2").Value=0.06

三.怎么获取模块的输出数据

1.获取模块的输入数据

首先,这里的大小写都一样,都不影响结果

两种方式,第一种是Elements形式:

Aspen.Tree.Elements("Data").Elements("Blocks")

第二种是FindNote形式

Aspen.Tree.FindNode("\Data\Streams")

2.获取模块的输出数据

四.怎么创建和删除流股,模块,流股和模块之间怎么连接起来

1.模块

创建模块:Add()

BlockName="0101"
EquipmentType=["RCSTR", "RPlug", "DSTWU", "Flash2", "Mixer", "Heater", "Radfrac", "Splitter", "RYield]#从中选一个
All=BlockName+"!"+"RPlug"
Aspen.Tree.Elements("Data").Elements("Blocks").Elements.Add(All)

这是设备类型的选项,可以对这个进行查看

删除模块:Remove()

Aspen.Tree.Elements("Data").Elements("Blocks").Elements.Remove("Blockname")

2.流股

创建流股:Add()

StreamName="0101"
EquipmentType=["MATERIAL", "HEAT", "WORK","POWER"]#从中选一个
All=StreamName+"!"+"MATERIAL"
Aspen.Tree.Elements("Data").Elements("Streams").Elements.Add(All)

删除流股:Remove()

Aspen.Tree.Elements("Data").Elements("Streams").Elements.Remove("StreamName")

连接流股:Add()这里虽然看似是连接流股,实际上用到的和模块有关

Aspen.Tree.Elements("Data").Elements("Blocks").Elements("Ports").Elements(Portname).Elements.Add(Streamname)
port_Name="D(OUT)" , "B(OUT)", "F(IN)"

断开流股:

Aspen.Tree.Elements("Data").Elements("blocks").Elements(Blockname).Elements("Ports").Elements(Portname).Elements.Remove(Streamname)

重要的点

大小写并不影响

第三部分:可能用到的方法及其保存方法

杂项指令:

1.显示Aspen的文件地址

Aspen.FullName
#D:\aspenruanjian\Aspen Plus V14.0\GUI\Xeq\aspenplus.exe

2.抑制窗口

Aspen.SuppressDialogs = 1 or 0
#1表示抑制,0表示不抑制

3.运行模拟

Aspen.Run2()

4.停止模拟

Aspen.Stop()

5.重置模块

Aspen.Reinit()

6.模块重置#已经删除

Aspen.Tree.Elements("Data").Elements("Blocks").Elements(Blockname).Reinit()

7.流股重置#已经删除

Aspen.Tree.Elements("Data").Elements("Streams").Elements(StreamName).Reinit()

保存:

8.保存成apw,有所有的输入及其输出

Aspen.Save()

9.保存当前 Aspen 模拟(.apw)为新名称,而不覆盖原文件。
参数:
Filename:指定文件名的字符串。
overwrite:当文件已存在时是否覆盖?True 或 False,默认值为 True

Aspen.SaveAs(Filename, overwrite)

10.保存成bkp文件

Aspen.Export(1, filename)

11.保存成.rep或者.txt文件

Aspen.Export(2, filename)

12,保存成.sum

Aspen.Export(4, filename)

13.保存成.inp

Aspen.Export(5, filename)

14.保存每次模拟的信息,错误和警告:

Aspen.Export(6, filename)

15.导出仿真报告

Aspen.Export(9, filename)

16.导出压力驱动的模拟报告

Aspen.Export(10, filename)

17.导出流程图的绘图

Aspen.Export(11,filename)

各位可以加入这个交流群一起交流!

一些比较好的化工链接:

1.CEPD化工社区:

https://bbs.imbhj.com/

2.我的公众号:MrsJone的破站(会分享关于Aspen和Python的一些文章)

3.世示其up主的化工设计大赛管道选型,这个exe文件可以找up主三连获取

4.能量衡算系统-可以用于化工设计大赛:

进我那个群自领

5.AspenPy模块的github链接-我一开始用的Aspen和Python连接的库,可以给原作者star

https://github.com/YouMayCallMeJesus/AspenPlus-Python-Interface