是否可以使用Modelica构建“有条件”FMU?

时间:2017-02-17 07:34:15

标签: modelica dymola

我有一个应用程序,我使用Dymola作为开发环境,但将以FMU形式导出模型以用于其他应用程序。我正在建模的系统具有可互换的组件,使它们非常适合在Modelica中进行建模。但是,当我想以FMU格式导出模型时,我不确定是否可以利用该功能。

考虑下面非常简单的包。该软件包的目标是定义两个非常简单的模型,并允许用户在执行模型时在可能的模型之间进行选择。虽然这在Modelica IDE中很容易做到,但我需要在FMU中使用类似的功能。

部分模型定义了一个模型,其中y = p0 + p1 * x。两个扩展模型只是为参数p0和p1分配不同的值。最后,TestModel添加了一个名为modelIndex的参数,该参数用于定义两种可能的模型类型的条件表达式。在Dymola中,这非常有用,因为用户可以轻松设置参数modelIndex的值。我试图通过使modelIndex成为FMU的输入来确定是否可以通过FMU实现此目的。但是如果我为modelIndex变量设置了注释Evaluate = false,则编译失败。陈述的错误是:   “Modelica翻译器的当前版本只能处理具有固定条件的条件组件。条件声明条件下使用的所有变量必须声明为常量或参数。”

如果有人可以提供有关如何创建条件FMU的指导,我们将不胜感激。这个简单的例子仅用于演示该问题。建模的真实系统有4-5个主要组件,每个组件有5个以上可能的不同模型,产生大量可能的排列。简单地批量导出所有配置可能是不可行的。

谢谢! 贾斯汀

package ConfigurableModel 
  "Package to test whether or not models can be configured by external inputs"
  partial model partialModel 
    "Partial model used to control selectable options in Dymola"

    Modelica.Blocks.Interfaces.RealInput x(start = 1) "input value";
    Modelica.Blocks.Interfaces.RealOutput y "output value";

    parameter Real p0 = 0;
    parameter Real p1 = 0;

  equation 
    y = p0 + p1*x;
      annotation (Icon(coordinateSystem(preserveAspectRatio=false)), Diagram(
      coordinateSystem(preserveAspectRatio=false)));
  end partialModel;

  model linearModel_NoOffset "Linear model with no offset"
    extends partialModel(p0 = 0, p1 = 1);
  end linearModel_NoOffset;

  model linearModel_Offset "Linear model with offset"
    extends partialModel(p0=1, p1=1);
  end linearModel_Offset;

  model TestModel "Model to test configurability"
    // parameter Integer modelIndex = 2 "1 = linear_NoOffset, 2 = linear_Offset" annotation(Evaluate=false);

    parameter Integer modelIndex = 2 "1 = linear_NoOffset, 2 = linear_Offset";

    // Conditional instances, only one model is created based upon value of modelIndex
    linearModel_NoOffset linear_NoOffset if modelIndex == 1;
    linearModel_Offset linear_Offset if modelIndex == 2;

    // Input and output blocks
    Modelica.Blocks.Sources.Constant xMaster(k=1) annotation (Placement(transformation(extent={{-100,-10},{-80,10}})));
    Modelica.Blocks.Interfaces.RealOutput yMaster annotation (Placement(transformation(extent={{100,-10},{120,10}})));

  equation 
    // Note that only the connections for the components that exist will be used

    // Connect input to each model instance
    connect(xMaster.y, linear_NoOffset.x);
    connect(xMaster.y, linear_Offset.x);

    // Connect output to each model instance
    connect(yMaster, linear_NoOffset.y);
    connect(yMaster, linear_Offset.y);

      annotation (Icon(coordinateSystem(preserveAspectRatio=false)), Diagram(
      coordinateSystem(preserveAspectRatio=false)));
  end TestModel;
    annotation (uses(Modelica(version="3.2.1")));
end ConfigurableModel;

2 个答案:

答案 0 :(得分:2)

据我了解,这不可能直接用FMI实现。在生成作为FMU的一部分的C代码(作为C代码或编译形式)之前,在Modelica的符号处理期间处理Modelica的面向对象特征,如条件实例化。通过条件实例化,可以改变输出的FMU的许多属性(例如,具有不同数量的状态)。所以你不能在FMU中有一个描述FMU属性的modeldescription.xml文件。 您可以考虑将模型拆分为多个FMU,并通过交换其中的一些来处理子系统的可变性。然而,这可能导致比原始整体Modelica模型更复杂的数值任务,因为整体模型上的Modelica编译器无法对整体模型进行优化。您的示例中的一个优点是,您的部分模型已经具有因果接口(RealInput和RealOutput) 接近预期解决方案的解决方法可能是,在模型中包含子模型linear_NoOffset和linear_Offset(不包括“if modelIndex == xy”),包括由modelIndex触发的开关,以在信号之间切换信号。两个子模型。可能会导致一些计算开销,因为两个子模型都存在并被评估。

答案 1 :(得分:2)

你的问题听起来好像可以用Elmqvist (2014)的方法来解决,虽然从那以后我没有听到更多关于这个主题的内容。我不确定Dymola是否添加了任何自动方法,但您可以尝试明确切换模型的模型。