簡體   English   中英

參數化 Modelica 庫和“延遲”結構參數設置的可能性 - 第 3 部分

[英]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;

在具有相同代碼結構的稍大的示例中,我遇到了一些問題:

  • 在 JModelica 中,我收到一條警告“常量 nc 沒有綁定表達式”
  • 在 OpenModelica 中,我收到一個錯誤:“無法評估結構參數(或常數).. nc,它給出了數組 c[MediumBase.nc] 的維度。 必須在編譯時知道數組維度'

該消息對我來說沒有意義,因為 nc 在編譯時已知,在 EquipmentLib 適應的級別。 這個問題實際上可以通過在 MediumBase 中給 nc 一個“虛擬”值 nc=1 在 Medium Base 中解決,然后在編譯期間將 nc 更改為適應 EquipmentLib 時提供的值。

所以我的問題是:

  1. 對我來說,最好保持 nc 未定義,然后確保在編譯期間設置值,而在編譯期間更改常量看起來有問題,但也許(仍然)在 Modelica 中是允許的。 在 Modelica 語言規范中,我可以在附錄 A 中看到常量的要求是(僅)它在模擬期間是常量,即不是在編譯期間。 在附錄 E8.2 中,我看到可能應該完成 nc 的初始分配,但不確定。 不過,希望對此發表一些評論。
  2. JModelica 和 OpenModelica 的一個更大的示例編譯器怎么會分別給出警告和錯誤?
  3. Modelica 規范對這里的內容有何看法?

如果需要,我可以提供更大的例子,但我認為這可能是一個更一般的答案。

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM