Расширение пакетов и доступ к контенту

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

Теперь я хочу понять, как в коде приложения вводить информацию из приложения Medium7, расширенного из библиотеки Medium2, и полностью использовать ее в новой компонентной модели приложения.

Я понимаю, что если вы импортируете пакет, расширенный из другого пакета, вы получаете только то, что является «последним» пакетом, а НЕ то, что создано с помощью расширений, и то, что является совокупной общей информацией Medium7.

Этот факт проиллюстрирован в примере изменением постоянной SensorX.component с C, которая работает, на A или B, которая не работает.

Однако, если я создаю локальный экземпляр Medium7, ТО я получаю полную информацию о Medium7. Я могу сделать это в SensorX, помеченный как вопрос 1 - альт 2. Я также могу сделать этот выбор подложки для измерения в конфигурации системы и пометить вопрос 1, альт 3. Я думаю, это более читаемый код.

  1. Но как мне сделать все содержимое Medium7 доступным локально? Должен ли я определять локально новую константу для каждой константы, которая мне нужна, как я показываю здесь с помощью sensorX.component? Как правило, вы можете захотеть в модели иметь доступ к различным свойствам среды, и это удобно поместить в пакет Medium.

  2. Также я хотел бы импортировать коннектор LiquidCon, адаптированный для Medium7, вместо того, чтобы снова писать этот код в пакете Sensor7. Предлагаемый импорт не работает. Есть другой способ? Я только тестировал код в JModelica 2.4, и это может быть ошибка?

Был бы признателен за ваш вклад по этим двум вопросам. / Ян Питер

Ниже приведен код приложения d12_app7, представляющий интерес для вопросов, а затем соответствующая библиотека DEMO_v12. Я пометил комментариями изменения кода для двух вопросов, и, как указано в коде, это для вопроса 1 alt 1.

    encapsulated package d12_app7 

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

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

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

    //  ---------------------------------------------------------------------------------------------
    //     New sensor introduced in this application for measurement of substance A 
    //  ---------------------------------------------------------------------------------------------

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

            model SensorX
    //          import d12_app7.Equipment7.LiquidCon;                 // Question 2
                import d12_app7.Medium7.*;                            // Question 1 - alt 1
                constant Integer component = C;                       // Question 1 - alt 1  
    //          constant Integer component = d12_app7.Medium7.A;      // Question 1 - alt 2
                LiquidCon probe;
                RealOutput out;
            equation
                probe.F = 0;
                out = probe.c[component];
            end SensorX;    
        end Sensor7;

    //  ---------------------------------------------------------------------------------------------
    //     Adaptation of library DEMO_v12 to Medium7  
    //  ---------------------------------------------------------------------------------------------

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

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

        import DEMO_v12.Control;

        model Test
            Equipment7.Medium medium;        // Instance not necessary but helpful for user interface
            Equipment7.PumpType pump;
            Equipment7.FeedtankType feedtank;
            Equipment7.HarvesttankType harvesttank;
            Sensor7.SensorX sensor;                             // Question 1 alt 1 and 2
    //      Sensor7.SensorX sensor(component = medium.A);       // Question 1 alt 3    
            Control.FixValueType Fsp(val=0.2);
        equation
            connect(feedtank.outlet, pump.inlet);
            connect(pump.outlet, harvesttank.inlet);
            connect(Fsp.out, pump.Fsp);
            connect(sensor.probe, harvesttank.port);
        end Test;

    end d12_app7;

И наконец код библиотеки DEMO_v12

    package DEMO_v12

    //  ---------------------------------------------------------------------------------------------
    //     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_v12.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;                                                     
                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, port;                                   
                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;
                    port.c[i] = c[i];
                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;

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

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

        package Equipment3
            import DEMO_v12.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_v12;

person janpeter    schedule 22.03.2019    source источник
comment
Я только что поправил d12_app7 и модель SensorX. Оператор импорта для LiquidCon в вопросе 2 теперь верен. Код по-прежнему не работает, когда эта альтернатива активирована, поэтому остается вопрос 2!   -  person janpeter    schedule 04.04.2019


Ответы (3)


