Соедините переменные параметров в расширяемом соединителе - PullRequest
0 голосов
/ 02 апреля 2019

Две модели подключаются через (пустой) расширяемый разъем. Один из двух устанавливает связь между расширяемым разъемом и переменной parameter.

Я не ожидал никаких проблем. Напротив, у меня были некоторые проблемы:

  • OpenModelica компилирует версию 2, но не версию 1
    [bus_param_out]: Failed to instantiate equation connect(controlBus.num, numberPar);
    Translation Error: Error occurred while flattening model bus_param
    
  • Dymola не компилирует ни версию 1, ни версию 2
    Connect does not refer to connectors in connect(bus_in.controlBus.num, bus_in.num);
    
    но bus_in.num - это Real, а в спецификации Modelica говорится

    Все компоненты в расширяемом соединителе рассматриваются как экземпляры соединителя, даже если они не объявлены как таковые [т.е. можно подключиться, например, к Реальная переменная.

Что я делаю не так? Я что-то пропустил? Моя конечная цель - связать переменную parameter с расширяемым разъемом (например, сообщить различным компонентам транспортного средства о количестве аккумуляторных элементов, скажем) без необходимости дополнительной избыточной переменной. Это возможно?

Тестовый код следующий:

  • bus_param.mo

    model bus_param
      bus_param_in bus_in;
      bus_param_out bus_out;
    equation
      connect(bus_in.controlBus, bus_out.controlBus);
    end bus_param_custom;
    
  • bus_param_in.mo

    model bus_param_in
      Real num;
      bus controlBus;
    equation
      connect(controlBus.num, num);
    end bus_param_in;
    
  • bus_param_out.mo - Версия 1
    model bus_param_out
      parameter Real numberPar = 3.0;
      bus controlBus;
    equation
      connect(controlBus.num, numberPar);
    end bus_param_out;
    
  • bus_param_out.mo - Версия 2
    model bus_param_out
      parameter Real numberPar = 3.0;
      Real number;
      bus controlBus;
    equation
      number = numberPar;
      connect(controlBus.num, numberPar);
    end bus_param_out;
    
  • bus.mo
    expandable connector bus
    end bus;
    

Ответы [ 2 ]

2 голосов
/ 04 апреля 2019

f.wue уже показал, как записать параметр в шину.Этот пост дополнительно объясняет, как читать значение без увеличения изменчивости (поэтому он остается параметром).

Чтобы упростить его использование, вот полный код демонстрационного пакета, показывающий, как читать и записывать параметры на шинах.Он работает с Dymola 2019 FD01 в педантичном режиме и OMEdit v1.13.2.

package ParmeterToBus
  expandable connector bus
  end bus;

  model bus_param_out
    parameter Real numberPar;
    Modelica.Blocks.Sources.Constant helper(k=numberPar);
    bus controlBus;

  equation 
    connect(controlBus.number, helper.y);
  end bus_param_out;

  model bus_param_in
    Modelica.Blocks.Interfaces.RealOutput buffer;
    bus controlBus;
    final parameter Real num(fixed=false);  // users should not modify it, hence its final
  initial equation 
    num = buffer;
  equation 
    connect(buffer, controlBus.number);
  end bus_param_in;

  model example
    bus_param_in bus_in;
    bus_param_out bus_out(numberPar=7);
  equation 
    connect(bus_in.controlBus, bus_out.controlBus);
  end example;
end ParmeterToBus;

Обратите внимание, что реализация далеко не проста.Некоторые твики необходимы вместе с вспомогательными классами для преодоления следующих ограничений:

  1. В операторах соединения могут использоваться только коннекторы.
    Поэтому нам необходим
    • экземпляр константного блоказаписать значение
      (помощник в коде выше)
    • экземпляр коннектора RealOutput для чтения значения
      (буфер в коде выше)
  2. Модели и блоки не могут иметь префиксный параметр.
    Следовательно, для записи значения необходим постоянный блок, здесь мы не можем использовать соединитель RealOutput.
  3. Для параметров обычно исходное уравнение автоматическигенерируется из связующего уравнения.
    Чтобы предотвратить это, мы должны установить (fixed = false).Это позволяет нам присвоить параметру на этапе инициализации значение переменной более высокой изменчивости - в нашем случае буфер.
2 голосов
/ 03 апреля 2019

Вы можете использовать

Modelica.Blocks.Interfaces.RealOutput num

, чтобы объявить Real, который можно использовать в операторе соединения.

EDIT: Насколько я знаю, подключениеПараметр к разъему невозможен.Dymola выдаст ошибку:

Соединение не относится к соединителям в соединении

Официальный способ - использовать Modelica.Blocks.Sources.Constant, что эквивалентно RealOutput,Вы можете напрямую использовать такой параметр, как этот:

model bus_param_out
  parameter Real number = 3;
  Modelica.Blocks.Sources.Constant num_con(k=number);
  bus controlBus;
equation 
  connect(controlBus.num, num_con.y);
end bus_param_out;

При использовании расширяемых разъемов и подключении этих разъемов необходимо обязательно установить bus.num только один раз.Все остальное приведет к ошибке.

Попробуйте подключить все с помощью графического интерфейса, что, возможно, прояснит ситуацию.

Вы можете использовать расширяемый разъем вне подключения, например:

model bus_param_out
  Real number_of_bus;
  parameter Real number = 3;
  Modelica.Blocks.Sources.Constant num_con(k=number);
  bus controlBus;
equation 
  connect(controlBus.num, num_con.y);
  number_of_bus = controlBus.num;
end bus_param_out;

Но попытка объявить parameter Real number_of_bus приведет к следующей ошибке:

Изменчивость определения уравнения: number_of_bus = controlBus.num;больше, чем заявленная изменчивость переменных.

, поскольку коннектор изменяет время и параметр постоянен.

...