Wolfram Computation Meets Knowledge

再利用・設定可能モデル

継承置換可能クラス
継承されたコンポーネントの無効化クラスの再宣言の選択肢
置換可能コンポーネント構成コンポーネントの階層
コンポーネントの再宣言の選択肢

再利用可能性はモデルの保守に費やす時間が大幅に削減できる重要な特徴である.

既存のモデルを少しだけ変更したモデルを作りたいとする.これを行う最も明白な方法はモデルをコピーし,コピーしたそれぞれのモデルを変更することである.この方法は問題を解決する単純で分かりやすい方法であるが,一点だけ大きな不都合がある.それは保守性である.大部分が同一である複数のモデルにおいて,その同一部分に変更を加えるためには,複数のモデルにおいて複数の変更を行わなければならず,保守のコストと間違いを犯す危険性の増加に繋がる.

以下のサブセクションでは,Modelica言語の機能を利用してモデルの再利用可能性を高めることができるいくつかのケースについて説明し,System Modelerがどのようにこれらの機能に容易にアクセスできるかを示す.

Modelica言語の基本的な機能に関する背景については,条件付きコンポーネントの宣言再宣言を参照のこと.

継承

Modelicaはオブジェクト指向言語である.オブジェクト指向言語で最も重要なメカニズムは,継承と呼ばれる,クラス間の関係である.モデルがクラスであるModelicaでは,継承によって,あるモデルが別のモデルを拡張し,それを基盤にすることが可能である.この方法では,モデルは実質拡張したモデルのコピーに見えるが,どの情報も複製しない.あるモデルを拡張するモデルは派生クラスと見なされ,拡張されるモデルは基底クラスとなる.

同じ内容であるが異なるパラメータ値を持つモデル一式を作りたい場合は,Model Centerでモデルを作り,パラメータに妥当なデフォルト値を与える.これが基底クラスとなる.次に基底クラスを変化させたモデルを作る.このようなモデルはそのそれぞれが基底クラスを拡張する.各モデルを開き,変数ビューでパラメータ値を変更するとオーバーライドできる.

派生クラスが新たなコンポーネントや接続等を取り入れる必要がある場合は,Model Centerで派生クラスを開いて,コンポーネントを加えたり,他のあらゆるモデル等との接続を作成したりできる.新しいパラメータ,変数,方程式も加えられる.しかし,派生クラスに何かを加えることは可能であるが,基底クラスから継承したものを削除することはできない.これはコンポーネントが基底クラスで条件付きコンポーネントとして宣言されていない限り,コンポーネントにも当てはまる.

継承されたコンポーネントの無効化

基底モデルのコンポーネントを,基底クラスを拡張するクラスでは任意のものとしたい場合は,コンポーネントのプロパティダイアログでコンポーネントを条件付きコンポーネントにすることができる.条件付きコンポーネントの有効化条件はBoolean式であるので,文字通りのtrueまたはfalseの値を指定するのではなく,Booleanパラメータ名を基底クラスにも追加して指定することがもできる.

派生クラスは条件付きコンポーネントとBooleanパラメータの両方を継承する.派生クラスでは,変数ビューでBooleanパラメータの値を変更することによって,コンポーネントを有効化または無効化できる.無効化されたコンポーネントは,その修飾子およびそのコンポーネントに関係するすべての方程式とともに,ビルドとシミュレーションから除外される.シミュレーション側から見ると,除外されたコンポーネントと削除されたコンポーネントに違いはない.

モデルセンターのコンポーネントの無効化についての詳細は,ユーザガイドの「コンポーネントの無効化」を参照のこと.

置換可能コンポーネント

基底クラスのコンポーネントはすべて,クラスを拡張するときに継承される.派生クラスにおいて継承されたコンポーネントを別のコンポーネントに置き換えたい場合はどうすればよいのだろうか.これを行うためには,コンポーネントは基底クラスで置換可能にされている必要がある.置換可能プロパティはコンポーネントのプロパティダイアログで設定できる.基底クラスでコンポーネントを右クリックしてプロパティを選び,ダイアログの一般ビューにある置換可能コンポーネントチェックボックスがチェックされているようにする.

