2011-04-01 12 views
2

グリッド電圧に基づいてグリッド接続された太陽光発電システムを制御しようとしています。 グリッド電圧が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

答えて

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; 

を今すぐ関与する2つの条件があるので、あなたも多くのイベントを持っている、あなたは、イベントを毎回生成するいずれか一方には、値を変更します。

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

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

この最後のケースを正しく処理すると仮定すると、PVControl2は実際にあなたが望むものです(私が期待するイベントの数と予想される数を正確に生成します)。

+0

マイケル、あなたの答えに感謝します。私はdymola 7.4 FOD1を使用しています。そして、はい、イベントは問題です。私はグリッドに接続された33のPVシステムを備えたかなり大きなモデルを持っています(各システムは異なるVGridを見ています)。私がPVControl1を起動すると、モデルは大幅に遅くなり(要因3)​​、1年間で35kイベントが発生します。 残念ながら、PVControl2を試してみると、dymolaが翻訳やコンパイルでクラッシュします。私はこの問題のためにダイモラのサポートに連絡しています。 実際には、主な質問が残っています。イベントを生成せずにPVシステムをシャットダウンする方法はありますか? – saroele

+0

P_final = if noEvent(VGrid> VMax)then 0 else P_init; 'イベントは発生しませんが、モデルが不安定になるか、ソルバが回転させるかどうかわからないので解けなくなりますそれをオンまたはオフに切り替えます(オフにするとVGridはVMaxよりも下がります)。 – saroele

+2

私が考えることができる唯一のことは、あなたの積分パラメータおよび/または公差を見ることです。非常に長いダイナミックス(60秒の切り替え時間?)で、非常に長い実行シミュレーション(1年)を得ています。インテグレータは、本当に大きなタイムステップを取ろうとして多くの労力を費やしており、イベントを切り捨てるために失敗している可能性があります。通常、固定タイムストレップ・インテグレーターが私が推奨する最後のものですが、あなたのケースでは意味があります(少なくとも試してみる価値があります)。それ以外にも、さまざまな統合アルゴリズムとさまざまな許容誤差を試してみてください。 –

1

おそらく私の答えは1年半遅すぎますが、この場合、システムが硬くない可能性があります。その場合、明示的なインテグレータ(DymolaのCERKのようなもの)あなたのシミュレーション実行時間はずっと短くなります。

+0

それは学ぶのが遅すぎることはありません... 私はまだ同じタイプのモデルで作業していますので、このソルバーをチェックします。私はシステムが堅いのではないかと恐れているが、おそらくそれはうまくいくだろう。 あなたの答えをありがとう、とstackoverflowへようこそ:-) – saroele

関連する問題