Библиотека Parametrised Modelica и возможность использовать модели в качестве параметров

Я пытаюсь сделать параметризованную библиотеку. Я отлично работаю, используя в качестве параметров пакеты и коннекторы.

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

Интересно, содержит ли библиотека модель с внутренним / внешним стилем соединителя, разрешено ли тогда позволить внутренней модели быть параметром библиотеки?

Ниже приведен простой пример, иллюстрирующий проблему. ТЕСТ - это библиотека, а Fish3b - это приложение. Когда я запускаю пример в библиотеке TEST, все работает, но когда у меня есть отдельный файл приложения, это не так.

Текст ошибки: не удается найти объявление класса для AquariumType с JModelica 2.4.

package TEST

   model FishType1
       outer Real T;
       Real health;
   equation
       health = 30-T;
   end FishType1;

   model FishType2
       outer Real T;
       Real health;
   equation
       health = 32-T;
   end FishType2;

   package Equipment
       model AquariumType
           replaceable model FishType
           end FishType;       
           FishType fish;
           inner Real T;
       equation
          T = 29;
       end AquariumType;
   end Equipment;

   // Adapt AquariumType model to actual fish
   model Aquarium
       import TEST.Equipment.AquariumType;
       extends AquariumType(redeclare model FishType=FishType2);
   end Aquarium;

   // Example
   model Example
       Aquarium aquarium;
   end Example;

end TEST;

И ниже пример кода приложения, который импортируется из библиотеки выше - и здесь, я думаю, есть ошибка.

   encapsulated package Fish3b

       model FishType3
           outer Real T;
           Real health;
       equation
           health = 34-T;
       end FishType3;

       // Adapt package Equipment with AquariumType model to actual fish
       package Equipment3 
           import TEST.Equipment;
           extends Equipment.AquariumType(redeclare model   FishType=FishType3);
       end Equipment3;

       // Example
       model Example
           import Fish3b.Equipment3;
           Equipment3.AquariumType aquarium;
       end Example;

   end Fish3b;

person janpeter    schedule 12.03.2019    source источник
comment
Это не [SSCCE] [1], поскольку пространство имен Library в коде приложения не может быть разрешено. [1]: sscce.org   -  person tbeu    schedule 13.03.2019
comment
Извините, когда я опубликовал это, в коде было поздно изменить библиотеку терминов на оборудование. Я хочу использовать библиотеку слов в более общем плане, поэтому файл библиотеки - это ТЕСТ, а пакет «Оборудование» - это часть библиотеки, которую я хочу параметризовать с использованием модели FishType. И в исправленном коде есть проблема, указанная в тексте.   -  person janpeter    schedule 13.03.2019
comment
Класс Modelica для Fish3b.Equipment3 (пакет) и его базовый класс TEST.Equipment.AquariumType (модель) несовместимы, поскольку пакет не должен расширяться от модели.   -  person tbeu    schedule 13.03.2019


Ответы (3)


Спасибо «tbeu» за комментарий!

Я изменил код, чтобы пакет Equipment не был расширен из модели. Обновленный код ниже также намного лучше отражает мою основную «истинную» проблему. И все работает. Спасибо!

Обновленный файл библиотеки TEST2.mo:

   package TEST2

       model FishType1
           outer Real T;
           Real health;
       equation
           health = 30-T;
       end FishType1;

       model FishType2
           outer Real T;
           Real health;
       equation
           health = 32-T;
       end FishType2;

       package Equipment
           replaceable model FishType
           end FishType;

           constant Integer dummy = 1;

           model AquariumType
               FishType fish;
               inner Real T;
           equation
               T = 29;
           end AquariumType;
       end Equipment;

       // Adapt package Equipment to the actual fish
       package Equipment1
           import TEST2.Equipment;
           extends Equipment(redeclare model FishType=FishType1);
       end Equipment1;

       // Example
       model Example
           Equipment1.AquariumType aquarium;
       end Example;

    end TEST2;

И код приложения T2_Fish3, который теперь использует указанную выше библиотеку TEST2:

   encapsulated package T2_Fish3

       model FishType3
           outer Real T;
           Real health;
       equation
           health = 34-T;
       end FishType3;

       // Adapt package Equipment to the actual fish
       package Equipment3
           import TEST2.Equipment;
           extends Equipment(redeclare model FishType=FishType3);
       end Equipment3;

       // Example
       model Example
           Equipment3.AquariumType aquarium;
       end Example;

   end T2_Fish3;
person janpeter    schedule 13.03.2019

Ответ от janpeter работает.

Другой альтернативой, позволяющей избежать введения моделей под названием «FishType1», «FishType3» и т. Д., Является использование «redeclare model extends» следующим образом (Test2 может быть без изменений или с таким же изменением для Equipment1), но при этом используются более сложные конструкции.

encapsulated package T2_Fish3

       // Adapt package Equipment to the actual fish
       package Equipment3
           import TEST2.Equipment;
           extends Equipment;

           redeclare model extends FishType
            outer Real T;
            Real health;
           equation 
             health = 32-T;
           end FishType;
       end Equipment3;

       // Example
       model Example
           Equipment3.AquariumType aquarium;
       end Example;

end T2_Fish3;

