Activate で Modelica を使ってみる(その2)- アクロス変数とスルー変数
Activate で Modelica を使ってみる(その2)
フロー変数/アクロス変数とセンサー
フロー変数とアクロス変数
今回は Modelica を使う場合に必須となる知識であるアクロス変数とスルー変数およびそれに関連する項目であるセンサーについて紹介します。
シグナルベースモデルではブロック間でやりとりされるデータは単なる数値であり物理的な意味は重要ではありません。例えば、出力する側は速度として出力していても、受け取る側で、極端な話ですが、それを電流として理解してもエラーにはなりません。それに対して Modelica では(正確には、Modelica 標準ライブラリでは)コンポーネント間で交換されるデータは明確に決められています。例えば、”その1” の回で使った力学系のライブラリである Mechanics-Translational ライブラリでは変位と力がコンポーネント間で交換される物理量として規定されています。
Modelica ではこの力学系での変位のことをアクロス変数、力のことをスルー変数と呼んでいます。前回説明したように、 Modelica では各コンポーネントの内部で複数の方程式が定義されていますが、コンポーネントが接続された場合は、アクロス変数に関しては接続されているコンポーネントのポートでの値が等置され、スルー変数に関しては合計がゼロになる、という式が加えられ、各コンポーネントから生成される方程式群を連立させることになります。
例えば、以下のように3つのコンポーネントが接続されている場合、
生成される式は、
アクロス変数:変位1=変位2=変位3
スルー変数:力1+力2+力3=0
となります。
また各コンポーネント内では必ずアクロス変数とスルー変数を関係づける方程式が定義されています。例えば、前回紹介したモデル内の Spring コンポーネントでは f=Kx、Damper では dx/dt=Bx 等です。
他のライブラリでのフロー変数とアクロス変数
現在、Activate では以下のように、
● Electrical(電気系)
● Mgnetic(磁気系)
● MultiBody(マルチボディ系)
● Rotational(回転機械系)
● Translational(並進機械系)
● FluidHeatFlow(熱流体系)
● HeatTransfer(伝熱系)
● HydraulicsByFluidon(油圧系)
という8つの物理コンポーネントの Modelica ライブラリ(最初の7つは Modelica 標準ライブラリに準拠、HydraulicsByFluidon ライブラリは Altair が開発)が提供されていますが、これらのライブラリにおいて定義されているフロー変数/アクロス変数は以下のようになっています。
センサー
センサーについては前回で少し説明しましたが、大体の場合、各ライブラリ内の Sensors ライブラリに含まれています。アクロス変数を検知するためのセンサーはポートが一つであり、それを検知したい場所に設置するということになります。また、スルー変数のためのセンサーについては、二つのポートをそれぞれ別のコンポーネントに接続して挟み込むような形で設置すれば、その二つのコンポーネント間でやり取りされるスルー変数を検知できることになります。例えば、前回のモデルで力と変位をそれぞれ検知する場合は以下のように設置します(添付:SpringMass_TwoSensors.scm)。
センサーの設置について注意が必要なのは Mechanics の MultiBody ライブラリと Electrical の MultiPhase ライブラリを使う場合です。MultiBody ライブラリのコンポーネントは、上のアクロス変数/スルー変数の表にも示したように、アクロス変数とスルー変数はそれぞれ自由度として 6 自由度を持っています。MultiBody ライブラリに含まれているセンサーは大体の場合この 6 自由度分を全部出力してしまうため、1 自由度しか扱えない FromModelica ブロックで処理ができません。そのため、どの自由度を FromModelica に出力するのかを事前に選択しておく必要があります。そのために用意されているのが VectorScalar ブロックです。
例えば、以下のモデル(添付:DoublePendulumMB.scm)は MiltiBody ライブラリのコンポーネントで構成される2重振り子のモデルです。2つの剛体の棒(ボディ)で構成されていて、最初のボディがグラウンドに回転ジョイントで結合されており、2つ目のボディは1つ目のボディの自由端にやはり回転ジョイントで結合されています。2つの回転ジョイントの回転軸が2つとも z 軸周りであると指定されているため、2つのボディは xy 平面内で運動することになります。設置されているセンサーは RelativePosition センサーで、グラウンドと2つ目のボディの自由端の相対変位(片方はグラウンドなので、結局のところ絶対変位なのですが)を出力しますが、ここでは VectorScalar ブロックを用いて x と y の2つの並進変位を出力しています。
VectorScalar ブロックでは以下のように出力すべき自由度を指定するだけです。
ここでは上側の VectorScalar で2(すなわち、y)を、下側で 1(x)を指定しています。この結果は以下のようになります。
詳しくは、後日 MultiBody ライブラリの紹介を行う際に再度説明する予定です。
同じく、Electrical-MultiPhase ライブラリも複数のアクロス変数/スルー変数が設定されています。MultiPhase ライブラリのコンポーネントは3相交流などを1つのポートで表現できるように複数の電流/電圧が定義できるようになっています。そのため、ここでもやはり出力の際には何番目の電流/電圧なのかをユーザー側が VectorScalar ブロックを用いて指定する必要があります。これについても後日、Electrical-MultiPhase ライブラリの紹介の際に詳しく説明しようと思います。
今回はアクロス変数とスルー変数について簡単に説明しました。この概念は非常に重要で、Modelica のプログラミングを行わない場合でもその理解が必要となる場合が多くあります。次回は、パラメータ値の変数化と初期値設定の方法について紹介します。“その1” の回ではバネ定数や質量などの各コンポーネントのブロックダイアログでのパラメータ値は直接数値を指定していましたが、それを変数化してまとめて指定することが可能です。そのための前処理機能とそれに関連する外部ファイルの読み込み方法を紹介します。