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)
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};")
文件dsin.txt和dsfinal.txt可能会帮助您解决这个问题。它们具有相同的结构,在模拟开始和结束时都有值;通过将dsfinal.txt重命名为dsin.txt,您可以从上次运行中计算的(例如稳态)值开始模拟
但是,如果只是比较结果文件中存在的变量的起始值和最终值,那么更好的选择可能是使用python和库来读取result.mat文件(dymat、modelicares等)。然后是比较感兴趣信号的起始值和结束值的问题
与this答案类似,您可以使用FMPy从FMU内的modelDescription.xml中轻松提取该信息
下面是一个小的可运行示例:
经过一些尝试和错误之后,我提出了这个python代码片段,以从
modelDescription.xml
获得这些信息:要生成modelDescription.xml文件,请使用标志运行Dymola translation
Advanced.FMI.GenerateModelDescriptionInterface2 = true;
Python标准库有几个用于处理XML的模块:
https://docs.python.org/3/library/xml.html
此代码段使用ElementTree
这只是第一步,不确定我是否错过了一些基本的东西
相关问题 更多 >
编程相关推荐