2

グリッド電圧に基づいてグリッド接続された太陽光発電システムを制御しようとしています。アイデアはこれです:グリッド電圧がVMaxを超えて上昇したとき、私はtimeOffのためにシステムをオフにしたいです。timeOffが経過したら、もう一度オンにしますが、グリッド電圧がVMaxよりも低い場合に限ります。

現在、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を再び下回ったときに生成されます。

モデルをさらに改善する方法はありますか?
ありがとう、ロエル

4

2 に答える 2

2

コメントがいくつかあります。when句内の方程式がアクティブ化されたときのようにイベントを表示していると思います。しかし、それは完全には正しくありません。離散変数の値が変化すると、イベントが発生します。重要なのは、連続積分器をその時点で停止し、方程式を新しい値と統合する必要があるということです。

この場合、それがどのように影響するかを理解するには、匿名の式(when句の式など)がおそらく匿名の離散変数として扱われていることを考慮する必要があります。言い換えれば、これと同等であると考えることができます。

Boolean c1 = VGrid > VMax;

when c1 then
  ...
end when;

...そして注意すべき重要なことは、イベント(つまり、の値の変更)は、が大きくなったときと小さくなったときのc1両方で発生するということです。今これを考慮してください:VGridVMaxVMax

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

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

これで、さらに多くのイベントが発生します。これは、2つの条件が関係しており、どちらかが値を変更するたびにイベントを生成するためです。

とはいえ、実際にここでパフォーマンスの問題が発生していますか?通常、このようなイベントは、「チャタリング」(積分プロセスの数値ノイズのために条件の値の符号が変わる場合)がある場合にのみ問題になります。これらのイベントが実際にどれだけの問題であるかを示す数字はありますか?これらをシミュレートするために使用しているツールを知ることも役立つ場合があります。

最後に、あなたのロジックから私が理解していないことの1つは、VGrid> VMaxの場合、timeOff後もVGridがVMaxよりも大きい場合にどうなるかということです。

この最後のケースを正しく処理すると仮定すると、PVControl2は実際に必要なものだと思います(そして、私が期待するイベントの数と、私が期待する理由で正確に生成します)。

于 2011-04-01T17:42:52.527 に答える
1

おそらく私の答えは半年遅すぎますが、この場合、システムが堅くない可能性があり、その場合、明示的なインテグレーター(DymolaのCERKのものなど)がシミュレーションの実行時間を作成しますはるかに高速。

于 2011-09-05T20:10:42.527 に答える