即使使用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