首页 文章

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

提问于
浏览
2

我为这个例子开发了一个基于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 回答

  • 1

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

    为了找出OpenModelica对系统所做的事情,可以更容易地查看Modelica源代码,而不是包含图表的图片 .

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

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

  • 2

    每当您尝试为参数设置新值时,请按照下列步骤操作:
    1.重置模型
    2.设置参数的新值
    3.模拟模型 .

  • 3

    我对PyFMI并不熟悉,但我之前遇到过同样的情况 . 你可以尝试下面的一些事情 .

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

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

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

相关问题