![](/img/trans.png)
[英]Parametrised Modelica library and possibility to use models as parameters - part 2
[英]Parametrised Modelica library and possibility to “delay” setting of structural parameter - part 3
我努力尋找一種將代碼分為兩部分的好方法:通用庫和應用程序代碼,我使用的示例通常包含液體,我想讓通用庫獨立於液體中的組件數量。 這個想法是應用程序代碼設置使用的液體介質,然后從通用庫中導入設備並使這些設備適應實際介質。
下面的示例是一個非常簡潔的示例,它說明了進行這種代碼划分的一種方法。 在這里,我在部分包 MediumBase 中未定義組件數量的值 nc。 稍后當 EquipmentLib 適應實際的 Medium 時,nc 會得到一個值。 這就是我所說的結構參數“延遲”設置的意思。 該代碼在 JModelica 和 OpenModelica 中運行良好。
package DEMO_v30
// Author: Jan Peter Axelsson
// ---------------------------------------------------------------------------------------------
// Interfaces
// ---------------------------------------------------------------------------------------------
import Modelica.Blocks.Interfaces.RealInput;
import Modelica.Blocks.Interfaces.RealOutput;
partial package MediumBase
constant Integer nc "Number of components";
replaceable type Concentration = Real[nc] "Component conc";
end MediumBase;
package Medium3
extends MediumBase (nc=3);
end Medium3;
// ---------------------------------------------------------------------------------------------
// Equipment dependent on the medium
// ---------------------------------------------------------------------------------------------
package EquipmentLib
replaceable package Medium = MediumBase // formal parameter - EquipmentLib
constrainedby MediumBase;
model ReactorType
parameter Medium.Concentration c_0 = ones(Medium.nc) "Initial component conc";
Medium.Concentration c (start=c_0, each fixed=true) "Component conc";
equation
for i in 1:Medium.nc loop
der(c[i]) = -c[i];
end for;
end ReactorType;
end EquipmentLib;
// ---------------------------------------------------------------------------------------------
// Adaptation of package Equipment to Medium3
// ---------------------------------------------------------------------------------------------
package Equipment
import DEMO_v30.EquipmentLib;
extends EquipmentLib(redeclare package Medium=Medium3);
end Equipment;
// ---------------------------------------------------------------------------------------------
// Examples of systems
// ---------------------------------------------------------------------------------------------
model Test
Equipment.ReactorType reactor;
end Test;
end DEMO_v30;
在具有相同代碼結構的稍大的示例中,我遇到了一些問題:
該消息對我來說沒有意義,因為 nc 在編譯時已知,在 EquipmentLib 適應的級別。 這個問題實際上可以通過在 MediumBase 中給 nc 一個“虛擬”值 nc=1 在 Medium Base 中解決,然后在編譯期間將 nc 更改為適應 EquipmentLib 時提供的值。
所以我的問題是:
如果需要,我可以提供更大的例子,但我認為這可能是一個更一般的答案。
1)理論上我理解你的意思,但modelica語言標准要求每個模型(除了連接器和部分模型)本身是有效的。 這似乎與您的情況無關,因為您定義了一個部分包,這里的問題是您在結構上依賴於此變量的同一范圍內定義了一個數組。 因此,我強烈建議提供一個可以檢查的默認值。
2)我實際上無法重現該問題。 使用 OpenModelica,即使對於nc=10000
也一切正常。 很慢但它有效(我們正在努力使數組/向量的東西在未來更快)。 我正在使用夜間構建(OpenModelica 1.16.0~dev-102-g5c1a023)。
3) 見 1)。 通常,我可以補充一點,您應該單獨在每個組件上使用檢查模型(綠色圓圈頂部中間的單個復選標記)來檢查您所做的一切是否符合 modelica 語言。 您還可以使用它旁邊的實例化按鈕查看將從您的代碼生成的平面模型。
此外,我建議使用編譯標志-d=newInst
(提供您使用較新版本之一)。 這使用了對 modelica 規范更嚴格且效率更高的新實例化。
我現在已經確認我發布的代碼確實是健全的,對於部分包(或模型),您可以定義沒有值的變量或大小不確定的向量,前提是它們在編譯時是完全定義的。 具有類似結構的更復雜的代碼導致了我提到的問題,現在也解決了。 該代碼適用於 JModelica 2.14 和 OpenModelica 1.16 nightly build ...b48。 有趣的是,該代碼不適用於 1.15 或更早版本。 感謝我在 Modelon 的聯系人 Markus Olsson!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.