外部コードを使う
Modelica関数を書くことは易しいが,Cで書かれたサブルーチンを読み出すほうが便利である場合もある.このチュートリアルでは,Cで書かれた外部関数の使い方について示す.
このチュートリアルに使用されているモデル
|
Chirp ChirpSignal SeriesCircuit |
チャープ関数
チャープ信号とは,次のような場合に周波数が頻繁に変化する正弦曲線である:
この信号の瞬時周波数は,時間tについて引数を微分することによって得られる:
瞬時周波数は,周波数帯の下界から上界へと増加する.系に信号を適用する場合に,これは,励起周波数帯に対して十分な制御を提供するため,系の識別によく使われる.この例では,Cのチャープ関数を定義し,これをModelicaの外部関数として使う.
チャープ等の簡単な数学関数は一般に,通常のユーザ定義のModelica関数として実装する方がよい.そうすることによって,System Modeler内の記号的な構造が定義式にアクセスできるようになるからである.このチュートリアルでは,外部言語インターフェースがどのように作動するかを示す簡単な例としてチャープ関数を使う.
モデリング
まず,Chirpと呼ばれるModelica関数を作成することから始める.この関数は,同じ名前を持つC関数への外部呼出しを行う.
function Chirp
input Modelica.Units.SI.AngularVelocity w_start;
input Modelica.Units.SI.AngularVelocity w_end;
input Real A;
input Real M;
input Real t;
output Real y "output signal";
external "C" annotation(
Include = "#include \"Chirp.c\"",
IncludeDirectory = "modelica://IntroductoryExamples/Resources/ExternalFunctions/");
end Chirp;
この関数には,5個の入力信号,1個の出力信号,および外部関数Chirp.cへの呼出しが含まれる.宣言は,関数Chirp.cがこれら5個の入力で宣言され,倍精度浮動小数点数を返すと想定する.万一,何らかの理由で関数を呼び出す際の変数の順序を変えたい場合には,宣言を例えば以下に変えることによってそれが可能になる.
external "C" y = Chirp(t, A, M, w_start, w_end) annotation(…);
しかし,この場合には,同じ順序で同じ変数を使う関数を定義する.
double Chirp(double w1, double w2, double A, double M, double time)
{
double y;
y = A * cos(w1 * time + (w2 - w1) * time * time / (2 * M));
return y;
}
関数は,任意のテキストエディタを使って書き,Chirp.cの名前で保存することが可能である.この場合,Cファイルは,パッケージが保存されているディレクトリ内の新しいディレクトリResources/ExternalFunctionsに置かなくてはならない.他の場所に置くことも可能ではあるが,その場合には,IncludeDirectory注釈をそれに合わせて変更する必要がある.
C関数が保存されるとすぐに,Modelica関数が使えるようになる.これを行うためには,新しいModelicaブロックを作成し,その中でChirp関数を呼び出すとよい.ChirpSignalブロックを作成し,必要なパラメータを定義してから,事前定義されたModelicaコネクタModelica.Blocks.Interfaces.RealOutputをクラスブラウザからダイアグラムビューにドラッグアンドドロップすることができる.そうすると,ChirpSignalブロックにコネクタのインスタンスが作成され,これをブロックの方程式セクションで直接使うことができる.
block ChirpSignal
Modelica.Blocks.Interfaces.RealOutput y »;
parameter Modelica.Units.SI.AngularVelocity w_start = 0;
parameter Modelica.Units.SI.AngularVelocity w_end = 10;
parameter Real A = 1;
parameter Real M = 10;
equation
y = Chirp(w_start, w_end, A, M, time);
end ChirpSignal;
このシミュレーション結果に示されるように,信号が10秒間に0 rad/sから10 rad/sまで増加するように,デフォルトパラメータが設定されていることに注意されたい.
IntroductoryExamples.ExternalFunctions.ChirpSignalモデルのチャープ信号yのプロット.
事前定義されたModelicaコネクタModelica.Blocks.Interfaces.RealOutputを使った結果,ChirpSignalを入力ソースとして他のモデルにおいて使うことができる.例えば,以下の電気回路の共振周波数をテストするのに使うことができる.
IntroductoryExamples.ExternalFunctions.SeriesCircuitモデルのダイアグラムビュー .
電気成分のデフォルトパラメータが上の図に従って変更されたことに注意されたい.また,チャープのパラメータが0 rad/sから1000 rad/sまで素早く変化するように変更されている.
IntroductoryExamples.ExternalFunctions.SeriesCircuitモデルの電流のプロット.
上にあるように,振幅が約5秒の時点で最大になり,これは以下に対応する:
これは,以下のように,回路の共振周波数を分析的に計算することによっても確かめられる:
もちろん,より複雑な系においては,共振周波数を解析的に計算することが難しい場合もある.そのような場合には,チャープ信号が非常に役立つ.
練習問題
チャープ信号は,外部関数を使わずに,単一のModelicaブロックとして実装することも簡単にできる.興味のある読者は,練習問題としてこれに挑戦されたい.