2012-03-23 20 views
3

プラントのModelica(OpenModelica、jModelica)とコントローラのC/C++ルーチンを使用した制御システム設計のためのループでのソフトウェア実装方法。どのようなアプローチが示唆できますか? 私は外部のC関数が助けになると思っていましたが、参照透過性プロパティに従う、つまり同じ入力に対して同じ値を返す(内部状態を持たない)ような制限があるようです。Modelicaを使用したループモードのソフトウェア

+1

コントローラのスケジューラをどのように実装する予定ですか?これは一定時間間隔(たとえば16msごと)にスケジュールされたコントローラか、または工場内の状態イベントによって非同期に呼び出されるコントローラですか?または、コントローラが連続的に実行されている(つまり、連続的な数学モデル)ことに注意してください。 私はあなたがしたいことがModelicaで達成できることを確信しています。しかし、私はあなたが心に持っているものを正確に理解する必要があります。 –

+0

マイケル・レスポンスありがとう!はい、私はコントローラのルーチンをregulearの間隔で実行したいです。また、そのルーチンにはmodelicaのプロセス変数が提供され、modelicaのモデルに影響を与える制御アクション(信号)が出力される必要があります。 – aliko

答えて

4

この場合、外部C関数の呼び出しに関する問題は適用されません。 Modelicaが連続式に関数を使用することを、同じ引数に対して同じ値を返さなければならないように制限するのは事実です。そのような場合、状態を関数に渡して新しい状態を返す方法を見つける必要があります(この "純度"要件を満たすには)。これは明らかにCコードとはかなり面倒です(状態を渡し、すべての状態変数(おそらくグローバル変数)にコードを実行し、すべての状態変数の値を抽出して返す必要があります)。

幸運なことに、これについて心配する必要はありません。理由は、あなたの関数がwhen節の中から呼び出されるだけでよいからです。 when節(例えば、サンプル(...)関数を使用)を使ってwhen節を起動している場合、関数が毎回呼び出されることが保証されていることは間違いありません。

は基本的に、あなたのセットアップはこのようなものになるだろう:あなたは時間を渡すことができ、このように

algorithm 
    when sample(0, sample_rate) then 
    u := controllerEvaluation(x, y, t); 
    end when; 

、必要な状態で、x、および入力、Y(またはu、あなたの視点に応じて)、コントローラーにコントローラーコマンドを戻します。

この文脈では、when節はあなたのスケジューラの表現であり、(例えば、歯車エンコーダや他の非同期割り込みのような)状態イベントを含まないため、シミュレータは、これらすべての機能呼び出しは、それらを繰り返す必要がありません。

+0

マイケルをあなたの解決に感謝します!私はそれを試してみましょう! – aliko

+0

Modelica言語仕様では、 'sample()'が毎回関数を1回呼び出すとは保証されていません。システム方程式のODE表現の場合がそうである可能性が高いが、システム方程式のDAE表現については必ずしも保証されていない。 正しい実装では、Modelica言語仕様3.3のcloked/synchronous機能のサンプル演算子を使用します。 – DelmeDelmi

関連する問題