Я также недавно в этом посте получил помощь от людей, связанных с Modelon-JModelica и OpenModelica - спасибо! Ниже ответы и комментарии, а также обновленный код.

  1. Чтобы сделать контент Medium7 доступным, мы можем (вероятно) сделать то же, что и в представленном коде. В моем новом коде я решаю, какое вещество измерять, только после настройки тестовой модели. Поэтому я в модели SensorX объявляю постоянный компонент Integer без какого-либо значения. Обратите внимание, что константе можно присвоить значение только один раз.
  2. Чтобы избежать повторного написания кода LiquidCon, лучше поместить код модели датчика в расширение пакета Equipment, где производится адаптация к Medium7.
  3. В модели Test нам нужно иметь доступ к мнемонике компонентов. Создание в коде экземпляра пакета запрещено в Modelica (но по-прежнему работает в JModelica и OpenModelica). В новом коде дан общепринятый способ сделать это. Обратите внимание, что это решение делает содержимое фактического носителя недоступным через FMU. Чтобы получить эту доступность, необходимо создать локальные экземпляры из различных констант среды в модели, как это сделано с именем.
  4. У меня в DEMO_v20.Medium2 убрано слово «заменяемый» перед константами, и метод просто присвоить этим константам Medium разные значения в Medium3 разрешен, начиная с Modelica 3.2 (но не в 3.1), в соответствии с Хансом Олссоном в предыдущем ответе на пост.
  5. В DEMO_v20 я ввел частичную MediumBase, а затем Medium2 расширяется от нее, а MeiumBase также является ограничивающим типом для формального параметра Medium для оборудования пакета.

Код работает для JModelica как с DEMO_v20, так и с тестовым примером для трех веществ и вместе с кодом приложения для семи веществ. Однако в OpenModelica работает только тестовый пример для трех веществ.

Был бы признателен за помощь, чтобы заставить код работать в OpenModelica, а также проверить его в Dymolas.

Код библиотеки DEMO_v20

    package DEMO_v20

        // Here I have put together a small demo-library to illustrate questions
        // around structuring handling of medium. The key structures are taken
        // from MSL fluid, I think it is fair to say.

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

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

        partial package MediumBase
            constant String name                                   "Medium name";
            constant Integer nc                                    "Number of substances";
            replaceable type Concentration = Real[nc]              "Substance conc";        
        end MediumBase;

        package Medium2 
            extends MediumBase
                (name="Two components",
                 nc=2);
            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_v20.Medium2;
            extends M2
                (name="Three components"                           "Medium name",
                 nc=3                                              "Number of substances",
                 mw = cat(1,M2.mw,{30})                            "Substance weight");
            constant Integer C = 3                                 "Substance index";   
        end Medium3;

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

        package Equipment
            replaceable package Medium = MediumBase 
                constrainedby MediumBase;

            connector LiquidCon
                Medium.Concentration c                             "Substance conc";
                flow Real F (unit="m3/s")                          "Flow rate";
            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, port;                                   
                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;
                    port.c[i] = c[i];
                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
            extends DEMO_v20.Equipment(redeclare package Medium=Medium3);
        end Equipment3;

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

        model Test
            package medium = DEMO_v20.Medium3;                     // Not accessible in FMU though
            constant String name = medium.name;                    // But name here is accessible
            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_v20;

И соответствующий код приложения d20_app7.mo

    encapsulated package d20_app7 

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

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

        package Medium7
            import M2 = DEMO_v20.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");
            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_v20 to Medium7 and including a new model SensorX 
    //  ---------------------------------------------------------------------------------------------

        package Equipment7
            extends DEMO_v20.Equipment(redeclare package Medium=Medium7);
            model SensorX
                LiquidCon probe;
                RealOutput out;
                constant Integer component                            "Component measured";         
            equation
                probe.F = 0;
                out = probe.c[component];
            end SensorX;            
        end Equipment7;

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

        import DEMO_v20.Control;

        model Test
            package medium = Medium7;                                // Not accessible in FMU though
            constant String name = medium.name;                      // But name here is accessible
            Equipment7.PumpType pump;
            Equipment7.FeedtankType feedtank;
            Equipment7.HarvesttankType harvesttank;
            Equipment7.SensorX sensor(component = medium.G);               
            Control.FixValueType Fsp(val=0.2);
        equation
            connect(feedtank.outlet, pump.inlet);
            connect(pump.outlet, harvesttank.inlet);
            connect(Fsp.out, pump.Fsp);
            connect(sensor.probe, harvesttank.port);
        end Test;

    end d20_app7;
person janpeter    schedule 20.05.2019

Проверено как DEMO_v20.mo, так и d20_app7.mo в Dymola Version 2018 (64-бит), 2017-04-10.

Загрузка файла DEMO_v20.mo дает ошибку,

<medium declaration> (line 137, column 27: C:/Users/adeas31/Desktop/DEMO_v20.mo)

medium already declared on line 135.

И бег DEMO_v20.Test дает,

Translation of DEMO_v20.Test:

For variable feedtank.medium_nc
declared in class DEMO_v20.Equipment.FeedtankType, C:/Users/adeas31/Desktop/DEMO_v20.mo at line 77, and used in component feedtank.

The variability of the definition equation:
feedtank.medium_nc = size(feedtank.outlet.c, 1);
is higher than the declared variability of the variables.

For variable harvesttank.medium_nc
declared in class DEMO_v20.Equipment.HarvesttankType, C:/Users/adeas31/Desktop/DEMO_v20.mo at line 91, and used in component harvesttank.

The variability of the definition equation:
harvesttank.medium_nc = size(harvesttank.inlet.c, 1);
is higher than the declared variability of the variables.

