Modelica-如何扩展(最小)媒体包

时间:2019-03-05 08:23:33

标签: modelica openmodelica jmodelica

我想要一个从另一个基本软件包扩展的软件包。基本包包含一个向量类型和常数整数,每个向量的索引号都带有名称。它还包含一个向量常数,该常数为每个元素提供一个值(描述该元素的某些属性)。在扩展包中,我想添加一个向量类型的元素,并为新索引添加一个新名称,还想向向量常量添加一个具有特定值的元素(描述该物质的某些属性)。

使用具有可替换-扩展-重新声明的技术,可以很直接地扩展带有元素的向量类型,并为包中的元素添加新的常量整数到包中。但是我不确定如何在常量向量后面附加新元素。

以下代码可在JModelica(2.4)中使用,但涉及到重新声明和原始基础包中值的复制。但是,在Medium3中,JModelica不接受常量向量mw的第四个重新声明语句。但是,如果我在扩展完成后将redeclare语句作为第一行,则它确实起作用(请参见Fritzson第4.3.1节)。但是,重新声明应该是原始的子类型,而Real3]不是Real [2]的子类型,但是编译器似乎仍然可以进行管理。

当我在OpenModelica(1.13)中尝试相同的代码时,由于我重新声明了一个常量,并且在Medium3中的第一次重新声明中已经出现错误,所以我收到了错误消息。我不确定这是否是正确的错误消息,并且不会出现在JModelica中。

否则,OpenModelica(和JModelica)接受Medium2,而没有任何警告或错误。而这些测试只需更改LiquidCon中使用的介质即可。

我的主要问题是,是否有比我的代码更直接的解决方案,用如上所述的一种物质对介质包装进行扩展,并且这是更标准的解决方案(并且与JModelica和OpenModelica和Modelica一起使用一般)。

理所当然的是要整理出Modelica标准在这里所说的内容,然后我们可以将这些信息作为错误报告提供给JModelica和OpenModelica背后的组织。

感谢您的投入/ Jan Peter

摘录于DEMO_v8软件包

package Medium2
    replaceable constant String name = "Two components"    "Medium name";
    replaceable constant Integer nc = 2                    "Number of substances";
    replaceable type Concentration = Real[nc]              "Substance conc";
    replaceable constant Real[nc] mw = {10, 20}            "Substance weight";  
    constant Integer A = 1                                 "Substance index";
    constant Integer B = 2                                 "Substance index";   
end Medium2;

package Medium3 
    import M2 = DEMO_v8.Medium2;
    extends M2
        (redeclare constant String name="Three components" "Medium name",
         redeclare constant Integer nc=3                   "Number of substances",
         redeclare type Concentration = Real[nc]           "Substance conc");
    redeclare constant Real[nc] mw = cat(1,M2.mw,{30})     "Substance weight";
    constant Integer C = 3                                 "Substance index";   
end Medium3;

connector LiquidCon
    replaceable package medium=DEMO_v8.Medium3; 
    medium.Concentration c                                 "Substance conc";
    flow Real F (unit="m3/s")                              "Flow rate";
end LiquidCon;

1 个答案:

答案 0 :(得分:1)

您可以(由于Modelica语言3.2-在3.1中是非法的)只需按以下方式修改常量的值即可:

package Demo_v8

  package Medium2
    replaceable constant String name="Two components" "Medium name";
    constant Integer nc=2 "Number of substances";
    replaceable type Concentration = Real[nc] "Substance conc";
    constant Real[nc] mw={10,20} "Substance weight";
    constant Integer A=1 "Substance index";
    constant Integer B=2 "Substance index";
  end Medium2;

  package Medium3
    import M2 = Demo_v8.Medium2;
    extends M2(
      name="Three components" "Medium name",
      nc=3 "Number of substances",
      mw=cat(1, M2.mw, {30}),
      redeclare type Concentration = Real[nc] "Substance conc");
    constant Integer C=3 "Substance index";
  end Medium3;

  connector LiquidCon
    replaceable package medium = Demo_v8.Medium3;
    medium.Concentration c "Substance conc";
    flow Real F(unit="m3/s") "Flow rate";
  end LiquidCon;
end Demo_v8;

但是,我尚未验证JModelica.org或O​​penModelica是否可以处理它。

BTW:错误消息是正确的,因为自Modelica 1.2起重新声明常量是非法的。