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

Я хотел бы использовать 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.

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

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

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

2 ответа

Решение

Я получил ответ на аналогичный вопрос в сообществе 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.

Что может работать, так это использовать 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. Это даже поведение, которое вы хотите достичь?

Другие вопросы по тегам