(前頁)<<      >>(次頁)          (Up)

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> 
        サンプルxmlファイル:SampleCellCorrespondence.xml

 XMLファイルのルートタグは<CellDMngFile> で、その下に接続形式を示す<CellManageTable>が続きます。 接続形式は1種類のみ(Ver1.3現在)で、必ず Kind="McModelCellCorrespondenceInf" と指定します。 

(注意) 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)
{

            McModelCellCorrespondenceInf  csCellMng = null; // 上流/下流セル対応表
            long lIdxInfNumber = -1; // 接続セル数
            McModelCellCorrespondenceInf.McCellIdxInf[ ]   csCellIdx = null; // 具体的対応関係

            for (long lLp = 0; lLp < lInputDataNum; lLp++)
            {   // 出力する伝送データ数分繰り返します。
                csCellMng = csInputCellData[lLp].GetCellIDData() as McModelCellCorrespondenceInf; // 対応表取得
                if (csCellMng != null)
                { // 対応表ありならば
                    csCellIdx = csCellMng.GetCellIdxInf( ref   lIdxInfNumber);  // 接続セルを取得



  接続セル(McModelCellCorrespondenceInf.McCellIdxInf クラス)には 上位要素モデルから送信されてきたセルの位置を示す情報と それに対応する下位要素モデルのセルの位置情報を格納するメンバー変数があります。 上記 外部設定ファイル(SampleCellCorrespondence.xml)の場合、1個目の接続セルの各メンバー変数には
 (上位からの配列位置)
      m_lUpperModelCellIndexDim1= 1
     m_lUpperModelCellIndexDim2= 0
      m_lUpperModelCellIndexDim3=-1
 (下位セル配列位置)
      m_lLowerModelCellIndexDim1=7
      m_lLowerModelCellIndexDim2=-1
      m_lLowerModelCellIndexDim3=-1
  が入ります。
 また、2番目の接続セルの各メンバー変数には
 (上位からの配列位置)
      m_lUpperModelCellIndexDim1= 3
     m_lUpperModelCellIndexDim2= 2
      m_lUpperModelCellIndexDim3=-1
 (下位セル配列位置)
      m_lLowerModelCellIndexDim1=5
      m_lLowerModelCellIndexDim2=-1
      m_lLowerModelCellIndexDim3=-1
  が入ります。

    
 
 実際に 下に示すモデルを作成し、下位側のモデルの受信情報を Microsoft Visual C# でトレースした結果を示します。

        
             テストモデル
    
     

       ディバッグトレースを行った結果
    
   
   2個の接続セルが存在しており、 2番目のセルには、
   (上位からの配列位置)
       m_lUpperModelCellIndexDim1= 3
      m_lUpperModelCellIndexDim2= 2
       m_lUpperModelCellIndexDim3=-1
   (下位セル配列位置)
       m_lLowerModelCellIndexDim1=5
       m_lLowerModelCellIndexDim2=-1
       m_lLowerModelCellIndexDim3=-1
 が設定されていることがわかります。



 (2) 1次元受信情報を内部の2次元情報に展開する例

 次の例として 上位要素モデルから1次元の情報を受信し そのうちの一部を下位要素モデルの2次元の情報に展開する例を示します。
 上位の(7)番目の受信情報から、下位の(1,0)番目のセルに、また、(5)番目から(3,2)番目のセルに入力したいときには 外部設定ファイルを下記のように定義します。

<?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>
       サンプルxmlファイル:Cell12Correspondence.xml

 
         
        テストモデル  

 実装は次元が変更となっても変わりません。 Microsoft Visual C# を用いてディバッグトレースを行うと、 接続セル(McModelCellCorrespondenceInf.McCellIdxInf クラス)には、上位(5)番目が下位要素モデルの(3,2)番目に対応するという情報が格納されています。 下位要素モデルは、この情報を元に、送信されてきた情報を自要素モデルに反映させます。





 次のページでは、先に作成したKinematicWave河道要素モデルに対して、横からの入力を設定できるように改造します。
 


 ここで作成した要素モデル開発プロジェクト(Ex17_CommonMP.lzh

 ダウンロードしたら解凍して生成されたフォルダー「MyExerciseModel」を \CommonMP\Source\HYMCO\OptionImpl\ 下に置きます。   
 解凍して生成されたプロジェクト:MyExerciseModel.csproj を ディバッグ用ソリューションに追加し、スタートアッププロジェクト(TestModelDeveloperMainExp)の依存関係に追加します。 また、 解凍して生成された、「MyExerciseStep1」フォルダーを \CommonMP\CommonMPData\ 下に置きます。



(前頁)<<      >>(次頁) 

初版:2013/09/12 |