управление включением / выключением без событий в Modelica - PullRequest
2 голосов
/ 01 апреля 2011

Я пытаюсь управлять фотоэлектрической системой, подключенной к сети, основываясь на напряжении в сети. Идея такова: когда напряжение сети поднимается выше VMax, я хочу отключить систему на время выключения. Когда timeOff прошло, я хочу включить снова, но только когда напряжение сети ниже, чем VMax.

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

package Foo
model PVControl1 "Generating most events"

parameter Real VMax=253;
parameter Real timeOff=60;

input Real P_init "uncontrolled power";
input Real VGrid;
Real P_final "controlled power";
Boolean switch (start = true) "if true, system is producing";
discrete Real restartTime (start=-1, fixed=true) 
  "system is off until time>restartTime";

equation
when {VGrid > VMax, time > pre(restartTime)} then
  if VGrid > VMax then
    switch = false;
    restartTime = time + timeOff;
  else
    switch = true;
    restartTime = -1;
  end if;
end when;

if pre(switch) then
  P_final = P_init;
else
  P_final = 0;
end if;
end PVControl1;

model PVControl2;
  "Generating less events, but off-time is no multiple of timeOff"

parameter Real VMax=253;
parameter Real timeOff=60;

input Real P_init "uncontrolled power";
input Real VGrid;
Real P_final "controlled power";
discrete Real stopTime( start=-1-timeOff, fixed=true) 
  "system is off until time > stopTime + timeOff";

equation 
when VGrid > VMax then
  stopTime=time;
end when;

if noEvent(VGrid > VMax) or noEvent(time < stopTime + timeOff) then
  P_final = 0;
else
  P_final = P_init;
end if;
end PVControl2;

model TestPVControl;
  "Simulate 1000s to get an idea"

PVControl pvControl2(P_init=4000, VGrid = 300*sin(time/100));
end TestPVControl;

end foo;

При запуске я получаю 8 событий с PVControl1 и 4 события с PVControl2. Глядя на PVControl2, мне действительно нужно только событие, когда VGrid становится больше, чем VMax. Это дало бы только 2 события. Другие 2 события генерируются, когда VGrid снова падает ниже VMax.

Есть ли способ улучшить мою модель?
Спасибо, Рул

Ответы [ 2 ]

2 голосов
/ 01 апреля 2011

У меня есть несколько комментариев. Я думаю, что вы просматриваете событие, когда активируются уравнения в предложении when. Но это не совсем правильно. Событие происходит, когда изменяется значение дискретной переменной. Дело в том, что непрерывный интегратор должен быть остановлен в этой точке, а уравнения интегрированы с новым значением.

Чтобы понять, как это влияет на вас в этом случае, вам следует учесть, что анонимное выражение (например, в ваших предложениях when), вероятно, рассматривается как анонимная дискретная переменная. Другими словами, вы можете думать об этом как об эквивалентном:

Boolean c1 = VGrid > VMax;

when c1 then
  ...
end when;

... и важно отметить, что событие (то есть изменение значения c1) происходит как тогда, когда VGrid становится больше, чем VMax, так и когда оно становится меньше, чем VMax. Теперь рассмотрим это:

Boolean c1 = VGrid > VMax;
Boolean c2 = time > pre(restartTime);

when {c1, c2} then
  ...
end when;

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

После всего сказанного, у вас действительно есть проблемы с производительностью? Обычно такие события становятся проблемой только при «болтовне» (случаи, когда значение условия меняет знак из-за числового шума в процессе интеграции). У вас есть какие-либо цифры, чтобы указать, насколько серьезными являются эти события? Также может помочь узнать, какой инструмент вы используете для симуляции этих вещей.

Наконец, из вашей логики я не понимаю, что произойдет, если VGrid> VMax, а затем, после timeOff, VGrid по-прежнему превосходит VMax?

Предполагая, что он правильно обрабатывает этот последний случай, я думаю, что PVControl2 на самом деле то, что вы хотите (и генерирует именно то количество событий, которое я ожидал, и по причинам, которые я ожидал).

1 голос
/ 06 сентября 2011

Возможно, мой ответ опоздал на 1/2 года, но в этом случае есть вероятность, что система не жесткая, и в этом случае явный интегратор (например, CERK в Dymola) сделаетВремя выполнения симуляции намного быстрее.

...