Как реализовать причинный адаптер для электрических компонентов в OpenModelica?

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

Однако я не уверен, как реализовать это на практике. В частности, я ищу руководство по созданию причинного адаптера в OpenModelica.

Дополнительно хотелось бы понять принцип работы причинного адаптера, описанного в статье. В частности, почему в процессе необходимо извлекать напряжение (V) и ток (I)? Как это помогает преобразовать акаузальные соединители Modelica в причинную форму, подходящую для экспорта FMU?

Я ожидаю получить текстовое представление (на языке Modelica) причинного адаптера.


Спасибо за ответ от Маркуса, который Modelica.Electrical.Analog.Examples.GenerationOfFMUs приводит пример переноса электрического компонента в FMU. Основываясь на этом, я пытаюсь построить простую схему с 1 источником напряжения и 1 резистором с GeneralCurrentToVoltageAdaptor и GeneralVoltageToCurrentAdaptor, как показано ниже:

После этого я пытаюсь разделить эту схему на 3 части (источник напряжения/резистор/земля), а затем экспортировать каждую часть в FMU, как показано ниже (пожалуйста, не обращайте внимания на разницу сигналов напряжения):

В конце концов я импортирую эти FMU и подключаю их для моделирования, однако во время моделирования произошел сбой, и в журнале, я думаю, отображается сообщение об ошибке в решателе.

kinsol failed for system 122 [module] KINSOL | [function] KINSol | [error_code] -5 The line search algorithm was unable to find an iterate sufficiently distinct from the current iterate. KINSol finished with errorCode -5. kinsols line search did not convergence. Try without. kinsol failed for system 122 [module] KINSOL | [function] KINSol | [error_code] -7 Five consecutive steps have been taken that satisfy a scaled step length test. KINSol finished with errorCode -7. Newton step exceed the maximum step size several times. Try again after increasing maximum step size. kinsol failed for system 122 [module] KINSOL | [function] KINSol | [error_code] -11 The linear solver's setup function failed in an unrecoverable manner. KINSol finished with errorCode -11. KINSOL: The kinls setup routine (lsetup) encountered an error. Retry with numerical Jacobian. KINSOL: Trying to switch to numeric Jacobian for sparse solver KLU, but no sparsity pattern is available. Solution status: FAILED

Если я использую только 1 FMU для замены соответствующей детали на рисунке 1, симуляция будет успешной и результат будет правильным, но я сталкиваюсь с этой проблемой, когда использую более двух FMU, как показано ниже:

Что я хочу спросить:

  1. Можно ли использовать несколько FMU для представления каждого компонента в электрической цепи?
  2. Какова причина сбоя моделирования при подключении нескольких FMU?
  3. Как решить проблему 2?

Текущее решение:

Я просмотрел файл журнала, в котором записана информация о процессе моделирования, и обнаружил следующее утверждение в верхней части содержимого: initialize non-linear system solvers 2 non-linear systems Using sparse solver kinsol for nonlinear system 0 (106), because density of 0.04 remains under threshold of 0.10. KINSOL: log level 1 KINSOL: Using linear solver method klu Using sparse solver kinsol for nonlinear system 1 (221), because density of 0.04 remains under threshold of 0.10. KINSOL: log level 1 KINSOL: Using linear solver method klu The maximum density for using sparse solvers can be specified using the runtime flag '<-nlssMaxDensity=value>'.

Основываясь на этом описании, я добавил -nlssMaxDensity=value (согласно сообщению об ошибке, значение должно быть меньше 0,10, поэтому я установил его равным 0,05) в OpenModelica → Настройка моделирования → Флаги моделирования → Дополнительные флаги моделирования (необязательно): . После этого симуляция работала нормально. Я предполагаю, что причина этой проблемы в том, что система обнаруживает, что плотность меньше значения по умолчанию -nlssMaxDensity, таким образом пытаясь использовать разреженный решатель вместо плотного решателя. Однако по какой-то причине разреженный решатель может оказаться неспособным решить эту нелинейную систему, что приведет к прекращению моделирования. Хотя конкретная основная причина мне до сих пор неясна, этот метод действительно решает проблему.

Есть ли причина не понимать подсказки и не использовать напрямую адпаторы, использованные в этом примере: Modelica.Electrical.Analog.Examples.GenerationOfFMUs?

Markus A. 04.07.2024 08:07

Привет, @MarkusA. , спасибо за этот пример! Я не знал, что существует такой пример создания электрической цепи для FMU. И я обнаружил, что используемый в нем Resistor — это именно то приложение, которое мне нужно (перенос электрического компонента в FMU).

Kasper Lin 04.07.2024 11:40

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

Markus A. 04.07.2024 14:20
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
3
75
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

См. этот пост в блоге Claytex: https://www.claytex.com/tech-blog/using-physical-connectors-with-an-fmu/

Привет, Кристиан, спасибо за твое предложение. Однако, прежде чем вы предоставите эту информацию, я уже прочитал этот пост, и у меня вопрос: как реализовать упомянутый в этом посте причинный адаптер в OpenModelica с помощью языка Modelica или его графического интерфейса. В посте не дается такой подробной информации.

Kasper Lin 04.07.2024 02:53

Итак, вы добавляете 3 разъема (1 электрический, 1 реальный вход, 1 реальный выход) и добавляете упомянутые уравнения: pin_n.v = Vin; pin_p.v = Vout; pin_n.i = -Iout; pin_p.p = Iin; Затем вы можете добавить несколько графических связей между разъемами, как это было сделано в Claytex.

Clement44 04.07.2024 08:46
Ответ принят как подходящий

Есть один пример, который должен содержать то, что вам нужно сделать: Modelica.Electrical.Analog.Examples.GenerationOfFMUs:

По сути, адаптеры (Modelica.Electrical.Analog.Basic.GeneralCurrentToVoltageAdaptor и GeneralVoltageToCurrentAdaptor) используются для генерации причинных сигналов от физических электрических контактов, определенных в стандартной библиотеке Modelica. Это рекомендуемый способ создания FMU на основе физических моделей.

Также обратите внимание, что потенциально вам потребуется установить параметры use_pder и/или use_fder на true, когда создаваемый вами FMU содержит накопители энергии, которые могут быть конденсаторами или катушками индуктивности. Если это необходимо сделать, среда моделирования должна указать вам добавить производные при создании FMU.

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

Kasper Lin 05.07.2024 11:12

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

Markus A. 08.07.2024 09:53

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

Kasper Lin 08.07.2024 11:05

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