Modelica - как лучше адаптировать импорт из библиотеки к коду приложения - PullRequest
0 голосов
/ 26 февраля 2019

У меня есть вопрос относительно структурирования кода Modelica в многократно используемой части библиотеки и конкретной части приложения.Вопрос касается среды и оборудования, которое зависит от среды, и меня вдохновляет некоторая структура библиотеки жидкостей MSL, но я хочу сделать что-то намного меньше и адаптироваться к моим потребностям, но с этим я тоже могу расти.

Вопрос в том, как удобно адаптировать библиотеку к новому носителю, определенному в коде приложения.Поскольку существует несколько моделей различных частей оборудования, естественно иметь частичную модель, которая определяет тип соединителей, которые должны иметь оборудование, и тогда можно вносить изменения только в частичную модель, когда требуется адаптация соединителей.Мне кажется, мне нужен трехэтапный процесс адаптации библиотеки вместо одного шага, на который я надеюсь.Ниже приведен подробный пример, который позволяет более четко задать вопрос.

Пример представляет собой модель для перекачивания жидкости из одного сосуда в другой, т.е. у нас есть питающий резервуар, насос и сборный резервуар.Жидкая среда изначально содержит два вещества, и теперь в заявке мы хотим смоделировать семь веществ.

В коде приложения новая среда с семью веществами объявлена ​​как пакет Среда7.Адаптация библиотечных моделей для насосов, резервуаров подачи и сбора производится в три этапа:

  1. Определить соединитель LiquidCon7 как расширение импорта стандартного соединителя LiquidCon из библиотеки и переопределить средув Medium7
  2. Определить частичную модель EquipmentMedium7 как расширение импорта стандартной частичной модели EquipmentMedium и где переопределен соединитель LiquidCon в LiquidCon7
  3. Определить пакет Equipment7 как расширение импорта стандартапакет оборудования, в котором частичная модель переименована из EquipmentMedium в EquipmentMedium7.

Сначала в коде приложения можно определить систему, адаптированную к Medium7, с использованием оборудования из Equipment7.- Хотелось бы сделать адаптацию более прямой, чем описано выше.Если я не буду делить код на библиотеку и приложение, как здесь, тогда гораздо проще перейти с Medium2 на Medium7, просто изменив среду, используемую в LiquidConType, и затем это изменение распространится по всей системе.

Когда я читаю материал учебника по этому вопросу Тиллера и Фрицсона или когда я пытаюсь понять код MSL, я нахожу подобные структуры, но все же не то, что имею здесь.Я также думаю, что мои вопросы о том, как эффективно адаптировать библиотеку к изменениям интерфейсов, вызванным новым приложением, не ограничиваются средой, а гораздо более широким диапазоном кода.

Просто прочитайте статью Тиллера «Шаблоны и анти-шаблоны в Modelica "от 2008 года и в разделе 2.3" Средний образец модели ", здесь обсуждается мой вопрос и я думаю о последних нескольких строках на стр. 649.

Я только что понял, что структура моей модели нарушаетсяопределение Modelica, поскольку вам не разрешено расширять PumpType, FeedtankType и т. д. из частичной модели EquipmentMedium, поскольку мне нужно, чтобы EquipmentMedium был заменяемым.См. Modelica def 3.2 rev 2, раздел 6.2.1 «Транзитивно не заменяемый».

Буду признателен за некоторые комментарии по этому вопросу и, возможно, зачитывание совета.Альтернативные решения моей проблемы с игрушками также очень полезны!

Спасибо, Ян Питер