派生クラスで置換可能コンポーネントを右クリックし,コンポーネントの際宣言を選ぶと,そのコンポーネントが置換できる.もとのコンポーネントが置換できるタイプのすべてのコンポーネントがサブメニューにリストされる.合致するコンポーネントがない場合は,ダイアログが表示される.

置換可能コンポーネントと置換するコンポーネントは他のどれでもよい訳ではなく,タイプは置換可能コンポーネントの制約タイプのサブタイプでなければならない(デフォルトではコンポーネントの宣言タイプが制約タイプでもある).Modelicaでは,これはコンポーネントを(再宣言によって)置換するコンポーネントは,少なくとももとのコンポーネントが持つものをすべて含んでいなければならないということを意味する.その結果,特定のクラスを拡張するクラスはすべて,そのクラスのサブタイプとなる.

コンポーネントのタイプが変わっても,制約タイプが常に同じであるようにするために,置換可能コンポーネントに対して明示的な制約タイプが指定できる.

Modelica Standard Libraryにある他の多くのクラスによって拡張されたクラスの例として,Modelica.Electrical.Analog.Interfaces.OnePortが挙げられる.このようなコンポーネントを基底クラスに加え,それを置換可能にすると,それはタイプがOnePortを拡張するどのコンポーネントとも置換可能になる.これには抵抗,コイル,コンデンサ等,ライブラリの基本的な電気コンポーネントが数多く含まれる.

コンポーネントの再宣言の選択肢

前のセクションで示したように,置換可能コンポーネントの再宣言を開始すると,可能なコンポーネントの候補のリストが表示される.このリストは,合致するコンポーネントがたくさんある場合は非常に長くなり得るが,興味のあるものはいくつかだけということもある.リストに表示される候補の数を制限するために,再宣言の選択肢を作ることができる.これはコンポーネントのプロパティダイアログで行う.基底クラスのコンポーネントを右クリックし,プロパティを選ぶ.

ダイアログで選択肢ビューを選び,Choicesアノテーションのタイプを再宣言の選択肢:カスタマイズされた再宣言に設定する,選択肢セクションに現れたドロップダウンボックスには,すべての可能な候補が含まれている.必要な候補を選び,それぞれについて「選択肢の追加」をクリックすると,それらが選択肢として加えられる.各選択肢には説明を付けることも可能である.選択肢に説明が指定されている場合は,コンポーネントの再宣言時にクラス名ではなくその説明が表示される.

再宣言の選択肢が選択肢表に加えられたら,それをさらにカスタマイズし,例えば再宣言に修飾子を加えたりできる.修飾子はクラス名の後ろにカッコに入れて加えることができる.再宣言の選択肢を編集するためには,それをダブルクリックする.

コンポーネントを再宣言するときに候補を全く表示したくない場合は,「再宣言の選択肢」ドロップダウンボックスからNone オプションを選択する.オプションAll matchingは合致するすべての候補を表示し, choices アノテーションが存在しない場合はこれがSystem Modelerのデフォルト設定となる.

置換可能クラス

モデルに同じタイプの複数のコンポーネントがあり,それらのコンポーネントの一つのタイプを置換したら他のコンポーネントのタイプもすべて変更されるようにしたい場合は,置換可能クラスが便利である.

これを行う方法を理解するためには,例を使うのが最適である.まずTemplateという名前の空のモデルを作成する.Templateの中にもう1つ別のモデルを作り,名前をBasicElectricalOnePortとする.これはコンポーネントのデフォルトタイプにしたいモデルを拡張しなければならない.この例では,それはModelica.Electrical.Analog.Interfaces.OnePortである.最後にモデルを置換可能にする.これは新規クラスダイアログですべて行える.

