Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/302.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 从Modelica模型中提取具有开始属性的变量列表_Python_Attributes_Modelica - Fatal编程技术网

Python 从Modelica模型中提取具有开始属性的变量列表

Python 从Modelica模型中提取具有开始属性的变量列表,python,attributes,modelica,Python,Attributes,Modelica,是否有一种简单的方法可以从Modelica模型中提取具有开始属性的所有变量的列表?最终目标是运行一个模拟,直到它达到稳定状态,然后运行一个python脚本,将start属性的值与稳定状态的值进行比较,这样我就可以识别出选择错误的开始值 在Dymola Python接口中,我找不到这样的功能。另一种方法可能是生成modelDescription.xml并对其进行解析,我假设其中的某些信息是可用的,但是对于这种方法,我也觉得需要帮助才能开始使用。文件dsin.txt和dsfinal.txt可能会帮助

是否有一种简单的方法可以从Modelica模型中提取具有开始属性的所有变量的列表?最终目标是运行一个模拟,直到它达到稳定状态,然后运行一个python脚本,将start属性的值与稳定状态的值进行比较,这样我就可以识别出选择错误的开始值


在Dymola Python接口中,我找不到这样的功能。另一种方法可能是生成modelDescription.xml并对其进行解析,我假设其中的某些信息是可用的,但是对于这种方法,我也觉得需要帮助才能开始使用。

文件dsin.txt和dsfinal.txt可能会帮助您解决这个问题。它们具有相同的结构,在模拟开始和结束时都有值;通过将dsfinal.txt重命名为dsin.txt,您可以从上次运行中计算的(例如稳态)值开始模拟

  • 如果您已经考虑在运行其他模拟时使用这两个值,那么使用这两个文件可能是值得的
  • 它们为您提供有关解算器/模拟设置的信息,而您在.mat结果文件中找不到这些信息(如果您对它们感兴趣的话)

但是,如果只是比较结果文件中存在的变量的起始值和最终值,那么更好的选择可能是使用python和库来读取result.mat文件(dymat、modelicares等)。然后是比较感兴趣的信号的起始值和结束值的问题。

经过一些尝试和错误之后,我提出了这个python代码片段,以从
modelDescription.xml
获取这些信息:

将xml.etree.ElementTree作为ET导入
root=ET.parse('modelDescription.xml').getroot()
对于root.findall('ModelVariables/ScalarVariable')中的ScalarVariable:
varStart=ScalarVariable.find('*[@start]'))
如果varStart不是None:
name=ScalarVariable.get('name')
value=varStart.get('start')
打印(f“{name}={value};”)
要生成modelDescription.xml文件,请使用标志运行Dymola translation
Advanced.FMI.GenerateModelDescriptionInterface2=true

Python标准库有几个处理XML的模块:

此代码段使用ElementTree

这只是第一步,不确定我是否遗漏了一些基本信息。

与答案类似,您可以使用FMPy从FMU内的modelDescription.xml中轻松提取这些信息

下面是一个小的可运行示例:

from fmpy import read_model_description
from fmpy.util import download_test_file
from pprint import pprint

fmu_filename = 'CoupledClutches.fmu'

download_test_file('2.0', 'CoSimulation', 'MapleSim', '2016.2', 'CoupledClutches', fmu_filename)

model_description = read_model_description(fmu_filename)

start_vars = [v for v in model_description.modelVariables if v.start and v.causality == 'local']

pprint(start_vars)

每次模拟后,dsin.txt中都有一个迭代变量列表,因此提取txt文件的信息可能更容易。我希望避免解析txt文件。相关:,除了解析XML或fmu的方法,还有一些用于Modelica的python解析器。使用alist.exe将dsin.txt和dsfinal.txt转换为mat文件-更容易加载到python中,无需解析txt文件。谢谢。我能不能过滤一下,只显示带有start属性的变量。如果滚动到dsin.txt/dsfinal.txt的末尾,会有一个文档解释初始值的计算,似乎可以推断哪些变量已经用起始值定义。但再一次,它要求您解析一个txt文件,我知道您不喜欢这样做