Я не знаю, как добавить файл кода, но ниже я показываю код приложения, описанный выше.Библиотека DATA_v04 является прямой.Но обратите внимание, что мне нужно определить модели PumpType, FeedtankType и т. Д., Используя расширение из частичной модели EquipmentMedium ... и не допускается.

    encapsulated package d4_app7 

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

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

        package Medium7
            constant String name = "Seven components"   "Medium name";
            constant Integer nc = 7                     "Number of substances; 
            type Concentration 
                 = Real[nc] (each min=0, each unit="kg/m3")  "Substance conc";
        end Medium7;

    //  ------------------------------------------------------------------------
    //     Adaptation of library DEMO to Medium7  
    //  ------------------------------------------------------------------------

        connector LiquidCon7
            import DEMO_v4.LiquidCon;
            extends LiquidCon(redeclare package medium=Medium7);
        end LiquidCon7;

        partial model EquipmentMedium7
            connector LiquidConType=LiquidCon7;
        end EquipmentMedium7;

        package Equipment7
            import DEMO_v4.Equipment;
            extends Equipment
               (redeclare partial model EquipmentMedium=EquipmentMedium7);           
        end Equipment7;

        import DEMO_v4.Control;

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

        model Test
            LiquidCon7.medium medium;
            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 d4_app7;

1 Ответ

0 голосов
/ 18 марта 2019

У меня есть некоторый вклад в эту проблему, чтобы упростить адаптацию кода библиотеки к приложению как из поддержки JModelica, так и из OpenModelica, и я делюсь этим здесь.

Код в исходных вопросах работает в JModelica и OpenModelica, но я посчитал его «неуклюжим», а также на самом деле имеет главный недостаток, на который мне указали люди в сообществе OpenModelica.Я использую частичную модель EquipmentMedium в качестве параметра для пакета Equipment и в пакете расширяем его.Расширение из заменяемой модели дает здесь слишком большую гибкость и приводит к ошибке OpenModelica 2.0-beta (но не в более ранних версиях OM).

В обновленном коде ниже библиотеки DEMO_v11.mo и кода приложения d11_app7.mo Я упростил адаптацию библиотеки, а также избегаю расширений из сменной модели.В конце концов, только коннектор LiquidCon необходимо адаптировать к конкретному применению, а если быть точным, то только средняя часть коннектора нуждается в адаптации.Поэтому я использую Medium в качестве формального параметра пакета Equipment и определяю соединитель внутри пакета на основе фактического Medium.Затем другое оборудование использует этот разъем.Таким образом, этот способ «расширения» моделей в пакете от параметризованного соединителя считается приемлемым, а расширение из параметризованной модели - нет.

В обновленном коде я также внес дополнительную информацию в пакет Mediumи покажите, как расширить это для нового Medium - результат из моих постов здесь.

Для получения дополнительной информации о степени гибкости, которую можно найти в параметризованных пакетах, см. Modelica def 6.2.1 и 7.3..1 как отметил Ганс Олссон.Существует также раздел 4.15 в книге Питера Фрицсонса (2-е изд. 2015 г.), где это обсуждается.

Код библиотеки DEMO_v11.mo:

    //  ---------------------------------------------------------------------------------------------
    //     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_v11.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;

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

        package Equipment
            replaceable package Medium
            end Medium;

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

            model PumpType
                LiquidCon inlet, outlet;                                                     
                input 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
                output RealOutput out;
                parameter Real val=0;
            equation
                out = val;
            end FixValueType;
        end Control;

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

    //  package Equipment3 = Equipment(redeclare package Medium=Medium3);   // Just shorter version

        package Equipment3
            import DEMO_v11.Equipment;
            extends Equipment(redeclare package Medium=Medium3);
        end Equipment3;

        model Test
            Equipment3.Medium 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_v11;

И код приложения d11_app7.mo:

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

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

        package Medium7
            import M2 = DEMO_v11.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;

    //  ---------------------------------------------------------------------------------------------
    //     Adaptation of library DEMO_v11 to Medium7  
    //  ---------------------------------------------------------------------------------------------

        package Equipment7
            import DEMO_v11.Equipment;
            extends Equipment(redeclare package Medium=Medium7);
        end Equipment7;

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

        import DEMO_v11.Control;

        model Test
            Equipment7.Medium 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 d11_app7;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...