Activate で Modelica を使ってみる(その3) - 初期化とコンテキスト
Activate で Modelica を使ってみる(その3)
前処理(パラメータの初期設定)と外部ファイルの読み込み
今回はモデル/初期化およびダイアグラム/コンテキストでの OML スクリプトを用いたパラメータ値の設定について紹介します。
“その1” の回で作成したモデルではバネ定数や質量値等はブロックダイアログで直接数値を与えていましたが、Activate ではパラメータ値に変数名を与えて別の場所でその変数に値を設定することができます。これによりパラメータ値を分かりやすくしてメンテナンスしやすくなるだけではなく、同じ値を持つパラメータを一括で変更したりすることが可能になります。
“モデル”/”初期化” および “ダイアグラム”/”コンテキスト”
パラメータ値の初期設定は以下の2か所で可能です。
- リボンの “モデル” ➡ “初期化” タブ
- リボンの “ダイアグラム” ➡ “コンテキスト” タブ
初期化は Activate モデル全体(=シミュレーション設定を含む全ての情報)に対して適用されますが、コンテキストはダイアグラム(=モデルエリアに表示されている情報)に対してのみ適用されます。当然ながら、モデルに対して設定されたパラメータ値はダイアグラムにも適用されます。また、コンテキストはスーパーブロック毎に異なった設定を行うこともできます。スーパーブロックで設定された値はそのスーパーブロックおよびその下位層のスーパーブロックに対して有効になります(下図参照)。同じ変数に重複して値が定義されている場合は下位層の値が優先されます。
モデルに含まれていてダイアグラムに含まれていない情報としては、例えば、以下のシミュレーションパラメータの設定があります。
次に ”その1” で作成したモデルのパラメータを変数化します。まずは、以下のようにバネ定数、質量、減衰係数を変数化するためにブロックダイアログでそれぞれの値としてK, M, Bという変数名を与えます。
次に初期化ウィンドウでこれらの変数に値を定義します。ちなみに、この場合はコンテキストで与えても結果は全く同じです。
ここでは、K および M には単純に値を代入していますが、B は K と M の値から臨界減衰係数を計算し、B をその 20% としています。
ちなみに、各変数に与えられた値は、リボンの “ダイアグラム” から “使用可能な変数” タブを選択することにより以下のように確認することができます。
初期化およびコンテキストウィンドウでは OML スクリプトを用いて設定を行います。OMLは Scicos、Octave、Matlab 等に互換性を持つ言語で Activate や Altair Compose が実行環境を提供しています。OML の詳しい情報は、ヘルプのリファレンスガイドのScripting Guide for OpenMatrix Languageの項を参照してください。
外部ファイル(csv 形式ファイル)の読み込み
外部ファイルを読み込むためのブロックも用意されていますが、ここでは初期化もしくはコンテキストウィンドウで csv ファイルや Excelのスプレッドシートを読むための xlsread コマンド(もちろん、他にも外部ファイル用のコマンドは存在します)を利用します。
上述のバネマスモデルにおいて、例えばバネ定数(K)が温度依存であるとし、バネ定数 vs 温度のカーブが以下の csv ファイル(添付:csv_file.csv)で用意されているとした場合を考えます(添付モデル:SpringMass_Horizntal_MBK.scm)。
この csv ファイル読み込んで、指定された温度からバネ定数を決定する初期化スクリプトは例えば以下のようになります。
1行目:参照温度を指定しています。すなわち、40°の時のバネ定数を以下で求めることになります。
3~5 行目:指定温度が0° より小さいか、もしくは 100° より大きい場合はエラーメッセージを出力してシミュレーションを実行せずに終了するようにしています。
7 行目:csv ファイルを読み込んで、全ての値を v というマトリクスに保存します。もしcsv ファイルの一部のみを読み込みたい場合は、例えば xlsread('csv_file.csv', 'A3:B4') のように指定します。この場合は csv ファイルの以下の部分を読み込むことになります。
8 行目:マトリクス v の1 列目の 2 行目から最後の行までを v_x というベクトルに保存します。
9 行目:同じく、v の2 列目の 2 行目から最後の行までを v_y というベクトルに保存します。
11 行目:入力の温度値から線形補間してバネ定数値を計算します。
このモデルで Temp を 40 と指定した場合と 80 と指定した場合の結果を以下に示します。バネ定数が温度依存になっていることが分かると思います。
読み込まれた外部ファイルはルックアップテーブルとして使われたり、荷重のための時系列信号として使われたりことがよくありますが、それらについてはまた後日紹介するようにします。
今回までは XY プロットを出力するためにセンサーと Scope ブロックをペアで設置していましたが、出力したい部位や応答の種類が増えると設定に手間がかかります。次回ではセンサー/Scope を必要としない結果出力の方法を紹介します。