Modelica的:如何使用可更换的部件?(Modelica: how to use replace

2019-10-16 12:52发布

我试图建立同一范围内一个模型,可以使用两种不同的组件(从现有的库中提取):特别是具有热交换系统; 该热交换器可基于不同的技术,例如:管道或板。

我想要再定义一个默认的可更换器的模型,并说这等技术也可以使用。

这是什么,我尝试了合租简单为例:

package Test

  // Component 1 original definition in the library
  model COMP1
    parameter Real p1=1 "";
    Real v "";
  equation 
    v=p1*time;
  end COMP1;

  // Component 2 original definition in the library
  model COMP2
    parameter Real p2=1 "";
    Real v "";
  equation 
    v=p2*time;
  end COMP2;

  // Main module (system)
  model MAIN
    parameter Real pm=100 "";
    Real vm "";

    // Redefinition of the component modifing the default values
    model call1 = COMP1(p1=10);
    model call2 = COMP2(p2=20);

    replaceable call1 OBJ
    annotation(choices(
            choice(redeclare call1 OBJ "Default"),
            choice(redeclare call2 OBJ "Variant")));

  equation 
    vm = OBJ.v+pm;
  end MAIN;

  // Application model, using the main model
  model APP
    MAIN mAIN;
  end APP;

end Test;

该模型APP成功运行。 然而,如果我打开APP.mAIN和变化OBJ的参数(或者选择“默认”或“变体”),这导致对矫正的APP模型如下:

  model APP
    MAIN mAIN(redeclare call1 OBJ "Default");
  end APP;

我得到以下错误:

Component type specifier call1 not found

我不明白我做错了什么,请帮助。

Answer 1:

有关错误的问题时,因为你没有在选择注释使用正确的类路径。

如果您在选择“默认” APP ,你会得到下面的代码:

model APP
  MAIN mAIN(redeclare call1 OBJ "Default");
end APP;

在这里,我们看到的是,类路径call1无效。 APP可以访问call1只能使用相对类路径MAIN.call1或绝对类路径Test.MAIN.call1 。 所以,你可以修复使用下面的注解这个问题:

  replaceable call1 OBJ
  annotation(choices(
          choice(redeclare MAIN.call1 OBJ "Default"),
          choice(redeclare MAIN.call2 OBJ "Variant")));

然而,在Dymola的模型仍然不检查,显然是由于在当地的类定义MAIN下部分修改默认值的重新定义 。 在这里,你创建新类call1call2 。 这可能是一个错误Dymola的,因为它在OpenModelica - 但新类是没有必要的。 相反,您可以使用原来的类,并设置与修改公式中的参数在redeclare声明如下:

model MAIN
  parameter Real pm=100 "";
  Real vm "";

  replaceable COMP1 OBJ
  annotation(choices(
          choice(redeclare Test.COMP1 OBJ(p1=10) "Default"),
          choice(redeclare Test.COMP2 OBJ(p2=10) "Variant")));
equation 
  vm = OBJ.v+pm;
end MAIN;

现在,该模型适用于没有选择与“默认”,但在选择“变体”,Dymola的抱怨说,重新声明类不包含相同的变量原之一。 这是当你有可更换类工作,你必须的一种限制(再次,OpenModelica有没有问题,但Dymola的警告你,这是不符合的Modelica语言规范)

替代做法:MSL-风格与界面

我建议创建类似的Modelica库通常不会(例如用接口模型Modelica.Electrical.Analog.Interfaces.OnePort ):

  • 您创建一个partial基本模型,其中包含一切,这是常见的所有变体,称为界面
  • 变体扩展接口与现有的库的车型之一
  • 使用变体的类实例化变体之一和约束重声明到接口使用constrainedby
  • 除了手动创建的选择注解,你现在可以用注释choicesAllMatching自动创建

这是怎样的例子可能看起来像。 第三方组件COMP1COMP2被移动到包装ReadOnlyLibrary

package Test
  // Original definition of Component 1 and 2 in the external library
  package ReadOnlyLibrary
    model COMP1
      parameter Real p1=1 "";
      Real v "";
    equation 
      v=p1*time;
    end COMP1;

    model COMP2
      parameter Real p2=1 "";
      Real v "";
    equation 
      v=p2*time;
    end COMP2;
  end ReadOnlyLibrary;

  // Interface and variants with modified default values
  partial model Call_Interface
    Real v "";
  end Call_Interface;

  model Call1 "Default"
    extends Call_Interface;
    extends ReadOnlyLibrary.COMP1(p1=10);
  end Call1;

  model Call2 "Variant"
    extends Call_Interface;
    extends ReadOnlyLibrary.COMP2(p2=20);
  end Call2;

  // Main module (system)
  model Main
    parameter Real pm=100 "";
    Real vm "";

    replaceable Test.Call1 OBJ constrainedby Test.Call_Interface annotation (choicesAllMatching);

  equation 
    vm = OBJ.v+pm;
  end Main;

  // Application model, using the main model
  model App
    Main main annotation (Placement(transformation(extent={{-12,10},{8,30}})));
  end App;
end Test;


文章来源: Modelica: how to use replaceable components?
标签: modelica