Как передать несколько переменных из одной модели в другую (внутреннюю / внешнюю) - PullRequest
0 голосов
/ 13 ноября 2018

Допустим, у нас есть следующая модель:

Collector:

model Collector
  Real collect_here;
annotation(defaultComponentPrefixes="inner");
end Collector;

и потенциально следующая модель несколько раз:

model Calculator
  outer Collector collector;
  Real calculatedVariable = 2*time;

equation 
  calculatedVariable = collector.collect_here;

end Calculator;

Приведенный выше код работает, еслиcalcModel присутствует только один раз в моделируемой системе.Если модель существует более одного раза, я получаю единственную систему.Это демонстрируется примером ниже.Изменение параметра works либо дает работающую или неработающую систему.

model Example
  parameter Boolean works = true;

  inner Collector collector;
  Calculator calculator1;
  Calculator calculator2 if not works;

end Example;

Использование массива внутри коллектора для передачи нескольких переменных в нем не решает проблему.

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

Ответы [ 2 ]

0 голосов
/ 14 ноября 2018

Я подготовил демонстрационную библиотеку для такого сценария несколько дней назад.Вы можете получить к нему доступ по адресу https://gist.github.com/beutlich/e630b2bf6cdf3efe96e5e9a637124fe1. Если вы читаете документацию по Примеру 2, вы можете увидеть ссылку на статью H. Elmqvis et.al. , что является ключом к вашей проблеме.То есть вам нужен соединитель, и унаследованные соединяет каждый калькулятор с одним коллектором.

0 голосов
/ 13 ноября 2018

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

Чтобы дать немного больше понимания: на самом деле проверка Collector не удастсятак как начиная с Modelica 3.0 каждый компонент должен быть сбалансирован (то есть он должен иметь столько же неизвестных, сколько и состояний), что не относится к Collector, поскольку у него есть одно неизвестное, но нет уравнения.Это сильно ограничивает возможные применения конструкции inner/outer, поскольку в основном каждая переменная должна быть вычислена там, где она определена.

В данном примере это компенсируется в общей системе, если используется только один Calculator.Так что эта единственная комбинация будет работать.Хотя это работает, это то, что не следует делать - по очевидной причине очень подверженной ошибкам (и все подмодели должны пройти проверку).

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

  1. Вы хотите построить несколько переменных из одной точки, которая будет коллектором.Для этой цели «выбор переменных» должен быть наиболее простым способом: см. Dymola Manual Vol.1, раздел «4.3.11 Соответствие и выбор переменных» о том, как их применять.
  2. Вы хотите выполнить некоторую математическую операцию над этими переменными.Тогда может быть полезно иметь векторизованный ввод переменного размера.Это позволяет произвольное количество подключений к этому входу.Для примера рассмотрим: Modelica.Blocks.Math.MultiSum
  3. Вы хотите направить несколько сигналов между разными моделями (что маловероятно, если судить по вашему описанию, но все же): тогда expandable connectors будет хорошей возможностью,Чтобы получить представление о том, на что это действительно нужно взглянуть, Modelica.Blocks.Examples.BusUsage.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...