Я новичок в 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, как показано ниже:
Что я хочу спросить:
Текущее решение:
Я просмотрел файл журнала, в котором записана информация о процессе моделирования, и обнаружил следующее утверждение в верхней части содержимого: 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, таким образом пытаясь использовать разреженный решатель вместо плотного решателя. Однако по какой-то причине разреженный решатель может оказаться неспособным решить эту нелинейную систему, что приведет к прекращению моделирования. Хотя конкретная основная причина мне до сих пор неясна, этот метод действительно решает проблему.
Привет, @MarkusA. , спасибо за этот пример! Я не знал, что существует такой пример создания электрической цепи для FMU. И я обнаружил, что используемый в нем Resistor — это именно то приложение, которое мне нужно (перенос электрического компонента в FMU).
Хорошо, я создал немного более обширный ответ. Вероятно, вы можете принять ответ, чтобы пометить вопрос как решенный...





См. этот пост в блоге Claytex: https://www.claytex.com/tech-blog/using-physical-connectors-with-an-fmu/
Привет, Кристиан, спасибо за твое предложение. Однако, прежде чем вы предоставите эту информацию, я уже прочитал этот пост, и у меня вопрос: как реализовать упомянутый в этом посте причинный адаптер в OpenModelica с помощью языка Modelica или его графического интерфейса. В посте не дается такой подробной информации.
Итак, вы добавляете 3 разъема (1 электрический, 1 реальный вход, 1 реальный выход) и добавляете упомянутые уравнения: pin_n.v = Vin; pin_p.v = Vout; pin_n.i = -Iout; pin_p.p = Iin; Затем вы можете добавить несколько графических связей между разъемами, как это было сделано в Claytex.
Есть один пример, который должен содержать то, что вам нужно сделать: Modelica.Electrical.Analog.Examples.GenerationOfFMUs:
По сути, адаптеры (Modelica.Electrical.Analog.Basic.GeneralCurrentToVoltageAdaptor и GeneralVoltageToCurrentAdaptor) используются для генерации причинных сигналов от физических электрических контактов, определенных в стандартной библиотеке Modelica. Это рекомендуемый способ создания FMU на основе физических моделей.
Также обратите внимание, что потенциально вам потребуется установить параметры use_pder и/или use_fder на true, когда создаваемый вами FMU содержит накопители энергии, которые могут быть конденсаторами или катушками индуктивности. Если это необходимо сделать, среда моделирования должна указать вам добавить производные при создании FMU.
Привет, Маркус! Я провожу еще несколько экспериментов, но столкнулся с некоторыми проблемами. Подробную информацию об эксперименте я добавляю в свой исходный пост. Если бы вы могли мне помочь, я был бы очень благодарен.
Я думаю, что эта тема заслуживает нового вопроса. А чтобы воспроизвести быстрее, вы можете поделиться кодом используемого вами пакета...
Я только что узнал, как решить эту проблему, и добавляю решение, которое нашел в своем исходном сообщении, надеюсь, что это поможет людям, которые также сталкиваются с этой проблемой.
Есть ли причина не понимать подсказки и не использовать напрямую адпаторы, использованные в этом примере:
Modelica.Electrical.Analog.Examples.GenerationOfFMUs?