Как использовать неопределенные размеры массива в блоках?
Использование неопределенных размеров массива (:
) является важной функцией для разработки гибких компонентов для повторного использования. Мне хорошо известно, что фактическое измерение должно быть зафиксировано при компиляции модели. Насколько мне известно, достаточно привязать переменную с неопределенными размерами массива к той, которая имеет четко определенные измерения.
Так что я немного запутался, почему следующее model Test
не будет проверять в любом OpenModelica
или Wolfram System Modeler
:
package VectorFunctions
model Test
VectorSum converter "Component taking the sum of a vector input";
InformationSource source "Vector input";
equation
connect( source.y, converter.u );
end Test;
block VectorSum "Take the sum of an input with unspecified dimension"
Modelica.Blocks.Interfaces.RealInput u[:];
Modelica.Blocks.Interfaces.RealOutput y;
equation
y = sum(u);
end VectorSum;
block InformationSource "Provide some vector output"
Modelica.Blocks.Interfaces.RealOutput y[3];
equation
y = ones( 3 );
end InformationSource;
end VectorFunctions;
Как можно сделать что-то подобное?
2 ответа
Я получил (неофициальный) отзыв о сообществе Wolfram от кого-то из Wolfram MathCore (например, разработчики System Modeler):
Привет, я согласен с вашей интерпретацией, я думаю, что мы должны поддержать это. Я подал ошибку, чтобы отслеживать эту проблему внутри, к сожалению, я не вижу обходных путей. Мы вернемся к вам, когда исправим эту проблему.
Так что, надеюсь, размеры массивов flexbile будут поддерживаться для blocks
как они для functions
,
Я полагаю, что в Modelica Spec не указано, что размеры векторов могут быть автоматически определены по соединениям, поэтому инструменты не поддерживают это.
Я думаю, что вы должны как-то самостоятельно установить размер вектора, например, с помощью параметра, который установлен в вашей тестовой модели следующим образом:
model Test
VectorSum converter(nu=size(source.y, 1)) "Pass in the vector size";
InformationSource source "Vector input";
equation
connect(source.y, converter.u);
end Test;
block VectorSum "Take the sum of an input with unspecified dimension"
Modelica.Blocks.Interfaces.RealInput u[nu];
parameter Integer nu(min=0)=0;
output Real y;
equation
y = sum(u);
end VectorSum;
Обратите внимание, что Dymola жалуется в вашем примере кода, что операторы connect могут применяться только к коннекторам. Поэтому я изменился input Real
в Modelica.Blocks.Interfaces.RealInput
(и аналогичные в InformationSource
)