Как настроить библиотеку-приложение, включая расширение / переопределение в OpenModelica? - PullRequest
0 голосов
/ 08 марта 2019

У меня есть код Modelica, разделенный на небольшую библиотеку DEMO_v11.mo и приложение D11_APP7.mo. Код приложения включает в себя части, которые адаптируют интерфейс библиотеки к приложению с помощью: import-extend-redeclare. Все работает в JModelica. Теперь я хочу настроить его в OpenModelica, но я не знаю, как обрабатывать мои два разных файла. Просматривая документацию, я мог найти небольшую помощь.

Раньше мне удавалось ввести библиотеку и в OpenModelica добавить графическую запись, а затем составить новую модель на основе компонентов из библиотеки. Тем не менее, теперь мне нужно сделать более «продвинутый» импорт, который расширяет-повторно объявляет импортированные модели. Поэтому моя проблема в том, как сделать эту более «продвинутую» часть.

Ценю несколько советов или предложений о том, где читать.

1 Ответ

0 голосов
/ 07 апреля 2019

Ответ на этот вопрос, который я нашел, и прост, и труден.

Самым простым является то, что в OpenModelica вы должны загружать и библиотеку, и код приложения одинаково, используя команду «Файл / Открыть Modelica / Библиотечный файл (файлы)». Затем библиотека и приложение оказываются рядом. Значки для них отображаются на панели слева и под библиотекой MSL Modelica. Затем код приложения может импортировать (и повторно декларировать) как из загруженной библиотеки, так и из MSL, если это необходимо, аналогичным образом.

Сложная часть заключается в том, что в OpenModelica возникают ошибки, когда вы ссылаетесь на модели в два (или более) шага вместо одного. Этот вопрос я обсуждаю с поддержкой OpenModelica.

Код, который работает для импорта, как описано выше, - это библиотека DEMO_v15 и приложение D15_app7, показанные ниже (и слегка модифицированные из DEMO_v11 и D11_app7, упомянутых и описанных в другом потоке).

   package DEMO_v15

    //  ---------------------------------------------------------------------------------------------
    //     Interfaces  
    //  ---------------------------------------------------------------------------------------------

        import Modelica.Blocks.Interfaces.RealInput;
        import Modelica.Blocks.Interfaces.RealOutput;

        package Medium2
            replaceable constant String name = "Two components"    "Medium name";
            replaceable constant Integer nc = 2                    "Number of substances";
            replaceable type Concentration = Real[nc]              "Substance conc";
            replaceable constant Real[nc] mw = {10, 20}            "Substance weight";  
            constant Integer A = 1                                 "Substance index";
            constant Integer B = 2                                 "Substance index";   
        end Medium2;

        package Medium3 
            import M2 = DEMO_v15.Medium2;
            extends M2
                (name="Three components"                           "Medium name",
                 nc=3                                              "Number of substances",
                 mw = cat(1,M2.mw,{30})                            "Substance weight",
                 redeclare type Concentration = Real[nc]           "Substance conc");
            constant Integer C = 3                                 "Substance index";   
        end Medium3;

        connector LiquidCon3
            Medium3.Concentration c                                "Substance conc";
            flow Real F (unit="m3/s")                              "Flow rate";
        end LiquidCon3;

    //  ---------------------------------------------------------------------------------------------
    //     Equipment dependent on the medium  
    //  ---------------------------------------------------------------------------------------------

        package Equipment
            replaceable connector LiquidCon
            end LiquidCon;

            model PumpType
                LiquidCon inlet, outlet;                                                     
                RealInput Fsp;
            equation
                inlet.F = Fsp;                                         
                connect(outlet, inlet);                          
            end PumpType;

            model FeedtankType
                LiquidCon outlet;                                  
                constant Integer medium_nc = size(outlet.c,1);
                parameter Real[medium_nc] c_in (each unit="kg/m3") 
                                = {1.0*k for k in 1:medium_nc}     "Feed inlet conc";                        
                parameter Real V_0 (unit="m3") = 100               "Initial feed volume";
                Real V(start=V_0, fixed=true, unit="m3")           "Feed volume";
            equation    
                for i in 1:medium_nc loop
                    outlet.c[i] = c_in[i];
                end for;
                der(V) = outlet.F;               
            end FeedtankType;

            model HarvesttankType
                LiquidCon inlet;                                   
                constant Integer medium_nc = size(inlet.c,1);
                parameter Real V_0 (unit="m3") = 1.0   "Initial harvest liquid volume";
                parameter Real[medium_nc] m_0 
                      (each unit="kg/m3") = zeros(medium_nc)       "Initial substance mass";
                Real[medium_nc] c                                  "Substance conc";
                Real[medium_nc] m 
                      (start=m_0, each fixed=true)                 "Substance mass";
                Real V(start=V_0, fixed=true, unit="m3")           "Harvest liquid volume";
            equation
                for i in 1:medium_nc loop
                    der(m[i]) = inlet.c[i]*inlet.F;
                    c[i] = m[i]/V;
                end for;
                der(V) = inlet.F;               
            end HarvesttankType;
        end Equipment;

    //  ---------------------------------------------------------------------------------------------   
    //     Control 
    //  ---------------------------------------------------------------------------------------------

        package Control
            block FixValueType
                RealOutput out;
                parameter Real val=0;
            equation
                out = val;
            end FixValueType;
        end Control;

    //  ---------------------------------------------------------------------------------------------
    //     Adaptation of package Equipment to Medium3 
    //  ---------------------------------------------------------------------------------------------

    //  package Equipment3 = Equipment(redeclare connector LiquidCon=LiquidCon3);   // Just shorter

        package Equipment3
            import DEMO_v15.Equipment;
            extends Equipment(redeclare connector LiquidCon=LiquidCon3);
        end Equipment3;

    //  ---------------------------------------------------------------------------------------------
    //     Examples of systems 
    //  ---------------------------------------------------------------------------------------------

        model Test
            Medium3 medium;
            Equipment3.FeedtankType feedtank;
            Equipment3.HarvesttankType harvesttank;
            Equipment3.PumpType pump;
            Control.FixValueType Fsp(val=0.2);
        equation
            connect(feedtank.outlet, pump.inlet);
            connect(pump.outlet, harvesttank.inlet);
            connect(Fsp.out, pump.Fsp);
        end Test;

    end DEMO_v15;

