2017-05-16 9 views
1

私はこのコードを使用するようにしようと試み:whenステートメントのmodelicaで複雑なイベントを生成するにはどうすればよいですか?

Real x,y; 
Boolean trigger(start = true) 
when x < y and trigger then 
    trigger = false; 
end when; 

私は「とき」一度だけのためのイベントを生成します。しかし、私のコードは動作しません。 whenステートメントのmodelicaで複雑なイベントを生成するにはどうすればよいですか?

+1

"しかし、私のコードはうまくいかない"とはあまり役に立ちません。何が起こると思われますか、どうなりますか?また、完全で実用的な例を投稿してください。 – Christoph

+0

翻訳に誤りがあり、無効なコードだと思います。コードは私が使用するときに動作します: 'x Tyomich

+0

その後、正確なエラーと、エラーを取得するために使用する正確なコードを投稿してください。 – Christoph

答えて

2

次のエラーメッセージが出ます:

計算因果関係の分析は変数が式から解決すべき を誘発する必要があります。x < y、および偽= をトリガーその後、トリガーを。終了時。 ただし、when条件は未知数にも依存します。

when条件のこれらの 参照の周りに「pre」を入れてループを切断することができます。

そこで解決策は次のようになります。

Real x,y; 
Boolean trigger(start = true) ; 
equation 
when x < y and pre(trigger) then 
    trigger = false; 
end when; 

あなたは、これは非常に簡単です(とDymolaはでシミュレート)見ての通り、私はOpenModelicaでそれをチェックしていません。

+0

非常に感謝、それはあまりにもOMでシミュレートです。これは 'pre()'なしで 'algorithm'を使ってシミュレートすることができます: 'ブールトリガー(開始=真、固定=真); アルゴリズム 時間が5以上でトリガーされた場合 トリガー:= false; 終了時; ' – Tyomich

1

最初に表示されるエラーメッセージは、Internal error BackendDAETransform.analyseStrongComponentBlock failed (Sorry - Support for Discrete Equation Systems is not yet implemented)です。これはhttps://trac.openmodelica.org/OpenModelica/ticket/1232と思われますが、これはwhen文内で条件変数の一部を再定義することによって発生したと思います。

reinitで対処することができます。 Bouncing ball exampleおよびthe referenceも参照してください。それは状態変数に作用する必要があり、そのため私はそこにder(trigger)を入れます。

model test_when 
    Real trigger(start = 1.0, fixed = true); 
equation 
    der(trigger) = 0; 
    when trigger > 0.5 and time > 5 then 
    reinit(trigger, 0); 
    end when; 
    annotation(
    experiment(StartTime = 0, StopTime = 10, Tolerance = 1e-06, Interval = 0.02)); 
end test_when; 

恐らくこれを達成するにはより良い方法があります。誰かがこれに入力を持っていますか?

コンパイルログ(統計 - イベント)を確認して、1つのイベントだけが起動したことを確認できます。 Dymolaはで

+0

あなたの答えをありがとう。私はそれが何をしているのかを見て、私の実装の問題を見つけるでしょう。 – Tyomich

関連する問題