2017-04-05 66 views
1

即使使用Modelica幾個月以來,我對新的功能(例如繼承和替換)也不熟悉。Modelica - 型號變體(標準版本和更復雜版本)

我有一個標準模型(即一個池)和一個更復雜的變體(即包括蒸發計算):這兩個模型有許多共同部分,我想「重用」,但它們也有一些區別: (即質量和能量平衡方程)是不同的(複雜的模型有更多的項),複雜的模型包括更多的參數,變量和方程(即空氣和蒸汽性質和法則)。

我想我在Modelica的一些可能性來做到這一點:

  1. 寫下兩個獨立的模型(只用精彩不容同步複製粘貼文本功能) - 我不喜歡。
  2. 使用繼承(1)編寫包含通用定義的部分模型和包含特定部分的兩個繼承模型。
  3. 使用繼承(2)編寫兩個包含不同方程組(和其他特定定義)的部分模型,並編寫包含通用定義並繼承兩個部分模型之一的第三個模型(例如,通過布爾值選擇參數)。其實我並不確定我可以做到這一點:部分模型將包含具有未定義變量/參數的方程(這將在繼承模型中定義):是嗎?
  4. 編寫標準模型並用新的方程替換方程,並添加附加定義。

我在(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」關鍵字。有人知道我錯在哪裏嗎?

+0

我相信我已經在我的更新答案中解決了您的新問題。使用括號「choice(choice())」而不是「choices(choice = stuff)」似乎可以解決這個問題。注意。我相信這是'redeclare'的一個細微差別,可能是因爲Tiller更新了Modelica By Example的部分作爲'choice = stuff'仍然適用於其他情況。但不知道。 –

+0

感謝這個額外的答案。 「選擇(選擇=東西)」解決方案正常工作,至少對於「組件替換」。對於'類型'替換,出現正確的下拉菜單,但選擇不是由工具(Dymola)存儲,最後總是採用標準選項。 – Songio

+0

我更好地研究了您的示例,並且我看到您僅將此解決方案應用於「組件」替換,而不是鍵入。所以我只是使用了錯誤的語法。有效的是: '註釋(選擇( 選擇(redeclare模型VarType = Test_ModelicaComplexity.Replacement_SO.Example_1.Variant_2「NEW」), 選擇(redeclare model VarType = Variant_1「STD」)));'' – Songio

回答

1

你想用replaceable model模型,而不是if語句之間變化。下面是一個鬆散地基於你的例子的例子。我將讓你重新思考如何制定好你的問題,正確使用可更換的功能。希望能幫助到你。

在Dymola的2017年FD01測試...

不知道OMEdit正確處理replaceable用作似乎已經就正在解決一些長期問題: https://trac.openmodelica.org/OpenModelica/ticket/2079

package Example 

    model Test 
    // Simple test of the component "Final" 

    Final Final1(
     redeclare model VarType = Variant_1, 
     redeclare Variant_2 varType2, 
     redeclare Example.Variant_3 varType3 "Test") 
     annotation (Placement(transformation(extent={{-10,-10},{10,10}}))); 
    end Test; 

    model Final 
    // Model demonstrating difference ways to use "replaceable" 

    extends ReplaceableModels.PartialModel; 

    replaceable model VarType = ReplaceableModels.Variant_1 constrainedby 
     ReplaceableModels.PartialVariants 
           annotation(choicesAllMatching=true); 

    VarType varType1; 

    replaceable ReplaceableModels.Variant_1 varType2 constrainedby 
     ReplaceableModels.PartialVariants annotation (choicesAllMatching=true); 

    replaceable ReplaceableModels.Variant_1 varType3 constrainedby 
     ReplaceableModels.PartialVariants annotation (choices(
     choice(redeclare Example.Variant_1 varType3 "OLD"), 
     choice(redeclare Example.Variant_2 varType3 "NEW"), 
     choice(redeclare Example.Variant_3 varType3 "Test"))); 

    equation 
     result1 = varType1.extra; 
     result2 = varType2.extra; 
     result3 = varType3.extra; 

    end Final; 

    model Variant_1 

     extends ReplaceableModels.PartialVariants; 

     parameter Real extra0=0; 

    equation 
    extra = extra0; 

    end Variant_1; 

    model Variant_2 

     extends ReplaceableModels.PartialVariants; 

     parameter Real a=1; 
     Real b; 
     Real c; 
     parameter Real e=0.5; 
     parameter Real d = 0.1; 

    equation 

     c+d = b; 
     c+extra = time*a; 
     extra = d*e; 

    end Variant_2; 

    model Variant_3 

     Real extra; 

     parameter Real a=1; 
     Real b; 
     Real c; 
     parameter Real e=0.5; 
     parameter Real d = 0.1; 

    equation 

     c+d = b; 
     c+extra = time*a; 
     extra = d*e; 

    end Variant_3; 

    partial model PartialModel 

    Real result1; 
    Real result2; 
    Real result3; 

    end PartialModel; 

    partial model PartialVariants 

    Real extra; 

    end PartialVariants; 
end Example; 

UPDATE:

添加註釋,以便在GUI中,有一個下拉箭頭,模型選擇。

更新2:

我更換了一個擴展案例的原代碼,演示了基於海報的另一個問題用更換了幾個不同的方法。該代碼現在還包括(Final)創建的模型的Test,包括Variant_3不從部分類擴展,以顯示choices註釋如何讓你還包括額外的模型,如果這是你的情況下非常有用。

0

斯科特G公司的解決方案的一個替代方案是使用可更換的組件,而不是(使用他的代碼爲基礎):

package ReplaceableComponentTest 
    model Test2 "Showing how to change it" 
    extends Final(redeclare Example.Variant_2 varType); 
    end Test2; 

    model Final 
    extends Example.PartialModel; 
    replaceable Example.Variant_1 varType constrainedby 
     Example.PartialVariants annotation(choices(
      choice(redeclare Example.Variant_2 test "NEW"), 
      choice(redeclare Example.Variant_1 test "OLD"))); 
    equation 
     result = varType.extra; 
    end Final; 
end ReplaceableComponentTest; 

package Example 

    model Variant_1 
     extends Example.PartialVariants; 
     parameter Real extra0=0; 
    equation 
    extra = extra0; 
    end Variant_1; 

    model Variant_2 
     extends Example.PartialVariants; 

     parameter Real a=1; 
     Real b; 
     Real c; 
     parameter Real e=0.5; 
     parameter Real d = 0.1; 

    equation 
     c+d = b; 
     c+extra = time*a; 
     extra = d*e; 
    end Variant_2; 

    partial model PartialModel 

    Real result; 

    end PartialModel; 

    partial model PartialVariants 

    Real extra; 

    end PartialVariants; 
end Example; 

此情況下,兩個工作。請注意,我選擇加入的註釋,以及 - 和爲安全起見使用的類的全名(即使它應該工作)。

如果您有該模型的多個組件,則需要使用可替換的模型,而在其他情況下,它更像是一個樣式問題。