6章 再び要素モデルの作成
6.3 上位要素モデルからの受信データの取り扱いに関する補足事項
これまで作成してきた要素モデルは 入力パターンに応じて入力情報の取り扱いを変えてきました。
ところが、同一の入力パターンが 複数存在するとき(例:下図) それぞれの入力を個別に区別することができません。
河道モデルでは横からの入力(4入力)を区別できません
このため、複数の横からの入力が存在するとき、その入力が河道モデルの何番目のセルに入力されるか等を設定できません。
このような状況に対処するため、CommonMPのプロパティ設定画面では、各入力に対してそれぞれの入力が河道モデルの何番目のセルに入力するか等を外部ファイルを読み込むことで設定することができます。
例えば、下図の左岸からの接続に対して、伝送線路に接続先を規定したファイルを読み込ませる事で、河道の何番目のセルにその入力を入れればよいかを知ることができます。
当然の事ながら、入力側では、それに対応した処理の実装が必要です。
接続状態設定ファイルの読み込み画面
本章では、入力の設定に対応した要素モデルの実装方法と、外部ファイルの記述方法について勉強します。
(1)
2次元受信情報を内部の1次元情報に展開する例
先ずは、対応を設定する外部ファイルの記述方法について述べます。
受信する伝送データはセルの配列で与えられます。 受信要素も出る側は、受信したどのセルをどのように使用するかを 外部ファイルの設定値の値を参考に決定します。(その様に処理を実装します)
設定する外部ファイルの例を示します。
下の図のように、上位と下位の要素モデルが2次元の伝送データで接続されているとします。
上位要素モデルから送られてきた伝送データ(7×3の2次元配列)の (1,0)、および(3,2)番目のセルがそれぞれ、下位要素モデルの7番目と5番目に入力される場合、この伝送線路に設定される外部
XMLファイルは、下に示すようなコードとなります。
外部接続
XMLファイル
<?xml version="1.0"
encoding="UTF-8"?> <CellIDMngFile> <CellManageTable Kind="McModelCellCorrespondenceInf" FileName="ParameterData\SampleCellCorrespondence.xml"> <TranCell IdxD1="0"> <UpperModelCell IdxD1="1" IdxD2="0"/> <LowerModelCell IdxD1="7"/> </TranCell> <TranCell IdxD1="1"> <UpperModelCell IdxD1="3" IdxD2="2" /> <LowerModelCell IdxD1="5"/> </TranCell> </CellManageTable> </CellIDMngFile> |
(注意) McModelCellCorrespondenceInf は 中継情報を規定するクラス名です。(Ver1.3現在)
また、FileNameは、外部ファイル名称をプロジェクトグループからの相対位置で記述します。(本例では、プロジェクトグループのホーム位置は \CommonMP\CommonMPData\MyExerciseStep1 なので、その中にあるフォルダー「ParameterData」下の SampleCellCorrespondence.xml が外部ファイルであることを示しています。) FileNameは、CommonMP CUI版動作時に使用する「構造定義ファイル」の記述のために必要です。
上位からの伝送情報のうち、接続の中継を行うセルを <TranCell>
で規定します。 本例では、2箇所の接続が存在するため <TranCell IdxD1="0">
</TranCell> と <TranCell IdxD2="1">
</TranCell> を記述します。 <TranCell>
タグ内に 上位セルの位置と 下位セルの位置を記述するタグを挿入します。 <TranCell IdxD1="0">
</TranCell> の中継セルは 上位セル(1,0)から下位セル(7)の接続を指定するので、<UpperModelCell
IdxD1="1" IdxD2="0"/> <LowerModelCell
IdxD1="7"/> のタグを入れます。 同様に、 2番目の中継セル<TranCell IdxD1="1">
</TranCell> は 上位セル(3,2)から下位セル(5)の中継を行うため <UpperModelCell IdxD1="3"
IdxD2="2" /> <LowerModelCell
IdxD1="5"/> の記述を行います。 こうして作成した 接続状態を記述するXMLファイルを モデル構築時に接続線に設定します。
上位と下位要素モデルのセル対応を示した外部XMLファイルの設定
接続線上で外部ファイルを接続しても その情報を元に内部のセルへの入力値を設定するのは下位要素モデル側のプログラムです。
そこで、外部ファイルで設定した情報を下位側の要素モデルで利用する実装方法を、5章で作成したテスト用の要素モデル(DebugTestModel)を用いて説明します。
上位からの受信情報を取得するのは Calculate()メソッドです。 そこで、テストモデルでは、 Calculate()メソッド内に処理を実装します。
上位要素モデルと下位要素モデルのセル対応関係の情報を管理するクラスは McModelCellCorrespondenceInf.McCellIdxInf で、このクラスインスタンスは 受信接続線から取得できます。
接続線の GetCellIDData(
)
メソッドを用いて、設定された対応情報(McModelCellCorrespondenceInf)を取得します。 もしも外部ファイルが設定されていなければ、McModelCellCorrespondenceInf
は取得されず null が返ります。
外部ファイルが設定されていれば、取得されたMcModelCellCorrespondenceInf の
GetCellIdxInf( ) メソッドを用いて 接続セル(McModelCellCorrespondenceInf.McCellIdxInf
クラス)の情報を取得します。 接続セルは複数存在するため(例えば、上記 外部設定ファイル(SampleCellCorrespondence.xml)の場合には 接続セルは2個存在するので、 配列数は2個となります。(下のコーディングでは 引数 lIdxInfNumber
に 2が返ります。)
protected override long Calculate(long lInputDataNum, ref
McReceiveCellDataIF[]
csInputCellData) |
<?xml version="1.0"
encoding="UTF-8"?> <CellIDMngFile> <CellManageTable Kind="McModelCellCorrespondenceInf" FileName="ParameterData\Cell12Correspondence.xml"> <TranCell IdxD1="0"> <UpperModelCell IdxD1="7" /> <LowerModelCell IdxD1="1" IdxD2="0" /> </TranCell> <TranCell IdxD1="1"> <UpperModelCell IdxD1="5" /> <LowerModelCell IdxD1="3" IdxD2="2" /> </TranCell> </CellManageTable> </CellIDMngFile> |
ここで作成した要素モデル開発プロジェクト(Ex17_CommonMP.lzh)
ダウンロードしたら解凍して生成されたフォルダー「MyExerciseModel」を \CommonMP\Source\HYMCO\OptionImpl\ 下に置きます。
解凍して生成されたプロジェクト:MyExerciseModel.csproj を ディバッグ用ソリューションに追加し、スタートアッププロジェクト(TestModelDeveloperMainExp)の依存関係に追加します。 また、 解凍して生成された、「MyExerciseStep1」フォルダーを \CommonMP\CommonMPData\ 下に置きます。
初版:2013/09/12 |