【问题标题】:FMU FMI simulation, no modification of results when setting certain type of parameterFMU FMI 模拟,设置某些类型的参数时不修改结果
【发布时间】:2014-08-09 00:42:59
【问题描述】:

我为示例开发了一个基于 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 索引的变量相同)。

【问题讨论】:

  • 您无法从 OpenModelica 生成协同仿真 FMU。你是怎么做到的?
  • 糟糕,我不能。这是一个错误,我用 OpenModelica 生成了一个模型交换 FMU。感谢您对 Adeel 的评论。
  • 所以现在,我想知道 pyfmi 模块如何与 OpenModelica 生成的 FMU 包一起工作。这是否意味着“pyfmi”启动了 OpenModelica 模拟器?哪一个?海合会?
  • 我不知道 pyfmi 是如何工作的。没有它的模型交换,所以没有 OpenModelica 模拟器。您是否尝试过在 OpenModelica 中导入相同的 FMU?
  • 是的,我试过了,但是当我模拟模型时,进程崩溃了,我必须关闭模拟。我认为 OpenModelica 还不支持 import FMU。

标签: python modelica openmodelica fmi


【解决方案1】:

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

Modelica 源代码比包含图表的图片更容易查看,以便了解 OpenModelica 对系统做了什么。

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

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

【讨论】:

  • “isValueChangeable”的参数设置为“false”。大多数参数设置为“false”。我真的不明白这是什么意思。
  • 这意味着在 PyFMI 中设置值的任何尝试都将被 FMU 忽略
  • 我继续:我用“annotation(Evaluate = false)”设置参数。现在属性“isValueChangeable”设置为“true”,我可以在 FMU 中管理这个参数。它运作良好。如果我们需要在已经开发的组件中设置注释,我们有这个解决方案:stackoverflow.com/questions/21957303/…
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    我不熟悉 PyFMI,但我以前也遇到过同样的情况。您可以尝试以下几种方法。

    1. 尝试在您第一次模拟后立即终止/释放。

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

    3. (在 Dymola 的 FMU 中)我还发现,如果该参数涉及您的初始非线性方程组,那么如果您尝试在同一瞬间。

    【讨论】:

    • 关于你的第三点:我不太清楚。我为我的第二次模拟添加了我的python代码“option ['initialize'] = False”,因为如果我不这样做,我会遇到错误“无法初始化模型”。我这样做,但我真的不明白为什么。是同一个问题吗?你能告诉我关于你的第三点的更多细节吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-20
    • 1970-01-01
    • 2017-11-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多