Расширение пакетов и доступ к контенту - PullRequest
1 голос
/ 22 марта 2019

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

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

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

Этот факт иллюстрируется в примере изменением константы SensorX.com с 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;

Ответы [ 3 ]

0 голосов
/ 21 мая 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.

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

0 голосов
/ 21 мая 2019

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

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

Обновленные коды DEMO_v22 и d22_app7 теперь работают с обоими JModelicaи OpenModelica.Было бы неплохо проверить его и в Dymola ?

Обновленный код 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;
0 голосов
/ 20 мая 2019

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

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

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