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

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

Поэтому я немного смущен, почему следующие 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;

Как же тогда можно сделать что-то подобное?


person gwr    schedule 18.06.2019    source источник
comment
Обратите внимание, что я отправил аналогичный вопрос в сообщество Wolfram.   -  person gwr    schedule 18.06.2019
comment
Я обновил свой код, чтобы предоставить connectors для чистого оператора connect.   -  person gwr    schedule 18.06.2019


Ответы (2)


Я предполагаю, что в спецификации Modelica не указано, что размеры векторов могут быть автоматически определены из соединений, поэтому инструменты этого не поддерживают.

Я думаю, вам нужно как-то самостоятельно установить размер вектора, например. с параметром, который установлен в вашей тестовой модели следующим образом:

  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 жалуется в вашем примере кода на то, что операторы подключения могут применяться только к соединителям. Поэтому я изменил input Real на Modelica.Blocks.Interfaces.RealInput (и аналогично в InformationSource)

person marco    schedule 18.06.2019
comment
На самом деле спецификации Modelica, по моему мнению, неясны по этому поводу: Раздел 10.2 Гибкие размеры массивов просто указывают на Раздел 12.4.5, где это обсуждается для functions (что позволяет использовать представленное здесь для входных данных). Поскольку blocks немного знаком с functions, как указано в спецификациях, я до сих пор не вижу веской причины, почему это не должно сработать. - person gwr; 18.06.2019

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

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

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

person gwr    schedule 03.07.2019