Есть ли способ передать параметр в заменяемый / повторно объявленный компонент? - PullRequest
0 голосов
/ 28 января 2019

Этот вопрос относится к этому предыдущему вопросу .

У меня есть некоторые подмодели, которые являются взаимозаменяемыми, и я использую механизм замены / переопределения для включения их в модель (например, подмодели различныхтип теплообменников в модели контура охлаждения).

Я хотел бы «связать» некоторые параметры основной модели (скажем, длину и диаметр труб) с соответствующими параметрами подмодуля.Обычно это делается при определении экземпляра модели (т. Е. В строке replaceable), но как эту ссылку можно применить и при повторном объявлении компонента?Особенно, если используется choicesAllMatching?

Вот "моя" модель (спасибо помощникам в предыдущем вопросе ):

package Test
  // Original definition of Component 1 and 2 in the external library
  // COMP1 (COMP2) has a parameter p1 (p2) defined with a default value
  package ReadOnlyLibrary
    model COMP1
      parameter Real p1=1 "";
      Real v "";
    equation 
      v=p1*time;
    end COMP1;

    model COMP2
      parameter Real p2=1 "";
      Real v "";
    equation 
      v=p2*time;
    end COMP2;
  end ReadOnlyLibrary;

  // Interface and variants with modified default values
  partial model Call_Interface
    parameter Real pp = 10; // New parameter definition to have the same name for all variants
    Real v "";
  end Call_Interface;

  // Both Call1 and Call2 parameters (p1 and p2) are linked to pp
  model Call1 "Default"
    extends Call_Interface;
    extends ReadOnlyLibrary.COMP1(p1=pp);
  end Call1;

  model Call2 "Variant"
    extends Call_Interface;
    extends ReadOnlyLibrary.COMP2(p2=pp);
  end Call2;

  // Main module (system)
  model Main
    parameter Real pm=100 "";
    parameter Real pp0=1 ""; //Actual parameter value to be used by submodules for this application -> pp
    Real vm "";

    replaceable Test.Call1 OBJ(pp=pp0) constrainedby Test.Call_Interface annotation (choicesAllMatching); //For default definition, pp, and finally p1, are linked to pp0. But when OBJ is redeclarated, the link is lost and p1/p2 gets its default value.

  equation 
    vm = OBJ.v+pm;
  end Main;

  // Application model, using the main model
  model App
    Main main;
  end App;
end Test;

Я мог бы добавить все возможныепереопределения в аннотации путем написания, например, choice(redeclare Test.Call2 OBJ(pp=pp0)) вместо использования choiceAllMatching, но это может стать утомительным и подверженным ошибкам, когда многие подмодули являются взаимозаменяемыми (было бы проще и безопаснее написать «ссылку» только один раз).Я попытался добавить общий OBJ.pp = pp0 в раздел параметров модели Main, но это не принято.Как правильно это сделать?

1 Ответ

0 голосов
/ 28 января 2019

Вы просто должны записать модификаторы в класс ограничения:

replaceable Test.Call1 OBJ constrainedby Test.Call_Interface(pp=pp0) 
    annotation (choicesAllMatching);
...