モデル内の置換可能クラスはすべてモデルのパラメータとなる.パラメータの値は再宣言タイプである.Templateモデルに戻ると,変数ビューにパラメータが1つリストされているはずである.そのパラメータの名前はBasicElectricalOnePortで,これは先ほどTemplateモデル内で作った置換可能モデルであり,その値はModelica.Electrical.Analog.Interfaces.OnePortである.

タイプBasicElectricalOnePortのコンポーネントを,ドラッグアンドドロップを使って希望の数だけTemplateモデルに加える.変数ビューでBasicElectricalOnePortパラメータのドロップダウンメニューを開くと,すべてのコンポーネントのタイプが1回クリックするだけで変更できる.変数ビューにリストされる変数は,クラスウィンドウアイコンビューとダイアグラムビューの選択で決まる.BasicElectricalOnePortパラメータが表示されない場合は,コンポーネントが選択されていないことを確認する.

Templateモデルを拡張した新しいモデル,つまりそのモデルの派生クラスを作ることで,モデルを変化させたものが簡単に作成できる.各派生クラスはコンポーネントを継承し,そのタイプはBasicElectricalOnePortパラメータの値を変更することで変更できる.

置換可能モデル自体も継承され,継承されたモデルをクラスブラウザからダイアグラムビューにドラッグアンドドロップすることで,継承されたモデルのコンポーネントも派生クラスに加えられる.ここで,Template.ReplaceableModelではなく,継承されたモデルをドラッグアンドドロップするように注意されたい.つまり,派生クラスの名前がMyModelであるとすると,MyModel.extends Templateの中のモデルReplaceableModelをドラッグアンドドロップするということである.

クラスの再宣言の選択肢

前のセクションで示したように,置換可能クラスを再宣言する可能な候補のリストがドロップダウンボックスに表示される.このリストは,合致するクラスがたくさんある場合は非常に長くなり得るが,興味のあるものはいくつかだけということもある.リストに表示されるクラスの数を制限するために,再宣言の選択肢を作ることができる.これはクラスのプロパティダイアログで行う.クラスブラウザで置換可能クラスを右クリックし,プロパティを選ぶ.

ダイアログの選択肢ビューを選び,Choicesアノテーションのタイプを再宣言の選択肢:カスタマイズされた再宣言に設定する.選択肢セクションに現れたドロップダウンボックスには,すべての可能な候補が含まれている.必要な候補を選び,それぞれについて「選択肢の追加」をクリックすると,それらが選択肢として加えられる.各選択肢には説明を付けることも可能である.選択肢に説明が指定されている場合は,コンポーネントの再宣言時にクラス名ではなくその説明が表示される.

再宣言の選択肢が選択肢表に加えられたら,それをさらにカスタマイズし,例えば再宣言に修飾子を加えたりできる.修飾子はクラス名の後ろにカッコに入れて加えることができる.再宣言の選択肢を編集するためには,それをダブルクリックする.

クラスを再宣言するときに候補を全く表示したくない場合は,「再宣言の選択肢」ドロップダウンボックスからNoneオプションを選択する.オプションAll matchingは合致するすべての候補を表示し,choicesアノテーションが存在しない場合はこれがSystem Modelerのデフォルト設定となる.

構成コンポーネントの階層

パラメータ値の変更,パラメータを使ったコンポーネントの無効化,置換可能なコンポーネントとクラスの再宣言について述べてきたことはすべて,コンポーネントの階層構造にも当てはまる.コンポーネントブラウザを使ってモデルのコンポーネントの階層構造を展開したり,コンポーネントモードで視覚的にコンポーネントに踏み入れたりすることができる(詳細はユーザガイドのコンポーネントの階層の可視化を参照のこと).階層構造のどのレベルにおいても,コンポーネントを選択してそのパラメータを見たり編集したりできるだけでなく,それが置換可能の場合は再宣言もできる.置換可能クラスをコンポーネントの中で再宣言することも可能である.