Кроме того, можно было бы переместить общий "внешний Real T" в базовую модель FishType, что приведет к:

package TEST2

    package Equipment
        replaceable model FishType
          outer Real T;
        end FishType;

        constant Integer dummy = 1;

        model AquariumType
            FishType fish;
            inner Real T;
        equation 
            T = 29;
        end AquariumType;
    end Equipment;

    // Adapt package Equipment to the actual fish
    package Equipment1
      import TEST2.Equipment;

      extends Equipment;
      redeclare model extends FishType
        Real health;
      equation 
        health = 30 - T;
      end FishType;
    end Equipment1;

    // Example
    model Example
        Equipment1.AquariumType aquarium;
    end Example;

end TEST2;

а также

encapsulated package T2_Fish3

       // Adapt package Equipment to the actual fish
       package Equipment3
           import TEST2.Equipment;
           extends Equipment;

           redeclare model extends FishType
            Real health;
           equation 
             health = 32-T;
           end FishType;
       end Equipment3;

       // Example
       model Example
           Equipment3.AquariumType aquarium;
       end Example;

end T2_Fish3;
person Hans Olsson    schedule 13.03.2019
comment
Всегда приятно видеть альтернативные решения! Интересно, что мы можем повторно объявить модель и расширить ее, избегая обновления имени фактической модели. Думаю, это будет очень полезно. Я думаю, что в вашем пакете TEST2, я думаю, у вас должна быть частичная модель FishType для вашей базовой модели и не заменяемая, не так ли? Также в коде вашего приложения T2_Fish3 вы объявляете, что «внешний Real T» не нужен, поскольку он объявлен в частичной базовой модели. Но, возможно, неплохо иметь для читабельности. - person janpeter; 14.03.2019
comment
Да, FishType должен быть как заменяемым, так и частичным. Я согласен с тем, что можно пропустить унаследованные объявления, но обычно я считаю, что повторять объявления все еще не является хорошей практикой. - person Hans Olsson; 14.03.2019
comment
Я думал, что вытягиваться из сменной модели более-менее запрещено !? Недавно получил этот комментарий от сообщества OpenModelica. В их новом бета-тесте компилятора OM 2.0 вы получаете такие ошибки, но не в текущих версиях 1.13 или 1.14, а JModelica имеет небольшие проблемы и не дает ошибок или предупреждений, а моделирование кажется нормальным. Modelica def 6.2.1 мне тоже не так понятна. Об этом Фрицонс пишет в разделе 4.15 своей книги 2-е изд. 2015. - person janpeter; 14.03.2019
comment
В этом случае это законно. Идея запрета на расширение еще не известной модели состоит в том, чтобы избежать поломки элементов новой базовой модели. В данном случае этого не происходит, поскольку базовая модель известна. Для получения дополнительной информации см. Раздел 7.3.1. - person Hans Olsson; 14.03.2019
comment
Поймите, у вас есть «хороший» код приложения, который повторно объявляет FishType, который расширяет известный FishType и является «безопасным». В вашем примере заменяемым может быть просто обмен на частичное, а повторное объявление опущено…., Я даже пробовал это в JModelica (слишком снисходительно?), Может не пройти компилятор Dymola? Я пытаюсь выяснить в этом примере случай, когда это окупается «иметь заменяемый базовый класс, как у вас, но не можете это легко увидеть? Я понимаю, что 7.3.1 является важным исключением из 6.2.1 и упоминается в последней строке. Выглядит как «правила» для обеспечения правильности на «более высоком уровне». - person janpeter; 15.03.2019

Обновлен код с использованием данных Ханса Олссона ранее, но немного отличается с исправлениями, предложенными выше. И мне удается избежать «расширения заменяемой модели», но я не слишком уверен, насколько это важно, см. Мой предыдущий комментарий.

Кроме того, я думаю, что хотел бы сохранить четкую идентичность различных рыб, а также объявить их вне упаковки Оборудования.

    package TEST3

        partial model FishBase
            outer Real T;
        end FishBase;

        model FishType1
            extends FishBase;
            Real health;
        equation
            health = 30 - T;
        end FishType1;

        model FishType2
            extends FishBase;
            Real health;
        equation
            health = 32 - T;
        end FishType2;  

        package Equipment
            replaceable model FishType
            end FishType;

            constant Integer dummy = 1;

            model AquariumType
                FishType fish;
                inner Real T;
            equation
                T = 29;
            end AquariumType;
        end Equipment;

        // Adapt package Equipment to the actual fish
        package Equipment3
            import TEST3.Equipment;
            extends Equipment;
            redeclare model FishType=FishType2;
        end Equipment3;

        // Example
        model Example
            Equipment3.AquariumType aquarium;
        end Example;

    end TEST3;

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

    encapsulated package T3_Fish3

        model FishType3
            import TEST3.FishBase;
            extends FishBase;
            Real health;
        equation
            health = 34-T;
        end FishType3;

        // Adapt package Equipment to the actual fish
        package Equipment3
            import TEST3.Equipment;
            extends Equipment(redeclare model FishType=FishType3);
        end Equipment3;

        // Example
        model Example
            Equipment3.AquariumType aquarium;
        end Example;

    end T3_Fish3;
person janpeter    schedule 14.03.2019