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

Extract list of variables with start attribute from Modelica model

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

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

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

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

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

经过反复试验,我想出了这个 python 代码片段来从 modelDescription.xml:

获取信息
import xml.etree.ElementTree as ET
root = ET.parse('modelDescription.xml').getroot()

for ScalarVariable in root.findall('ModelVariables/ScalarVariable'):
    varStart = ScalarVariable.find('*[@start]')
    if varStart is not None:
        name = ScalarVariable.get('name')
        value = varStart.get('start')
        print(f"{name} = {value};")

要生成 modelDescription.xml 文件,运行 Dymola 翻译带有标志
Advanced.FMI.GenerateModelDescriptionInterface2 = true;

Python 标准库有几个处理模块 XML:
https://docs.python.org/3/library/xml.html
此代码段使用 ElementTree。

这只是第一步,不确定我是否错过了一些基本的东西。

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

这是一个可运行的小例子:

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)