Basic type inconsistencies detected.

Translation aborted.

ERRORS have been issued.

Запуск d20_app7.Test дает,

Translation of d20_app7.Test:

Encapsulation of d20_app7
prevented us from finding DEMO_v20 in global scope.

Missing base class DEMO_v20.Equipment
the class DEMO_v20.Equipment exists, but Modelica is case-sensitive and uses scoping
File: C:/Users/adeas31/Desktop/d20_app7.mo, line 46
Context: d20_app7.Equipment7

Component type specifier Equipment7.PumpType not found
File: C:/Users/adeas31/Desktop/d20_app7.mo, line 67
Component context: pump
Component declared as Equipment7.PumpType pump in d20_app7.Test

Component type specifier Equipment7.FeedtankType not found
File: C:/Users/adeas31/Desktop/d20_app7.mo, line 68
Component context: feedtank
Component declared as Equipment7.FeedtankType feedtank in d20_app7.Test

Component type specifier Equipment7.HarvesttankType not found
File: C:/Users/adeas31/Desktop/d20_app7.mo, line 69
Component context: harvesttank
Component declared as Equipment7.HarvesttankType harvesttank in d20_app7.Test

Component type specifier LiquidCon not found
File: C:/Users/adeas31/Desktop/d20_app7.mo, line 49
Component context: sensor.probe
Component declared as LiquidCon probe in d20_app7.Equipment7.SensorX

WARNINGS have been issued.

ERRORS have been issued.

Надеюсь, это поможет.

person Adeel Asghar    schedule 21.05.2019

Спасибо, Адил! Журнал ошибок Dymola заставил меня внести следующие изменения в код:

  1. DEMO_v20 здесь я исключил инстанциацию medium - забыл, см. 3) выше
  2. DEMO_v20 здесь я теперь получаю размер моделей из Medium.nc, а не через разъем и размер c.
  3. D20_app7 вот я сейчас в процедуре адаптации пакета Equipment, сначала импортирую, а затем расширяю и адаптирую к Medium7.

Обновленный код DEMO_v22 и d22_app7 теперь работает как с JModelica, так и с OpenModelica. Было бы хорошо и в Димоле протестировать ????

Обновлен код DEMO_v22.mo

    package DEMO_v22

        // Here I have put together a small demo-library to illustrate questions
        // around structuring handling of medium. The key structures are taken
        // from MSL fluid, I think it is fair to say.

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

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

        partial package MediumBase
            constant String name                                   "Medium name";
            constant Integer nc                                    "Number of substances";
            replaceable type Concentration = Real[nc]              "Substance conc";        
        end MediumBase;

        package Medium2 
            extends MediumBase
                (name="Two components",
                 nc=2);
            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_v22.Medium2;
            extends M2
                (name="Three components"                           "Medium name",
                 nc=3                                              "Number of substances",
                 mw = cat(1,M2.mw,{30})                            "Substance weight");
            constant Integer C = 3                                 "Substance index";   
        end Medium3;

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

        package Equipment
            replaceable package Medium = MediumBase 
                constrainedby MediumBase;

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

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

            model FeedtankType
                LiquidCon outlet;                                  
                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, port;
                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;
                    port.c[i] = c[i];
                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
            extends DEMO_v22.Equipment(redeclare package Medium=Medium3);
        end Equipment3;

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

        model Test
            package medium = DEMO_v22.Medium3;                     // Not accessible in FMU though
            constant String name = medium.name;                    // But name here is now accessible
            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_v22;

и обновлен код приложения d22_app7.mo

    encapsulated package d22_app7 

        // Here I put together an application for 7 substances - print 8 pt
        // and import code from the library DEMO.

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

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

        package Medium7
            import M2 = DEMO_v22.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");
            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_v22 to Medium7 and including a new model SensorX 
    //  ---------------------------------------------------------------------------------------------

        package Equipment7
            import DEMO_v22.Equipment;
            extends Equipment(redeclare package Medium=Medium7);
            model SensorX
                LiquidCon probe;
                RealOutput out;
                constant Integer component                            "Component measured";         
            equation
                probe.F = 0;
                out = probe.c[component];
            end SensorX;            
        end Equipment7;

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

        import DEMO_v22.Control;

        model Test
            package medium = Medium7;                                // Not accessible in FMU though
            constant String name = medium.name;                      // But name here is accessible
            Equipment7.PumpType pump;
            Equipment7.FeedtankType feedtank;
            Equipment7.HarvesttankType harvesttank;
            Equipment7.SensorX sensor(component = medium.G);               
            Control.FixValueType Fsp(val=0.2);
        equation
            connect(feedtank.outlet, pump.inlet);
            connect(pump.outlet, harvesttank.inlet);
            connect(Fsp.out, pump.Fsp);
            connect(sensor.probe, harvesttank.port);
        end Test;

    end d22_app7;
person janpeter    schedule 21.05.2019