即使使用Modelica几个月以来,我对新的功能(例如继承和替换)也不熟悉。Modelica - 型号变体(标准版本和更复杂版本)
我有一个标准模型(即一个池)和一个更复杂的变体(即包括蒸发计算):这两个模型有许多共同部分,我想“重用”,但它们也有一些区别: (即质量和能量平衡方程)是不同的(复杂的模型有更多的项),复杂的模型包括更多的参数,变量和方程(即空气和蒸汽性质和法则)。
我想我在Modelica的一些可能性来做到这一点:
- 写下两个独立的模型(只用精彩不容同步复制粘贴文本功能) - 我不喜欢。
- 使用继承(1)编写包含通用定义的部分模型和包含特定部分的两个继承模型。
- 使用继承(2)编写两个包含不同方程组(和其他特定定义)的部分模型,并编写包含通用定义并继承两个部分模型之一的第三个模型(例如,通过布尔值选择参数)。其实我并不确定我可以做到这一点:部分模型将包含具有未定义变量/参数的方程(这将在继承模型中定义):是吗?
- 编写标准模型并用新的方程替换方程,并添加附加定义。
我在(2)中实现了,见下面的例子1。不过,我不明白如何使用替换机制(请参阅我在示例2中的失败尝试)。我错在哪里?
下面的例子是我写的试图了解如何去做的简化模型。
实施例1
package Inherited_base
partial model Base
parameter Real a=1;
parameter Real b=2;
Real c;
Real d;
equation
c+d = b;
end Base;
model Variant_1
extends Base;
equation
c = time*a;
end Variant_1;
model Variant_2
extends Base;
parameter Real e=0.5;
Real d;
equation
c+d*e = time*a;
end Variant_2;
end Inherited_base;
实施例2
model Base
parameter Real a=1;
parameter Real b=2;
class Eqs
Real c;
Real d;
equation
c = time*a;
end Eqs;
equation
replaceble Eqs bouclage;
bouclage.c+bouclage.d = b;
end Base;
编辑:我试图回答我的问题在弹头3:同时限定一个局部模型我得到的错误消息,其中变量/方程中使用的参数没有在类中定义。我通过略微修改我的想法解决了这个问题:我对这两种情况使用了相同的等式,但是我有一个术语(在本例中为'额外'),根据具体情况考虑要使用的不同变量/参数。然而,看起来不可能交互式地选择要扩展的模型:这里的例子是错误的(没有“if”,只有一个'extends'就没有问题)。
例3
package Inherited_variants
model Final
parameter Real a=1;
parameter Real b=2;
Real c;
Real d;
parameter Boolean complexmodel = false;
if complexmodel then
extends Variant_2;
else
extends Variant_1;
end if;
equation
c+d = b;
c+extra = time*a;
end Final;
partial model Variant_1
parameter Real extra=0;
end Variant_1;
partial model Variant_2
parameter Real e=0.5;
Real d;
Real extra;
equation
extra = d*e;
end Variant_2;
end Inherited_variants;
编辑后斯科特G和汉斯·奥尔森回答(感谢你们两个!)。 这些例子很有趣,但我仍然对你的例子中广泛使用“extends”感到困惑。所以我试图简化你的代码,并从here中学到了一些东西。
斯科特的例子重新排列:
package Example
partial model FinalTerm
end FinalTerm;
model Final
model Variant_1
extends FinalTerm;
parameter Real extra=0;
end Variant_1;
parameter Real a=1;
parameter Real b=2;
Real c;
Real d;
replaceable model VarType = Variant_1 constrainedby FinalTerm annotation(choicesAllMatching=true);
//replaceable model VarType = Variant_1 constrainedby FinalTerm annotation(choices(choice=redeclare Variant_2 VarType,
// choice=redeclare Variant_1 VarType));
VarType varType;
equation
c+d = b;
c+varType.extra*d = time*a;
end Final;
model Variant_2
extends FinalTerm;
parameter Real e=0.5;
Real extra;
equation
extra = e;
end Variant_2;
end Example;
汉斯例如重新排列:
package Example_2
partial model FinalTerm
end FinalTerm;
model Final
model Variant_1
extends FinalTerm;
parameter Real extra=0;
end Variant_1;
parameter Real a=1;
parameter Real b=2;
Real c;
Real d;
replaceable Variant_1 test constrainedby FinalTerm annotation(choicesAllMatching=true);
//replaceable Variant_1 test constrainedby FinalTerm annotation(choices(choice=redeclare Variant_2 test "NEW",
// choice=redeclare Variant_1 test "OLD"));
equation
c+d = b;
c+test.extra*d = time*a;
end Final;
model Variant_2
extends FinalTerm;
parameter Real e=0.5;
Real extra;
equation
extra = e;
end Variant_2;
end Example_2;
我明白了(至少我认为):
- 这两个例子的区别/办法。为了我的使用目的,我个人更喜欢汉斯的方法(组件更换)。但是,要一次执行多个组件,Scott会更多地使用它。
- 使用“扩展”不是强制性的。我发现的唯一用途是允许使用'constrainedby',这个'constrainedby'必须指向一个〜共同的母亲班级(对于我的不正确措辞感到抱歉);这与Scott提供的“注释”结合在一起,允许在参数中有一个下拉菜单,这些参数不是无用的(也可以和Hans的技术一起使用)。
一个小问题仍然是开放的:根据the previous webpage应该可以定义“注释(选择())”手名单,但我没有成功(见前面的例子中注释行)。这将允许正确的下拉菜单,而不需要使用“共同母亲级”来“扩展”和“constrainedby”关键字。有人知道我错在哪里吗?
我相信我已经在我的更新答案中解决了您的新问题。使用括号“choice(choice())”而不是“choices(choice = stuff)”似乎可以解决这个问题。注意。我相信这是'redeclare'的一个细微差别,可能是因为Tiller更新了Modelica By Example的部分作为'choice = stuff'仍然适用于其他情况。但不知道。 –
感谢这个额外的答案。 “选择(选择=东西)”解决方案正常工作,至少对于“组件替换”。对于'类型'替换,出现正确的下拉菜单,但选择不是由工具(Dymola)存储,最后总是采用标准选项。 – Songio
我更好地研究了您的示例,并且我看到您仅将此解决方案应用于“组件”替换,而不是键入。所以我只是使用了错误的语法。有效的是: '注释(选择( 选择(redeclare模型VarType = Test_ModelicaComplexity.Replacement_SO.Example_1.Variant_2“NEW”), 选择(redeclare model VarType = Variant_1“STD”)));'' – Songio