我想要一个从另一个基本软件包扩展的软件包。基本包包含一个向量类型和常数整数,每个向量的索引号都带有名称。它还包含一个向量常数,该常数为每个元素提供一个值(描述该元素的某些属性)。在扩展包中,我想添加一个向量类型的元素,并为新索引添加一个新名称,还想向向量常量添加一个具有特定值的元素(描述该物质的某些属性)。
使用具有可替换-扩展-重新声明的技术,可以很直接地扩展带有元素的向量类型,并为包中的元素添加新的常量整数到包中。但是我不确定如何在常量向量后面附加新元素。
以下代码可在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;
答案 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或OpenModelica是否可以处理它。
BTW:错误消息是正确的,因为自Modelica 1.2起重新声明常量是非法的。