Как использовать гибкие размеры массива в расширяемом соединителе? - PullRequest
3 голосов
/ 17 июня 2019

Я хотел бы использовать expandable connector (например, Шиноподобная структура ) для моделирования (в основном) input и output соединений для более сложных подсистем (An array будет не позволяет иметь разные единицы для своих элементов и сплюснутые списки становится громоздким, в то время как record не позволяет легко подключать только одну из его переменных без написания уравнений).

Хотя вы можете просто подключитьпеременная в пусто expandable connector без проблем, ее unit (и другие атрибуты) не будут переданы.Таким образом, я хотел бы гибко объявлять переменные внутри расширяемого соединителя (например, как x[:]) и иметь их размеры, определяемые фактическим соединением.

К сожалению, это также не проверяется в OpenModelica и Wolfram System Modeler :

package FirstAttempt  

  model SimpleBusModel
    DataBus dataBus;
    Modelica.Blocks.Interfaces.RealOutput x[ nout ](each unit = "widgets");
    parameter Integer nout = 2;
  equation 
    x = ones( nout );
    connect( x, dataBus.x );
  end SimpleBusModel;

  expandable connector DataBus
    Real[:] x(each unit = "widgets");
  end DataBus;

end FirstAttempt;

... и не объявление connector в качестве подкомпонента и передача размера массива через inner и outer не работают:

  model SimpleBusModel
    DataBus dataBus;
    Modelica.Blocks.Interfaces.RealOutput x[ nout ](each unit = "widgets");
    inner parameter Integer nout = 2;

    expandable connector DataBus
      Real[nout] x(each unit = "widgets");
      outer parameter Integer nout;
    end DataBus;

  equation 
    x = ones( nout );
    connect( x, dataBus.x );
  end SimpleBusModel;

Как настроить expandable connector с гибкими предопределенными переменными массива?

Обновление :

Похоже, этоявляется проблемой, относящейся к OpenModelica и Wolfram System Modeler, поскольку приведенные примеры прекрасно работают в Dymola (см. комментарий f.wue ниже).Я перекрестно опубликовал похожий вопрос по Wolfram Community .

В Моделике Спецификация (Версия 3.2, Редакция 2), которую мы находим в Раздел 9.1.3 Расширяемые соединители :

Перед созданием уравнений соединения непараметрические скалярные переменные и непараметрические элементы массива, объявленные в расширяемых соединителях, помечаются как потенциально присутствующие.Элемент массива без параметров может быть объявлен с размерами массива «:», указывающими, что размер неизвестен.Это относится как к переменным простых типов, так и к переменным структурированных типов.

Как указано f.wue, мы должны подключить connectors, а не просто входы и выходы.Я изменил это в своем коде выше, но это не решает проблему.

Ответы [ 2 ]

1 голос
/ 18 июня 2019

Что может работать, это использовать RealInputs и RealOutputs, а не просто Real. Таким образом, соединение работает, и единицы передаются правильно.

package FirstAttempt

  model OuterModel
   SimpleBusModel sbm;
   Modelica.Blocks.Sources.RealExpression dummy(y=3);
  equation 
    connect(sbm.x[1], dummy.y);
    connect(sbm.x[2], dummy.y);

  end OuterModel;

  model SimpleBusModel
    DataBus dataBus;
    Modelica.Blocks.Interfaces.RealInput x[nout](each unit = "widgets");
    parameter Integer nout = 2;
  equation 
    connect(x, dataBus.x_in);
  end SimpleBusModel;

  expandable connector DataBus
    Real[:] x_in(each unit = "widgets");
  end DataBus;
end FirstAttempt;

Затем вы можете подключить любое другое значение с помощью моделей Blocks.Routing из стандартной библиотеки и подключить их к RealInput из SimpleBusModel.

РЕДАКТИРОВАТЬ:

Я изменил пакет и добавил OuterModel. Вот как выглядит результат в димоле, когда я моделирую OuterModel. Это даже поведение, которое вы хотите достичь?

enter image description here

0 голосов
/ 08 июля 2019

Я получил ответ на похожий вопрос в сообществе Wolfram , подтверждающий, что Wolfram System Modeler (версия 12.0.0 или более ранняя) в настоящее время не поддерживает гибкий массив размеры внутри expandable connector.

Обход

В Wolfram System Modeler в настоящее время мы должны передавать информацию о размере массива обычным способом (т.е. путем изменения параметра размера):

model SimpleBusModel
  DataBus dataBus(nout = nout);
  Modelica.Blocks.Interfaces.RealOutput x[nout](each unit = "widgets");
  parameter Integer nout = 2;

  expandable connector DataBus
    Real[nout] x(each unit = "widgets");
    parameter Integer nout;
  end DataBus;

equation
  x = ones(nout);
  connect(x, dataBus.x);
end SimpleBusModel;

Это также будет работать в OpenModelica.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...