我想要一个从另一个基本包扩展的包。基本包包含向量类型和常量整数,其中包含向量的每个索引号的名称。它还包含一个向量常数,为每个元素赋予一个值(描述元素的某些属性)。在扩展包中,我想添加一个向量类型的元素并为新索引添加一个新名称,并向向量常量添加一个具有特定值的元素(描述物质的某些属性)。
使用可替换 - 扩展 - 重新声明的技术,可以直接使用元素扩展向量类型,并将附加元素的新常量整数附加到包中。但我不确定如何在常量向量上附加一个新元素。
下面的代码在 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;