有没有可能建立一个;有条件的;FMU使用Modelica?

有没有可能建立一个;有条件的;FMU使用Modelica?,modelica,dymola,Modelica,Dymola,我有一个应用程序,我正在使用Dymola作为开发环境,但将以FMU形式导出模型,以便在另一个应用程序中使用。我正在建模的系统具有可互换的组件,非常适合在Modelica中建模。但是,当我想以FMU形式导出模型时,我不确定我是否能够利用该功能 考虑下面非常简单的包。该包的目标是定义两个非常简单的模型,并允许用户在执行模型时在可能的模型之间进行选择。虽然这在ModelicaIDE中很容易做到,但我需要在FMU中具有类似的功能 部分模型定义了一个模型,其中y=p0+p1*x。这两个扩展模型只是将不同的

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

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

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

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

谢谢! 贾斯汀


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

您的问题似乎可以使用的方法解决,尽管从那时起我就没有听到更多关于这个主题的内容。我不确定Dymola是否添加了任何自动方法,但您可以尝试显式切换模型。

Christian,谢谢您的回复。不幸的是,你的回答正是我所期望的。如果有人知道其他选择,我将感谢反馈。我正在考虑以下几点:1。为子组件的每个所需排列导出多个FMU。2.参数化每个子组件,以便可以使用相同的结构指定它们,但只能指定不同的参数值。不幸的是,对于我的真实系统来说,包含多个子模型的代价可能太高了,因为这些模型比简单的例子要复杂得多。谢谢,贾斯汀,谢谢你的推荐。我已经审阅了这篇论文,并同意它对我的情况很有用。我已经向Hilding Elmqvist和Dymola技术支持部门提交了问题,以评论自论文发表以来实现了哪些功能。我将根据他们的反馈提供最新意见。Dymola技术支持部门表示,Elmqvist(2014)中概述的功能迄今尚未纳入Dymola,也不在Dymola 2018年的计划中。但他们仍在继续进一步调查,看看是否能找到解决办法。
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;