Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python FMU FMI模拟,设置特定类型参数时不修改结果_Python_Modelica_Openmodelica_Fmi - Fatal编程技术网

Python FMU FMI模拟,设置特定类型参数时不修改结果

Python FMU FMI模拟,设置特定类型参数时不修改结果,python,modelica,openmodelica,fmi,Python,Modelica,Openmodelica,Fmi,我基于MSL的流体库开发了一个简单的Modelica模型。我将一个MassFlowSource与一个管道和一个边界点连接起来,作为汇函数,如下图所示: 我使用OpenModelica生成一个FMU包(在模式模型交换中)。 我使用python管理这个FMU包,代码如下: import pyfmi, os from pyfmi import load_fmu myModel = load_fmu('PathToFolder\\test3.fmu') res1 = myModel.simulate

我基于MSL的流体库开发了一个简单的Modelica模型。我将一个MassFlowSource与一个管道和一个边界点连接起来,作为汇函数,如下图所示:

我使用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_流”,但不会更改。 结果:在第一次模拟中,两个“m_流”都被设置为“1”,这是正常的,因为模型是这样设置的。在第二次模拟中,我在源中将参数设置为“2”,但管道“m_flow”保持为“1”(应该是“2”)。

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

我认为FMU在IF条件下不考虑参数。对我来说,这是一个问题,因为我需要管理FMU,并确保如果我设置了一个参数,模拟将使用这个新设置。如何确保FMU/FMI正常工作?包含我们无法在FMU中管理的参数类型的详尽列表在哪里


我已经知道,在FMU管理中不能改变方程数的参数(对于改变DAE索引的变量的IDIM)。注意:OpenMICICA具有结构参数的概念和<代码>评估=真< /代码>注释。例如,如果将参数用作数组维度,则可能会将其计算为整数值。该参数的所有使用都将使用评估值,就像它是一个常量一样

为了找出OpenModelica对系统做了什么,Modelica源代码应该更容易查看,而不是包含图表的图片

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


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

我不熟悉PyFMI,但我以前遇到过类似的情况。你可以试试下面的一些东西

  • 尝试在第一次sim卡后立即终止/释放

  • 由于大多数参数在init之后无法更改,因此可以将该参数作为输入连接器,以便可以随时更改该特定参数

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


  • 无论何时尝试为参数设置新值, 遵循以下步骤:
    1.重置模型
    2.为参数设置新值
    3.对模型进行仿真


    您不能从OpenModelica生成联合仿真FMU。你是怎么做到的?哎呀,我不能。这是一个错误,我用OpenModelica生成了一个模型交换FMU。感谢您对Adeel的评论。现在,我想知道pyfmi模块如何与OpenModelica生成的FMU包一起工作。这是否意味着“pyfmi”启动OpenModelica模拟器?是哪一个?GCC?我不知道pyfmi是如何工作的。不,这是一个模型交换,所以没有OpenModelica模拟器。您是否尝试过在OpenModelica中导入相同的FMU?是的,我尝试过,但当我模拟模型时,进程崩溃,我必须关闭模拟。我认为OpenModelica还不支持导入FMU。参数的“IsValueChanged”设置为“false”。大多数参数都设置为“false”。我真的不明白这是什么意思。这意味着任何在PyFMI中设置值的尝试都将被FMUI resume忽略:我用“annotation(Evaluate=false)”设置参数。现在属性“IsValueChanged”设置为“true”,我可以在FMU中管理此参数。它工作得很好。如果我们需要在已经开发的组件中设置注释,我们有这个解决方案:关于你的第三点:我不确定是否能很好地理解。我在第二次模拟中添加了python代码“option['initialize']=False”,因为如果我不这样做,就会出现错误“模型无法初始化”。我这么做了,但我真的不明白为什么。是同一个问题吗?你能给我更多关于你的第三点的细节吗?
    equation
     if not use_m_flow_in then
      m_flow_in_internal = m_flow;
     end if;
     connect(m_flow_in, m_flow_in_internal);