Можно ли построить условный FMU с помощью Modelica?

У меня есть приложение, в котором я использую Dymola в качестве среды разработки, но буду экспортировать модели в форме FMU для использования в другом приложении. Системы, которые я моделирую, имеют взаимозаменяемые компоненты, поэтому они отлично подходят для моделирования в Modelica. Но я не уверен, что смогу использовать эту возможность, когда хочу экспортировать модели в форме FMU.

Рассмотрим очень простой пакет ниже. Цель пакета - определить две очень простые модели и позволить пользователю выбирать между возможными моделями при выполнении модели. Хотя это легко сделать в среде Modelica IDE, мне нужны аналогичные возможности в FMU.

Частичная модель определяет модель, в которой y = p0 + p1 * x. Две расширенные модели просто присваивают разные значения параметрам p0 и p1. Наконец, TestModel добавляет параметр с именем modelIndex, который используется в условных выражениях, определяющих два возможных типа модели. В Dymola это прекрасно работает, так как пользователь может легко установить значение параметра modelIndex. Я пытаюсь выяснить, можно ли сделать это через FMU, сделав modelIndex входом в FMU. Но компиляция завершится неудачно, если я установлю аннотацию Evaluate = false для переменной modelIndex. Заявленная ошибка: «Текущая версия переводчика Modelica может обрабатывать только условные компоненты с фиксированным условием .... Все переменные, используемые в условии условного объявления, должны быть объявлены как константы или параметры».

Мы будем очень признательны, если кто-нибудь сможет помочь дать руководство по созданию условного FMU. Этот простой пример используется только для демонстрации проблемы. Настоящая моделируемая система имеет 4-5 основных компонентов, каждый из которых имеет 5+ возможных различных моделей, что дает большой набор возможных перестановок. Простой пакетный экспорт всех конфигураций, скорее всего, невозможен.

Спасибо! Джастин

package ConfigurableModel 
  "Package to test whether or not models can be configured by external inputs"
  partial model partialModel 
    "Partial model used to control selectable options in Dymola"

    Modelica.Blocks.Interfaces.RealInput x(start = 1) "input value";
    Modelica.Blocks.Interfaces.RealOutput y "output value";

    parameter Real p0 = 0;
    parameter Real p1 = 0;

  equation 
    y = p0 + p1*x;
      annotation (Icon(coordinateSystem(preserveAspectRatio=false)), Diagram(
      coordinateSystem(preserveAspectRatio=false)));
  end partialModel;

  model linearModel_NoOffset "Linear model with no offset"
    extends partialModel(p0 = 0, p1 = 1);
  end linearModel_NoOffset;

  model linearModel_Offset "Linear model with offset"
    extends partialModel(p0=1, p1=1);
  end linearModel_Offset;

  model TestModel "Model to test configurability"
    // parameter Integer modelIndex = 2 "1 = linear_NoOffset, 2 = linear_Offset" annotation(Evaluate=false);

    parameter Integer modelIndex = 2 "1 = linear_NoOffset, 2 = linear_Offset";

    // Conditional instances, only one model is created based upon value of modelIndex
    linearModel_NoOffset linear_NoOffset if modelIndex == 1;
    linearModel_Offset linear_Offset if modelIndex == 2;

    // Input and output blocks
    Modelica.Blocks.Sources.Constant xMaster(k=1) annotation (Placement(transformation(extent={{-100,-10},{-80,10}})));
    Modelica.Blocks.Interfaces.RealOutput yMaster annotation (Placement(transformation(extent={{100,-10},{120,10}})));

  equation 
    // Note that only the connections for the components that exist will be used

    // Connect input to each model instance
    connect(xMaster.y, linear_NoOffset.x);
    connect(xMaster.y, linear_Offset.x);

    // Connect output to each model instance
    connect(yMaster, linear_NoOffset.y);
    connect(yMaster, linear_Offset.y);

      annotation (Icon(coordinateSystem(preserveAspectRatio=false)), Diagram(
      coordinateSystem(preserveAspectRatio=false)));
  end TestModel;
    annotation (uses(Modelica(version="3.2.1")));
end ConfigurableModel;

person Justin Kauffman    schedule 17.02.2017    source источник


Ответы (2)


Насколько я понимаю, это невозможно напрямую с FMI. Объектно-ориентированные функции Modelica, такие как условное создание экземпляров, обрабатываются во время символьной обработки Modelica перед генерацией C-кода, который является частью FMU (как C-Code или в скомпилированной форме). Посредством условного создания экземпляра многие свойства экспортируемых FMU могут быть изменены (например, иметь разное количество состояний). Таким образом, у вас не может быть единственного файла modeldescription.xml в FMU, описывающего свойства FMU. Вы можете рассмотреть возможность разделения своей модели на несколько FMU и учесть изменчивость подсистем, поменяв некоторые из них. Однако это может привести к более сложной численной задаче, чем с исходной общей моделью Modelica, поскольку никакая оптимизация всей модели не может быть выполнена, как компилятор Modelica для всей модели. Одним из преимуществ вашего примера является то, что ваша частичная модель уже имеет причинные интерфейсы (RealInput и RealOutput). Обходной путь, чтобы приблизиться к вашему предполагаемому решению, может заключаться в том, что вы включаете обе подмодели linear_NoOffset и linear_Offset (без «if modelIndex == xy» ) в вашу модель включите переключатели, запускаемые modelIndex для переключения между сигналами двух подмоделей и обратно. Это может привести к некоторым вычислительным затратам, поскольку обе подмодели присутствуют и оцениваются.

person Christian Bertsch    schedule 18.02.2017
comment
Кристиан, спасибо за ответ. К сожалению, ваш ответ - это то, что я ожидал. Если кто-нибудь знает альтернативы, я был бы признателен за обратную связь. Я рассматриваю следующее: 1. Экспортируйте несколько FMU для каждой требуемой перестановки подкомпонентов. 2. Параметризуйте каждый из подкомпонентов так, чтобы они могли быть указаны с одинаковой структурой, но только с разными значениями параметров. К сожалению, включение нескольких подмоделей, вероятно, будет слишком большим штрафом для моих настоящих систем, потому что модели намного сложнее, чем простой примерный случай. Спасибо, Джастин - person Justin Kauffman; 20.02.2017

Похоже, ваша проблема может быть решена с использованием подхода Elmqvist (2014), хотя я с тех пор больше не слышно по этой теме. Я не уверен, был ли добавлен какой-либо автоматический подход в Dymola, но вы могли бы попробовать явно смоделировать переключение ваших моделей.

person sjoelund.se    schedule 20.02.2017
comment
Спасибо за ссылку. Я просмотрел этот документ и согласен, что он будет полезен в моем случае. Я отправил вопросы Hilding Elmqvist и в службу технической поддержки Dymola, чтобы прокомментировать, какие функции были реализованы с момента публикации статьи. Я буду предоставлять обновленные комментарии на основе их отзывов. - person Justin Kauffman; 21.02.2017
comment
Техническая поддержка Dymola заявила, что функции, описанные в Elmqvist (2014), не были включены в Dymola на сегодняшний день и не входят в план на Dymola 2018. Но они продолжают дальнейшее расследование, чтобы увидеть, могут ли они найти обходной путь. - person Justin Kauffman; 01.03.2017