и код приложения:

   encapsulated package D15_app7

    //  ---------------------------------------------------------------------------------------------
    //     Interfaces  
    //  ---------------------------------------------------------------------------------------------

        import Modelica.Blocks.Interfaces.RealInput;
        import Modelica.Blocks.Interfaces.RealOutput;

        package Medium7
            import M2 = DEMO_v15.Medium2;
            extends M2
                (name = "Seven components"                      "Medium name", 
                nc = 7                                          "Number of substances",
                mw = cat(1,M2.mw,{30,40,50,60,70})              "Substance weight",
                redeclare type Concentration = Real[nc]         "Substance conc");
            constant Integer C = 3                              "Substance index";
            constant Integer D = 4                              "Substance index";  
            constant Integer E = 5                              "Substance index";  
            constant Integer F = 6                              "Substance index";  
            constant Integer G = 7                              "Substance index";  
        end Medium7;

        connector LiquidCon7
            Medium7.Concentration c                             "Substance conc";
            flow Real F (unit="m3/s")                           "Flow rate";
        end LiquidCon7;

    //  ---------------------------------------------------------------------------------------------
    //     Adaptation of library DEMO_v15 to Medium7  
    //  ---------------------------------------------------------------------------------------------

        package Equipment7
            import DEMO_v15.Equipment;
            extends Equipment(redeclare connector LiquidCon=LiquidCon7);
        end Equipment7;

    //  ---------------------------------------------------------------------------------------------       
    //     Examples of systems 
    //  ---------------------------------------------------------------------------------------------

        import DEMO_v15.Control;

        model Test
            Medium7 medium;                 // Instance not necessary but helpful for user interface
            Equipment7.PumpType pump;
            Equipment7.FeedtankType feedtank;
            Equipment7.HarvesttankType harvesttank;
            Control.FixValueType Fsp(val=0.2);
        equation
            connect(feedtank.outlet, pump.inlet);
            connect(pump.outlet, harvesttank.inlet);
            connect(Fsp.out, pump.Fsp);
        end Test;

    end D15_app7;
...