プラント用のModelica(OpenModelica、jModelica)とコントローラー用のC / C ++ルーチンを使用して、制御システム設計のループ内にソフトウェアを実装する方法。どのようなアプローチを提案できますか?外部C関数が役立つと思いましたが、参照の透明性プロパティに従う必要がある、つまり同じ入力に対して同じ値を返す(内部状態を持たない)など、いくつかの制限があるようです。
1 に答える
その場合、外部 C 関数の呼び出しに関する問題は適用されません。確かに Modelica は、関数が同じ引数に対して同じ値を返さなければならないように、連続方程式での関数の使用を制限しています。そのような場合、状態を関数に渡し、新しい状態を返す方法を見つける必要があります (この「純度」要件を満たす必要がある場合)。これは明らかに C コードで行うには非常に面倒です (状態を渡し、すべての状態変数 (おそらくグローバル) を割り当て、コードを実行し、すべての状態変数の値を抽出して返す必要があります)。
幸いなことに、これについて心配する必要はありません。その理由は、関数は when 句内からのみ呼び出す必要があるためです。時間に基づいて when 句をトリガーしている場合 (たとえば、sample(...) 関数を使用)、関数が毎回 1 回だけ呼び出されることが保証されていると確信しています。
基本的に、セットアップは次のようになります。
algorithm
when sample(0, sample_rate) then
u := controllerEvaluation(x, y, t);
end when;
このようにして、時間、必要な状態 x、および入力 y (見方によっては u) をコントローラーに渡すことができ、コントローラー コマンドをプラント u に戻すことができます。
このコンテキストでは、when 句はスケジューラの表現であり、状態イベントが含まれていないため (たとえば、歯車エンコーダーやその他の非同期割り込みの場合と同様)、シミュレーターはこれらすべての関数呼び出しをスケジュールできます。それらを繰り返さなければならないリスクはありません。