включение/выключение управления без событий в Modelica

Я пытаюсь управлять фотоэлектрической системой, подключенной к сети, на основе напряжения сети. Идея такова: когда напряжение сети поднимается выше VMax, я хочу выключить систему на timeOff. Когда 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 события. Два других события генерируются, когда VGrid снова падает ниже VMax.

Можно ли еще улучшить мою модель?
Спасибо, Роэл.


person saroele    schedule 01.04.2011    source источник


Ответы (2)


У меня есть несколько комментариев. Я думаю, вы рассматриваете событие как активацию уравнений в предложении 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 на самом деле то, что вам нужно (и генерирует именно то количество событий, которое я ожидал, и по причинам, которые я ожидал).

person Michael Tiller    schedule 01.04.2011
comment
Михаил, спасибо за ответ. Чтобы немного уточнить: я использую dymola 7.4 FOD1. И да, события - это проблема. У меня довольно большая модель с 33 фотоэлектрическими системами, подключенными к сети (каждая система видит разные VGrid). Когда я активирую PVControl1, модель резко замедляется (фактор 3), и у меня 35 тысяч событий за 1 год. К сожалению, когда я пытаюсь использовать PVControl2, dymola вылетает при переводе или компиляции. Я связался со службой поддержки dymola по этому вопросу. На самом деле остается главный вопрос: есть ли способ выключить мою фотоэлектрическую систему без генерации события? - person saroele; 05.04.2011
comment
Я мог бы, конечно, закрыть его так: P_final = if noEvent(VGrid > VMax) then 0 else P_init; У меня не будет события, но модель становится нестабильной или даже неразрешимой, так как решатель не знает, включать ее или выключать (отключение снова уменьшит VGrid ниже VMax). - person saroele; 05.04.2011
comment
Единственное, о чем я могу думать, это посмотреть на ваши параметры интеграции и/или допуски. У вас есть очень долгая симуляция (1 год) с довольно быстрой динамикой (период переключения 60 секунд?). Возможно, интегратор тратит много усилий на попытки взять действительно большие временные шаги и терпит неудачу из-за событий, усекающих их. Хотя обычно интегратор с фиксированным временным шагом — это последнее, что я рекомендую, в вашем случае это может иметь смысл (по крайней мере, стоит попробовать). Помимо этого, попробуйте разные алгоритмы интеграции и разные допуски, чтобы увидеть, поможет ли это. - person Michael Tiller; 08.04.2011

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

person Hubertus Tummescheit    schedule 05.09.2011
comment
Учиться никогда не поздно... Я все еще работаю над моделями того же типа, поэтому я проверю этот решатель. Боюсь, что система жестковата, но, может быть, она сработает. Спасибо за ответ и добро пожаловать в stackoverflow :-) - person saroele; 06.09.2011