Activate で Modelica を使ってみる(その9) - Modelica ユーザー定義ブロック(第2回)
Activate で Modelica を使ってみる(その9)
Modelica ユーザー定義ブロック(第2回)
前回はモデル中の Spring コンポーネント単体をMoCustomComponent ブロックで置き換えました。今回はバネ、マス、ダンパの3つをまとめて一つのMoCustomComponent ブロックで表現することを考え、ここではそのための2つの方法を紹介します。1つ目はバネマスモデルが生成する運動方程式をそのまま Modelica コードで表現する方法。もう1つはバネマスモデルのブロックダイアグラムを Modelica コードで表現する方法です。
運動方程式の Modelica での表現
まず、バネ-マス-ダンパのシステムが生成する運動方程式を Modelica で表現することを考えます。1つのバネから生成される剛性マトリクス [K] は、k をバネ定数とすると、
となります。同様に、質量マトリクス [M] と減衰マトリクス [B] はそれぞれ
となります。また、変位ベクトルを
、外力ベクトルを
とすると、運動方程式は
となり、これは Modelica コードで以下のように表現できます。
3~5 行目は上述した、剛性、質量、減衰の各マトリクス(定数)の定義です。ここでは、K、M、B をそれぞれ2行2列のマトリクスとして宣言していて、かつ、その各要素にここで値を代入しています。この値として使用されている k、m、b の各定数は 4 行目で定数として宣言されおり、それぞれがバネ定数、質量、減衰の値を表しています。
これらの定数は “MoCustomComponent” ダイアログの “パラメータ” タブで以下のように定義されており、k、m、b の値は “モデル” の “初期設定” スクリプトで定義されている K、M、B の値を参照していることが分かります。ちなみに、同じ文字を変数名に使ってしまい混乱させてしまいましたが、このスカラー変数である K、M、B と Modelica コード内のマトリクス変数である K、M、B は異なる変数であることをご承知ください。
8~10 行目の u、v、f は 2 次元のベクトル変数の定義で、それぞれ変位、速度、力を表しています。また、12 と 13 行目ではこの model のポートが定義されています。これによって、以前のモデルの Spring コンポーネントと同様に、ポートを通して交換される物理量としてアクロス変数は変位、スルー変数は力であること、および、ポート名が flange_a と flange_b であることが定義されていることが分かります。
equation 部分の 17, 18 行目では両端の変位をベクトル変数 u と、また 22, 23 行目では両端の力をベクトル変数 f と、それぞれ等置しています。20 行目は v が u の微分であることを定義し、最後に 25 行目で運動方程式を定義しています。
この MoCustomComponent コンポーネントが機能することを確認するために以下のようなモデル(添付:SpringMass_MoCustom_MatrixCalc.scm)を作成しました。
この結果は以下の通りとなり、この MoCustomComponent が機能していることが確認できます。
上述した MoCustomComponent ブロックは非因果的なブロックであり、これを複数個連結して使うことができます。例えば、直列に連結したモデル(添付:SpringMass_MoCustom_MatrixCalc_2DOF.scm)を以下のように作成して結果が正しいことを確認しました。
このモデルの “初期化” スクリプトは以下の通りです。
このモデルの結果は以下となり一致していることが確認できます。
Modelica コードを用いたバネ-マス-ダンパモデルのダイアグラム表現
ここでは、コンポーネント同志がリンクされている状態(ブロックダイアグラム)が Modelica ではどのように表現されているかを見てみます。Modelica ではコンポーネント間のリンクは Connect コマンドで定義します。例えば、Damper と Spring という2つのコンポーネントを接続したい場合は
connect(Spring.flange_a,Damper.flange_b);
という文で定義します。これは、Spring の flange_a ポートと Damper の Flange_b ポートがリンクされていることを表しています。Modelica はこの connect 文を使ってコンポーネント間をリンクさせ、対応する拘束方程式を追加して全体モデルの方程式を構築しています。
Activate ではこのようなModelica コードの生成は内部的に実行されておりユーザーが気にする必要はありませんが、ユーザーがこのModelica コードを必要とする場合のために、Modelica 部分全体の Modelica コードを出力する機能が提供されています。
この Modelica コードを出力するには、コードを出力したいモデルがアクティブになっている状態で、以下のようにメニューの “ファイル” から “エクスポート” è “Modelica モデルのエクスポート” をクリックします。
例えば、以下に示すいつものバネマスモデルに対して出力されたModelica コードは以下の通りです(annotation とコメントを削除しています)。
この Modelica コードでは、model vss_SpringMass_Horizntal_1_container の中に model vss_SpringMass_Horizntal_1 が含まれている2重構造になっています。7~12 行目ではこのモデルを構成する各コンポーネントとなるインスタンスが作成されています。15~20 行目の equation 部分では上で説明した connect 文を用いて各コンポーネントのリンク関係を定義しています。
23 行目では subcontainer というインスタンスを model vss_SpringMass_Horizntal_1 から作成しており、後のequation 部分で subcontainer.Force.f という形で参照しています。これは結局 Force コンポーネントの力 f を変数として使っていることになります。
24と25 行目では ToModelica と FromModelica という変数を、それぞれ入力専用および出力専用の実数変数として定義しています。変数である ToModelica の値は入力ポートを通して外側から入力され、同じく、FromModelica の値は出力ポートから外側へ出力されます。28 行目ではその ToModelica と Force コンポーネントの力 f を、29 行目では FromModelica と PositionSensor コンポーネントの変位 s を、それぞれ等置しています。
この modelica コードを利用するために以下のようなモデルに MoCustomComponent を組み込みました(添付:SpringMass_MoCustom_Connectors_org.scm)。
この MoCustomComponent ブロックの “ポート” タブは、上で説明した入出力の変数(ToModelica と FromModelica)に合わせて以下のように設定しています。
またこの例では M, K, B の値は Modelica コード内で指定されてしまっているので(つまり、”初期化” スクリプトで定義された値を持ち込まないので)、”パラメータ” タブでは以下のように全くパラメータを設定していません。
このモデルを実行すると、当然ですが、以下のように元の Modelica モデルと結果が完全に一致します。
この Modelica コードは Force、Fixed、PositionSensor 等のコンポーネントを含んでしまっている上にポートが入力専用/出力専用という因果的なブロックになっているため、それを1つのコンポーネントとして他の Modelica コンポーネントと非因果的に接続して使うことはできません。ということで、これを前のモデルと同様に因果的に使えるようにするため改良することにします。
まずは不要なコンポーネントである Fixed_1(7行目)、PositionSensor(9行目)、Force(10行目)を削除します。次に、このコンポーネントのポートを入出力専用ではない通常のポートに変更します。これは 24行目と 25 行目を削除し、代わりに前のモデルでも実施したように
Modelica.Mechanics.Translational.Interfaces.Flange_a flange_a;
Modelica.Mechanics.Translational.Interfaces.Flange_b flange_b;
という文を挿入することでできます。この結果、ポートの名称は flange_a と flange_b に変わります。このポートの変更に合わせて connect 文を変更します。16 行目は
connect(Spring.flange_b,flange_b);
に、19 行目は削除し、20 行目は
connect(flange_a,Mass.flange_a);
に変更します。これらの変更により不要となった 28 行目と 29 行目も削除します。また、直接数値が代入されている質量(m)、バネ定数(c)、減衰(d)の値も “初期化” スクリプトで設定できるように M、K、B という変数名に置き換えます。最後に、あまり意味のない model の2重構造も解消させると以下のような Modelica コードになります。
これを組み込んだモデル(添付:SpringMass_MoCustom_Connectors.scm)を以下に示します。当然ながら、削除されたFixed コンポーネントと Force コンポーネントは外側に追加する必要があります。
結果は以下のように一致します。
また、この MoCustomComponent ブロックを直列につなげた以下のモデル(添付:SpringMass_MoCustom_Connectors_2DOF.scm)についても
結果は以下となり問題なく機能していることが分かります。
今回は、Modelica ユーザー定義ブロックを活用するためにバネマスモデルをあえて Modelica コードで表しましたが、バネ-マス-ダンパを1つのコンポーネントで表現するということはスーパーブロックを用いれば簡単に実現可能です。次回はこのスーパーブロックの使い方を紹介します。