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