グリッド電圧に基づいてグリッド接続された太陽光発電システムを制御しようとしています。 グリッド電圧がVMaxを超えると、timeOffのためにシステムをオフにしたいと考えています。 timeOffが経過すると、グリッド電圧がVMaxよりも低いときにのみ、私は再びオンにしたい。Modelicaのイベントのないオン/オフ制御
私は現在2つの実装を持っています。どちらも多くの出来事を生み出していますし、もっと効率的な方法があるのだろうかと思います。これは今実装されている方法です:
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;
実行すると、PVControl1で8イベント、PVControl2で4イベントが得られます。 PVControl2を見ると、実際にはVGridがVMaxより大きくなる瞬間にイベントが必要になります。これは2つのイベントしか与えません。他の2つのイベントは、VGridが再びVMaxを下回ったときに生成されます。
モデルをさらに改善する方法はありますか?
ありがとう、 Roel
マイケル、あなたの答えに感謝します。私はdymola 7.4 FOD1を使用しています。そして、はい、イベントは問題です。私はグリッドに接続された33のPVシステムを備えたかなり大きなモデルを持っています(各システムは異なるVGridを見ています)。私がPVControl1を起動すると、モデルは大幅に遅くなり(要因3)、1年間で35kイベントが発生します。 残念ながら、PVControl2を試してみると、dymolaが翻訳やコンパイルでクラッシュします。私はこの問題のためにダイモラのサポートに連絡しています。 実際には、主な質問が残っています。イベントを生成せずにPVシステムをシャットダウンする方法はありますか? – saroele
P_final = if noEvent(VGrid> VMax)then 0 else P_init; 'イベントは発生しませんが、モデルが不安定になるか、ソルバが回転させるかどうかわからないので解けなくなりますそれをオンまたはオフに切り替えます(オフにするとVGridはVMaxよりも下がります)。 – saroele
私が考えることができる唯一のことは、あなたの積分パラメータおよび/または公差を見ることです。非常に長いダイナミックス(60秒の切り替え時間?)で、非常に長い実行シミュレーション(1年)を得ています。インテグレータは、本当に大きなタイムステップを取ろうとして多くの労力を費やしており、イベントを切り捨てるために失敗している可能性があります。通常、固定タイムストレップ・インテグレーターが私が推奨する最後のものですが、あなたのケースでは意味があります(少なくとも試してみる価値があります)。それ以外にも、さまざまな統合アルゴリズムとさまざまな許容誤差を試してみてください。 –