Python FMU FMI模拟,设置特定类型参数时不修改结果
我基于MSL的流体库开发了一个简单的Modelica模型。我将一个MassFlowSource与一个管道和一个边界点连接起来,作为汇函数,如下图所示: 我使用OpenModelica生成一个FMU包(在模式模型交换中)。 我使用python管理这个FMU包,代码如下: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
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,但我以前遇到过类似的情况。你可以试试下面的一些东西
无论何时尝试为参数设置新值, 遵循以下步骤:
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);