- 2008年11月16日 14:20
- 研究
OMNeT++ & OverSim関連記事リスト(目次)はこちら
前回のエントリーで、OMNeT++のシミュレーションモデルは、複数のシンプルモジュールと、それらを組み合わして構築する複合モジュールによって構成される、ということを説明しました。
そして、シンプルモジュール・複合モジュールはNED言語という言語によって記述されたNEDファイルで定義(宣言)されるということについても説明しました。
今回のエントリーでは、シンプルモジュール・複合モジュールをNED言語で記述し、シミュレーションモデルを構築する方法を説明したいと思います。
シンプルモジュールの定義
例として、ExampleSimpleModuleというシンプルモジュールをNED言語によって記述する方法を紹介します。
// シンプルモジュールの宣言
simple ExampleSimpleModule
// パラメータの宣言
parameters:
address : string;
// Gateの宣言
gates:
in: In1;
out: Out1;
in: In2;
out: Out2;
endsimple
シンプルモジュールは「simple <シンプルモジュール名> ... endsimple」という構文によって宣言されます。
「simple」キーワードと「endsimple」キーワードの間に、そのシンプルモジュールが持つパラメータとGateの情報について記述します。
上の例では、「address」という名前の文字列型のパラメータを宣言しています。
今はこのパラメータに何も値がセットされていません。
パラメータへの値の設定は、シミュレーションの初期設定を行うためのファイルである.iniファイルで行います。
また、入力Gateとして「In1」「In2」、出力Gateとして「Out1」「Out2」を宣言しています。
Gateには入力用のものと出力用のものの二種類が存在し、それぞれ「in: <入力gate名>;」「out: <出力gate名>;」という構文によって宣言されます。
上の例では、ExampleSimpleModule_Aシンプルモジュールが他のモジュールから何らかのデータ(メッセージ)を受け取るために「In1」「In2」という入力Gateを宣言しています。
反対に、他のモジュールに何らかのデータを送信するために「Out1」「Out2」という出力Gateを宣言しています。
複合モジュールの定義
次に、先ほど定義したExampleSimpleModuleを複数組み合わせることで、ExampleCompoundModuleという複合モジュールを構築してみます。
複合モジュールもNED言語によって記述します。
// 複合モジュールの宣言
module ExampleCompoundModule
parameters:
// 中略
// 複合モジュールを構成する「サブモジュール」を宣言
submodules:
a: ExampleSimpleModule;
b: ExampleSimpleModule;
c: ExampleSimpleModule;
// サブモジュール間の接続関係の定義
connections:
a.In1 <-- b.Out1;
a.Out1 --> b.In1;
b.In2 <-- c.Out1;
b.Out2 --> c.In1;
c.In2 <-- a.Out2;
c.Out2 --> a.In2;
endmodule
複合モジュールは「module <複合モジュール名> ... endsimple」という構文によって宣言されます。
シンプルモジュールと同様に、「module」キーワードと「endmodule」キーワードの間に、その複合モジュールが持つパラメータとGateの情報、さらに複合モジュールを構成する「サブモジュール」間の接続関係について記述します。
複合モジュールは複数のサブモジュールによって構成されます。
サブモジュールとして、他のシンプルモジュールや複合モジュールを選択することが出来ます。
上の例では、サブモジュールとして、先ほど定義したExampleSimpleModuleシンプルモジュールを3つ用意しています。
ExampleSimpleModuleはオブジェクト指向でいう「クラス」のようなもので、そのインスタンスとして「a」「b」「c」という3つのサブモジュールを宣言した、という風に考えてもらえるとわかりやすいかと思います。
「<インスタンス名>: <モジュール名>」という構文でサブモジュールは宣言されます。
サブモジュールを宣言したので、次はそれらの間の接続関係について記述しています。
接続関係は非常に直感的でわかりやすい方法で定義できます。
例えば「a.In1 <-- b.Out1」という記述は、サブモジュール「b」の出力Gate「Out1」からサブモジュール「a」の入力Gate「In1」向かう接続を定義しています。
「In1」や「Out1」といったGateは、先ほど行ったExampleSimpleModuleの定義の中で宣言したものです。
「connections:」以下の6行で記述したサブモジュール間の関係を図で示すと次のようになります。
(サブモジュール間の接続は双方向となっています。)

複合モジュールのインスタンスの生成
OMNeT++におけるシミュレーションモデルはすべて、複合モジュールのインスタンスです。
複合モジュールのインスタンスの生成もNED言語により行います。
先ほど定義したExampleCompoundModuleのインスタンスを生成するには、以下のように記述します。
network ecm : ExampleCompoundModule endmodule
上の例では、先ほど定義した複合モジュールである「ExampleCompondModule」のインスタンス「ecm」を宣言しています。
複合モジュールのインスタンスは「network <インスタンス名> : <複合モジュール名> endnetwork」という構文で宣言されます。
これでシミュレータにシミュレーションモデルの定義を知らせることが出来るようになります。
モジュールがデータを受け取った時の処理はどこで記述するの?
お気づきの方も多いと思いますが、今まで行ってきたシンプルモジュール・複合モジュールの定義の中で、実際に受け取ったデータをモジュールがどのように処理するかについては何も記述していません。
基本的にNED言語/NEDファイルは、シミュレーションモデルのトポロジ(構造)のみを定義するものです。
各モジュールの振る舞いや、モジュールのパラメータはまた別のところで定義しなければなりません。
OMNeT++では、各モジュールの振る舞いをC++コードで、モジュールのパラメータを.iniファイルで記述する必要があります。
それらの記述方法については後日紹介したいと思います。
まとめ
今回のエントリーでは、OMNeT++のシミュレーションモデルを構成する、シンプルモジュール・複合モジュールをNED言語で記述する方法について、大まかではありますが説明しました。
ちょっとエントリーが長くなってしまい、もしかしたら分かりづらい部分もあるかもしれません。
お気づきの点・わからない点などあればコメントでお知らせいただけると助かります!
参考文献
- Newer: [OMNeT++]シミュレーションプログラムのビルド
- Older: [OMNeT++]OMNeTのシミュレーションモデル
Comments:0
Trackbacks:0
- TrackBack URL for this entry
- http://www.kadoppe.net/mt/mt-tb.cgi/237
- Listed below are links to weblogs that reference
- [OMNeT++]NED言語によるシミュレーションモデルの記述 from CreativeStyle
kadoppe