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

Использование неопределенных размеров массива (:) является важной функцией для разработки гибких компонентов для повторного использования. Мне хорошо известно, что фактическое измерение должно быть зафиксировано при компиляции модели. Насколько мне известно, достаточно привязать переменную с неопределенными размерами массива к той, которая имеет четко определенные измерения.

Так что я немного запутался, почему следующее 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)

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