1

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

使用可替换 - 扩展 - 重新声明的技术,可以直接使用元素扩展向量类型,并将附加元素的新常量整数附加到包中。但我不确定如何在常量向量上附加一个新元素。

下面的代码在 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;
4

1 回答 1

1

您可以(因为 Modelica Language 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 或 OpenModelica 可以处理它。

顺便说一句:错误消息是正确的,因为自 Modelica 1.2 以来重新声明常量是非法的。

于 2019-03-05T08:43:01.297 回答