Activate で Modelica を使ってみる(その8) - Modelica ユーザー定義ブロック(第1回)
Activate で Modelica を使ってみる(その8)
Modelica ユーザー定義ブロック(第1回)
Activate では、ユーザーが作成した Modelica コードを使用したり、既存の Modelica コンポーネントをカスタマイズして Modelica ダイアグラムの中のコンポーネントとして使用したりするための MoCustomComponent というユーザー定義ブロックが用意されています。今回はそのMoCustomComponentの使い方をいつものバネマスモデルを例にとって説明します。ちなみに、Modelica コードを利用したユーザー定義ブロックとして MoCustomBlock というブロックも用意されていますが、こちらは扱いとしてはシグナルベースのブロックであり、非因果的なコンポーネントとしての機能は持っていないためここでは紹介しません。
MoCustomComponent ブロック
MoCustomComponent のブロックダイアログは以下のように3つのタブから構成されています。以下、Spring コンポーネントをそのまま Modelica のユーザー定義ブロックとして利用する場合を例にとって説明します。
“ポート” タブ
このタブではポートを定義します。”その5” の回でも説明しましたが、Spring コンポーネントの場合は、左側のポートが flange_a、右側が flange_b として定義されているので、ここではそのポート名をそのまま用いています。もちろん、ポート名は自由ですが、そのポート名はユーザーが定義する Modelica コード中に反映される必要があります。
“パラメータ” タブ
ここではModelica コード中に使用されている定数で、シミュレーション開始時に値を指定したい定数の値を指定します。”名前” フィールドに入力されているのが Modelica コード内で使用されている定数名です。”値” フィールドにはその定数の値を設定しますが、この例のように変数名で与えられている場合は “初期化” スクリプト(もしくは、”ダイアグラム” の “コンテキスト”)で値を設定します。例えば、この場合は以下のように与えています。
“シミュレーション関数” タブ
ユーザーが作成した Modelica コードを入力するためのタブです。”関数コード” フィールドの右側のアイコンをクリックすると Modelica コード用のエディターが以下のように表示されるので、そこに Modelica コードを入力します。ここでは、”その5” の回で紹介した Spring コンポーネントの Modelica コードをそのまま入力しています。ちなみに、Modlicaコード内の model 名は上の図の “HML 関数名” での入力と一致する必要があります。
(注1)MoCustomComponent でコンポーネントを作成した場合、Spring のような Translational パッケージ内部のクラスではないため継承時のオブジェクトの参照はルート(Modelica)から行っています。
(注2)HML 関数名というフィールドの名称は、本来は Modelica 関数名とすべきところだと思います。
検証モデル
この MoCustomComponent ブロックが正しく機能するかどうかを確かめるために以下のようなモデル(添付:SpringMass_MoCustom_Spring.scm)を作成しました。
上半分は “その1” で紹介したバネマスモデルそのままで、下半分はそれをコピーして Spring コンポーネントだけを上で紹介したMoCustomComponent ブロックに置き換えたモデルです。この結果は以下のように Spring コンポーネントの結果と完全に一致しており、MoCustomComponent が正しく機能していることが分かります。
バネの非線形化
次に MoCustomComponent ブロックで表現されている上述の線形バネを、バネ定数が変位に依存する非線形バネに置き換えてみます。ここでは、変位が0.015より大きいか、-0.015 より小さい場合はバネ定数 c が 1.0 となり、それ以外の場合は c = 3.0 となるとします。この場合の MoCustomComponent で入力する Modelica コードは以下のようになります(添付:SpringMass_MoCustom_NolinSpring_IfElse.scm)。
まず、バネ定数 c はシミュレーション中に値が変化するので、その定義を定数から変数に変更しています(5 行目)。次に、その c の値を if 文を用いてバネの伸び量(s_rel - s_rel0)の値によって場合分けして決定しています。すなわち、伸び量が 0.015 より大きいか、もしくは、-0.015 より小さい場合は c = 1.0 とし、それ以外の場合(-0.015 ≦ 伸び量 ≦ 0.015 の場合)は c = 3.0 としています(10 行目から 14 行目)。
また c を定数から変数に変更したことにより、MoCustomComponent ブロックの “パラメータ” タブでは以下のようにパラメータの設定を削除しています。
この結果は以下のようになり、効果が反映されているのが分かります。
“バネ定数vs 変位” カーブの外部ファイルからの読み込み
上のモデルで定義した変位依存のバネ定数の値は Modelica コード内で定義していました。ただこれでは ”バネ定数 vs 変位” カーブを変更したい場合に不便であることは明白です。ということで、次に、”バネ定数 vs 変位” カーブを外部ファイルから読み込む方法を紹介します。
まず、以下のような ”バネ定数 vs 変位” カーブを csv ファイルとして定義しておきます(添付:disp_spring.txt:拡張子を csv に変更してお使いください)。値は先ほどのモデルと同じになるように設定します。
次に、このファイルを以下のように “初期化” スクリプトで読み込むようにします。
1行目の xlsread コマンドにより disp_spring.csv ファイルの内容が全て読み込まれてマトリクス変数 stiffness_curve に割り当てられます。2 行目では、この stiffness_curve の 1 列目の 2 行目から最後までの値(変位)をベクトル変数 displ に、同じく 3 行目では stiffness_curve の 2 列目の 2 行目から最後までの値(バネ定数)をベクトル変数 stiff に、それぞれ代入しています。
対応する検証モデルは以下のようになります(添付:SpringMass_MoCustom_NolinSpring_CSV.scm)。
LookupTable ブロックのパラメータは以下の通りに設定します。
これにより、横軸としてベクトル変数 displ の数値列が、縦軸としてベクトル変数 stiff の数値列が使われるテーブルが作成されます。このLookupTable ブロックへの入力は Position センサーから出力された前のステップの変位結果であり、その値が displ の数値を参照し(数値間の場合は線形補間。補間方法は選択可能)、対応するバネ定数の値を出力します。この値は MoCustomComponent に c のポートを通して入力されこのステップでのバネ定数として使用されます。
そのMoCustomComponent の Modelica コードは以下のように定義されています。
ここでも先ほどのモデルと同様に c は変数として扱われていますが、先ほどとは異なって、c の値は model 内で計算されるのではなく6行目の文によって外部からの入力として値が定義されるようになっています。この値は、もちろん、MoCustomComponent の c ポートからの入力です。
この c ポートを定義するためにMoCustomComponent の “ポート” タブは以下のように設定しています。
このモデルの結果は以下のようになり、Modelica コード内で c を計算した場合と一致していることが分かります。
今回はバネマスモデルの Spring コンポーネントのみを MoCustomComponent で置き換えましたが、次回ではバネ、マス、ダンパの全部を1つの MoCustomComponent で表現することを考えます。