次に、部分モデル(partial model)を用いたモデル定義の再利用について説明する。Modelicaでは、この「部分モデル」と「継承」というオブジェクト指向プログラミングの概念を使って、モデル定義を効率化していく。電気系のコンポーネントは、ほとんどのものが、電気系の端子を2つ持っている。そこで、2端子の電気系モデルの部分モデルを以下のように定義する。
partial model OnePort "Component with two electrical pins p and n and current i from p to n" Pin p, n; SI.Voltage v "Voltage drop between the two pins (= p.v - n.v)"; SI.Current i "Current flowing from pin p to pin n"; equation v = p.v - n.v; 0 = p.i + n.i; i = p.i; end OnePort;
これは、電気系のコネクター“Pin”の2つの端子pとnを持ち、pとnの電位差vと、pから流れ込み、nから出ていく電流iの2つの変数が定義された部分モデル“OnePort”を表している。ここで、“partial”というキーワードは、このモデルが未完結の部分モデルであることを示している。partialなモデルは、後述するクラスの継承の概念を使って、不足している定義式を追加して完成された部品モデルを定義するためのベースとなる。また、フロー変数の符号については、コネクターから流れ込む方向を正とし、流出していく方向を負とするのが、Modelicaの慣例である。コネクターpの電位vは、“p.v”のように、要素名と変数名をピリオドでつないだ形式で表現する。
次に、部分モデル“OnePort”を使って、抵抗器の要素モデルを定義する。抵抗器のモデルは、その内部で成立するオームの法則を使って、以下のように定義される。
model Resistor "Ideal electrical resistor" extends OnePort; parameter SI.Resistance R(start=1)"Resistance "; equation R*i = v; end Resistor;
“extends”は、部分モデルを継承してモデルを拡張することを意味する。キーワード“parameter”は、ここで宣言されたResistance型の抵抗値を表す変数R(単位は“Ohm”)がシミュレーションの前後で値を変更可能であることを宣言している。(start=1)は、その初期値として「1」を使うことを意味する。そして、キーワード“equation”の下からキーワード“end”で指定されたモデル定義の最後までの部分(equationセクション)で、このコンポーネント内で成立する方程式を宣言する。
同様にして、キャパシターのモデルも以下のように定義できる。
model Capacitor "Ideal electrical capacitor" extends OnePort; parameter SI.Capacitance C(start=1) "Capacitance"; equation C*der(v) = i; end Capacitor;
Modelicaには、代表的な物理ドメインで使えるMSLが付属している。前回紹介した「OpenModelica」のグラフィカルエディタ「OMEdit」を起動したとき、MSLはクラス名“Modelica”のライブラリとして自動的にダウンロードされる。図3にMSLのうち、物理ドメインに関するものを示す。
図4に、並進機械系ライブラリ(Modelica.Mechanics.Translational)の構成を示す。大きく、Components(要素モデル)、Sensors(センサーモデル)、Sources(入力モデル)の3つから構成される。Componentsに用意されたさまざまな要素(マス、ばねなど)を用いて、対象製品、現象の基本モデルを作成する。基本モデルに加え、必要に応じて基本モデルへの入力(力、変位、加速度など)をSourcesで定義し、さらに基本モデルで観測したい要素の物理量(変位など)をSensorsで定義する。
Copyright © ITmedia, Inc. All Rights Reserved.