为FMI类型“模型交换”设置变量

时间:2019-10-09 13:14:29

标签: python fmi

我正在使用python fmpy运行fmu模型。 执行,运行和绘制结果效果很好。还定义输入(按照教程进行)。

但是我正在努力改变fmu模型中的全局参数值。

例如,如果我在GUI(https://fmpy.readthedocs.io/en/latest/tutorial/)中运行相同的模型,则将获得所有可用参数的完整列表。在那里,我可以将名称为“ l1”的参数的值设置为412。如果我登录GUI的FMI调用,可以看到以下命令用于将“ l1”设置为412: / p>

fmi2SetReal(fmu,vr = [671088641],nvr = 1,value = [412])

如何使用python命令将“ l1”设置为412?

from fmpy.util import plot_result
import numpy as np
from scipy import signal
import matplotlib.pyplot as plt
from fmpy import *

fmu = 'CrankCase_ME2.fmu'
dump(fmu)

# read the model description
model_description = read_model_description(fmu)

# collect the value references
vrs = {}
for variable in model_description.modelVariables:
    vrs[variable.name] = variable.valueReference

L = 412
hPLug = 215
alphaDrvie = 60
start_vrs = [vrs['l1'], vrs['h_plug'], vrs['Alpha_drive']]
start_values = [L, hPLug, alphaDrvie]

dtype = [('time', np.double), ('l1', np.int), ('h_plug', np.int), ('Alpha_drive', np.int)]
signals = np.array([(0.0, L, hPLug, alphaDrvie)], dtype=dtype)

print_interval = 1e-5
result = simulate_fmu(fmu, start_time=0, stop_time=0.1, relative_tolerance=1e-7, output_interval=print_interval, input=signals)

t = result['time']
y_Force = result['expseu_.Out2'] # y force
plt.plot(t, y_Force)

我的fmu属于Model Exchange类型。 我试图将其定义为输入,但这不起作用。

有什么建议吗?

欢呼

1 个答案:

答案 0 :(得分:0)

所以我才想通了...

要在fmpy中定义全局参数,请使用“ start_values”语句。 coupled_clutches.py中有一个很好的例子。但是为了完整起见,此处仅提供了“ Rectifier.fmu”模型的最小工作示例。 “ vrs”包含fmu模型中所有已保存的变量,您可以在其中找到频率“ f”。默认值设置为50Hz,如果将频率参数设置为100Hz,则只需使用'start_values = {'f':100}',例如:

from fmpy import dump, simulate_fmu, read_model_description
from fmpy.util import plot_result

fmu = 'Rectifier.fmu'
dump(fmu)

model_description = read_model_description(fmu)

vrs = {}
for variable in model_description.modelVariables:
    vrs[variable.name] = variable.valueReference

print_interval = 1e-5
result = simulate_fmu(fmu, 
                      start_time=0, 
                      stop_time=0.1, 
                      relative_tolerance=1e-7, 
                      output_interval=print_interval, 
                      start_values={'f': 100})

plot_result(result)

如果要直观地浏览保存的参数,可以在FMPy GUI内打开fmu