FMU FMI仿真,在设置某些类型的参数时无需修改结果

时间:2014-06-18 16:07:16

标签: python modelica openmodelica fmi

我为该示例开发了一个基于MSL流体库的简单Modelica模型。我将MassFlowSource与管道和Boundary_PT连接为接收函数,如下图所示:

http://www.casimages.com/img.php?i=14061806120359130.png

我使用OpenModelica生成一个FMU包(在模式模型交换中)。 我用python管理这个FMU包,代码如下:

import pyfmi, os
from pyfmi import load_fmu

myModel = load_fmu('PathToFolder\\test3.fmu')
res1 = myModel.simulate() # First simulation with m_flow in source set to [1] Kg/s
x = myModel.get('boundary1.m_flow') # Mass flow rate of the source
y = myModel.get('pipe.port_a.m_flow') # Mass flow rate in pipe
print x, y

myModel.set('boundary1.m_flow', 2)
option = myModel.simulate_options()
option['initialize'] = False # Need to initialize the simulation
res2 = myModel.simulate(options = option) # Second simulation with m_flow in source set to [2] Kg/s
x = myModel.get('boundary1.m_flow') # Mass flow rate of the source
y = myModel.get('pipe.port_a.m_flow') # Mass flow rate in pipe
print x, y

os.system('pause')

目标是在您更改模型中的参数时显示问题,此处为" m_flow"源组件中的变量。这个新设置为" 2"应该改变" m_flow"在管道但它没有。 结果:在第一次模拟中,两者都是" m_flow"得到了" 1"它是正常的,因为模型是这样设置的。在第二个模拟中,我将参数设置为" 2"在源头,但管道" m_flow"留在" 1" (它应该是" 2")。 http://www.casimages.com/img.php?i=140618060905759619.png

Modelica中的流体源模型就是这个模型(只是我们感兴趣的部分):

equation
 if not use_m_flow_in then
  m_flow_in_internal = m_flow;
 end if;
 connect(m_flow_in, m_flow_in_internal);

我认为FMU在处于if状态时不会考虑参数。对我来说这是一个问题,因为我需要管理FMU,并确保如果我设置一个参数,模拟将使用这个新的集合。如何确保FMU / FMI运行良好?哪些是我们无法在FMU中管理的参数类型的详尽列表?

我已经知道在FMU管理中不能考虑改变方程数的参数(改变DAE指数的变量的同义词)。

3 个答案:

答案 0 :(得分:3)

请注意,OpenModelica具有结构参数和Evaluate=true注释的概念。例如,如果参数用作数组维,则可以将其计算为Integer值。该参数的所有使用都将使用评估值,就好像它是一个常量。

除了包含图表的图片之外,还可以更容易地查看Modelica源代码,以便找出OpenModelica对系统所做的事情。

我怀疑已经评估了一个参数。如果生成非FMU代码,则可以检查OpenModelica生成的modelName_init.xml并找到参数的条目并查找属性isValueChangeable

您还可以使用OMEdit调试系统并查看初始等式(生成包含调试信息的可执行文件)。 File->打开Transformations File,然后选择modelName_info.xml文件。搜索您尝试更改的变量,然后转到定义它的初始方程式。很可能忽略了起始值(由PyFMI设置),因为不需要生成解决方案。

答案 1 :(得分:2)

每当您尝试为参数设置新值时, 请遵循以下步骤:
1.重置模型
2.设置参数的新值
3.模拟模型。

答案 2 :(得分:1)

我对PyFMI并不熟悉,但我之前遇到过同样的情况。你可以尝试以下几点。

  1. 尝试终止/释放第一张SIM卡后的瞬间。

  2. 由于大多数参数在初始化后无法更改,因此您可以将该参数设置为输入连接器,以便可以随时更改此特定参数。

  3. (在Dymola的FMU中)我还发现,如果该参数涉及您的初始非线性方程组,那么如果您尝试初始化模型,则会出现“模型无法初始化”的错误同一时刻。