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

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

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

1 голос
/ 03 июля 2019

Мне дали (неофициально) отзыв о сообществе Wolfram от кого-то из Wolfram MathCore (например, разработчики System Modeler):

Привет, я согласен с вашей интерпретацией, я думаю, что мы должны поддержать это. Я подал ошибку, чтобы отслеживать эту проблему внутри, к сожалению, я не вижу обходных путей. Мы вернемся к вам, когда исправим эту проблему.

Итак, мы надеемся, что размеры массивов flexbile будут поддерживаться для blocks, как и для functions.

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

Я полагаю, что в 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)

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