Как реализовать подсчет циклов в Modelica? - PullRequest
4 голосов
/ 21 мая 2019

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

1 Ответ

5 голосов
/ 22 мая 2019

Это довольно общий вопрос, поэтому мой ответ также будет довольно общим. Также мне не понятно, что вы называете циклом. Википедия упоминает глубокие и неглубокие выделения, а также есть и другие.

Некоторые общие замечания: в Modelica оператор when полезен для подсчета. Вы можете прочитать Раздел 8.3.5 Спецификации языка Modelica , чтобы получить полную информацию по этому вопросу.

Приведенные ниже примеры вычисляют, как часто переменная PNet становится положительной, что должно соответствовать количеству приведенных выше мелких циклов. Некоторое описание для модели:

  • Модель noiseSource вычисляет случайное число, которое затем фильтруется элементом первого порядка (PT1) для вычисления PNet. Фильтр, вероятно, должен быть пропущен в исходном примере, он только для того, чтобы немного сгладить траекторию.
  • Код в операторе when выполняется один раз в тот момент, когда условие становится истинным, что позволяет считать.
  • Оператор pre обращается к значению cycles непосредственно перед тем, как оператор when стал активным, что позволяет подсчитывать, как часто возникало условие.
  • start=0 в cycles(start=0) устанавливает начальное значение для переменной cycles, что необходимо, поскольку вы не можете использовать cycles = 0, поскольку это приведет к созданию уравнения для циклов, а это не то, что вам нужно.
  • Модель inner globalSeed необходима для работы источника шума.

Вот фактический код:

model CycleCounter
  inner Modelica.Blocks.Noise.GlobalSeed globalSeed;
  Modelica.Blocks.Noise.NormalNoise noiseSource;

  parameter Modelica.SIunits.Time T = 1e-3 "Time constant of PT1 element to filter random signal to compute PNet";

  Integer cycles(start=0) "Counts the number of ";
  Real PNet "Random value";

equation 
  der(PNet) = (noiseSource.y - PNet)/T;

  when PNet > 0 then
    cycles = pre(cycles)+1;
  end when;

  annotation (uses(Modelica(version="3.2.3")));
end CycleCounter;

И результат симуляции в Dymola:

Result of the code above

...