我想导出一个 Modelica 模型作为使用 Dymola 2014 进行联合仿真的 FMU。我计划使用 pyfmi 完成联合仿真。

为了测试这一点,我试图模拟通过两个流体边界之间的管道的流体流动。我希望流体源的压力作为模型的输入。我的计划是在外部计算这个压力并在每个时间步输入 Modelica 模型。

我的所有标准库组件的初始模型是:

model SE_BVP "BVP for stack exchange."
  inner Modelica.Fluid.System system;
  Modelica.Fluid.Pipes.StaticPipe pipe(
    redeclare package Medium = Modelica.Media.Air.MoistAir,
    length=1,
    diameter=1);
  Modelica.Fluid.Sources.Boundary_pT boundary1(nPorts=1, redeclare package
    Medium = Modelica.Media.Air.MoistAir);
  Modelica.Fluid.Sources.Boundary_pT boundary(nPorts=1, redeclare package Medium=
    Modelica.Media.Air.MoistAir, use_p_in=true);
  Modelica.Blocks.Interfaces.RealInput p_in1;

equation
   connect(pipe.port_b, boundary1.ports[1]);
   connect(boundary.ports[1], pipe.port_a);
   connect(boundary.p_in, p_in1);
end SE_BVP;

然后我将其包装在两个测试模型中:
model SE_BVP_test_1
 Real preVal = 101335;
 SE_BVP SE_BVP_1;

equation
 SE_BVP_1.p_in1 = preVal;

end SE_BVP_test_1;

以及参数类型,这是根据@Thierry 的建议完成的
model SE_BVP_test_2
  parameter Real preVal = 101335;
  SE_BVP SE_BVP_1;

equation
  SE_BVP_1.p_in1 = preVal;

end SE_BVP_test_2;

运行这些模型给了我相同的结果:



两种模型都在 Dymola 中工作。

现在我想加载 fmu 并使用 pyfmi 进行模拟,所以我写了这个脚本:

  import pyfmi
  import numpy as np
  import pylab as P
  import os

  # Define the FMU to test
  fmuDirNam = "SE_BVP_Test_1"  # CS 2.0 type FMU
  fmuNam = fmuDirNam + ".fmu"

  # Define the input var
  inVar = "preVal"

  # Get the path to the FMU
  curr_dir = os.path.dirname(os.path.abspath(__file__))
  par_dir = os.path.dirname(curr_dir)
  path_to_fmu = os.path.join(par_dir, "projectFMUs", fmuDirNam)

  # Load the model
  model = pyfmi.load_fmu(os.path.join(path_to_fmu, fmuNam))

失败并给我以下错误:
FMIL: module = FMI2XML, log level = 2: XML element
'Real': could not parse value for real attribute
 'start'='pipMod.pipe.flowModel.states[1].p/(gasConstant_Unique7(
      Modelica.Media.Air.MoistAir.ThermodynamicState(
 p =

FMIL: module = FMI2XML, log level = 2: XML element
'Real': could not parse value for   real attribute
'start'='pipMod.pipe.flowModel.states[2].p/(gasConstant_Unique7(
Modelica.Media.Air.MoistAir.ThermodynamicState(
p =

FMIL: module = FMI2XML, log level = 2: XML element
'Real': could not parse value for real attribute
'start'='Modelica.Media.Incompressible.TableBased.Polynomials_Temp.evaluate({-4.96717436974791E-11, 5.06626785714286E-08, 1.72937731092437
FMIL: module = FMI2XML, log level = 2: XML element 'Real': could not parse value for real attribute
'start'='Modelica.Media.Incompressible.TableBased.Polynomials_Temp.evaluate({-4.96717436974791E-11, 5.06626785714286E-08, 1.72937731092437

FMIL: module = FMI2XML, log level = 1: No model structure information available.
Cannot continue.

FMIL: module = FMI2XML, log level = 1: Parse error at line 2703:
parsing aborted

从回溯:
pyfmi.fmi.FMUException: The XML-could not be read. Parse error at line 2703:
parsing aborted

鉴于模型在 Dymola 中正确模拟,什么可能导致此解析错误?
  • 我也用 CS 1.0 导出尝试了这个并引发了相同的异常,尽管这次使用不同的模块读取 fmu。
  • 我认为通过删除 inputparameter 标签会出现一些神秘的变量问题,但没有。即使在 parameter 中使用 Test_2 标记,我也会引发相同的异常(CS 2.0)。

  • 总结:Dymola 2014,python 2.7.x,FMI for CO-simulation 2.0

    最佳答案

    @RwardBound:如果您想在模拟过程中更改参数,那么我建议使用 FMI 2.0 而不是 FMI 1.0 FMU。 FMI 2.0 支持此功能。例如,最新版本的 Dymola 能够生成此类 FMU。我认为 PyFMI 也支持 FMI 2.0。

    祝一切顺利,
    蒂埃里

    关于python-2.7 - 准备 FMU : Interchanging model parameters for model inputs,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25305763/

    10-10 21:44