Библиотека Parametrised Modelica и возможность использования моделей в качестве параметров - PullRequest
1 голос
/ 12 марта 2019

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

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

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

Ниже приведен простой пример, иллюстрирующий проблему.TEST - это библиотека, а 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;

Ответы [ 3 ]

2 голосов
/ 13 марта 2019

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