文書番号 DSHEng4-09-39006-00 DSHEng4 - S15F13 レシピ生成要求メッセージ受信処理プログラミング 2009 年 9 月 (株)データマップ 目 次 1.はじめに ................................................................................. 2.処理の流れ ............................................................................... 3.S15F13 メッセージのデコードと情報の取得 ................................................... 3.1 S15F13 メッセージの構造 ............................................................. 3.2 情報格納構造体 TRCP_INFO, TRCP_PARA................................................. 3.3 デコード関数 ....................................................................... 3.4 生成情報取得プログラミング.......................................................... 4.S15F14 応答情報の設定と送信 ............................................................... 4.1 S15F14 メッセージの構造 ............................................................. 4.2 エラー応答情報格納構造体TRCP_ERR_INFO ................................................ 4.3 エラー情報設定関数とS15F14 送信関数 ................................................. 4.4 応答情報設定、S15F14 送信プログラミング ............................................. 1 2 3 3 4 5 5 6 6 6 7 8 1.はじめに レシピ・生成要求 S15F13 受信メッセージに対するユーザプログラム(APP)のプログラミングについて説 明します。 まず、APP の 1 次メッセージ受信方法については、つぎのドキュメントを参照ください。 アプリケーション開発メモ :文書番号 DSHEng4-09-39003-00 「 DSHEng4 における 1 次メッセージ受信のプログラミング 」 S15F13 は、ホストが、レシピ生成の実行を要求するためのメッセージです。 また、S15F13 は、装置から上位への送信も行われますが、ここでは受信処理についてだけ説明します。 DSHEng4 では、受信した S15F13 を構造体の中にデーコードしたり、S15F14 の応答情報を設定したりするた めの便利な関数が準備されています。 なお、プログラミング例では、DSHEng4 の関数についてクラス名の指定が省略されています。 1 2.処理の流れ DSHEng4 の処理と APP(アプリケーション)プログラムの関係の処理 START S15F13 は、DSHMSG 構造体で渡される。 Polling プログラムから トランザクション ID は TMSG_QUEUE_INFO 内に渡される。 受信 S15F13 メッセージが渡される。 DSHMSG, TMSG_QUEUE_INFO TRCP_INFO 内には、rcpspec(=rcpid)、レシピパラメータ 情報と ppbody 情報がデコードされ格納される。 DshDecodeS15F13()関数を使って レシピパラメータには、parameter name, parameter S15F13 を TRCP_INFO 構造体に デコードする。 value の情報が、フォーマット情報付きで格納される。 レシピ ID を DSHEng4 に登録します。 rcpspec を EngAllocTRCP_INFO()関数で登録し、 EngAllocTRCP_INFO() TRCP_INFO の情報を EngSetTRCP_INFO()関数で設定 EngSetTRCP_INFO() する。 必要な処理を行います。 装置への制御を行う。 (装置への転送など) S15F14 応答メッセージのための応答情報を 以上の処理の内容、結果によって TRCP_ERR_INFO 構造体に設定する。 応答情報を TRCP_ERR_INFO を 構造体内に設定する。 (1) rmack とエラー情報の数を設定 DshInitTRCP_ERR_INFO()関数で rmack とエラー情報の数 err_count を 設定する。 (2) エラー情報を設定する。 DshPutTRCP_ERR_PARA()関数を使っ errcode と errtext の対で設定する。 て err_count 数分だけエラー情報を設 定する。 DshResponseS15F14H()関数を使っ ユーザ作成 DLL 内の関数を使って送信する。 て S15F14 を送信する。 END 2 3.S15F13 メッセージのデコードと情報の取得 受信したメッセージを APP プログラムが処理しやすい形の情報にするために、S15F13 の情報を次の TRCP_INFO 構造体の中にデコードします。 3.1 S15F13 メッセージの構造 以下の通りです。 L,4 1. <dataid> 2. <rcpupd> 3. <rcppec> 4. L,m 1. L,2 1. <rcpattrid> 2. <rcpattrdata> 2. L,2 1. <rcpattrid > 2. <rcpattrdata> . m. L,2 1. <rcpattrid > 2. <rcpattrdata> 5. <rcpbody> 内が 1 組の属性情報です。 3 3.2 情報格納構造体 TRCP_INFO, TRCP_PARA 構造体の構成は C#言語の表現で次のようになります。 public struct TRCP_INFO { public int index; // info index public int state; // info state public IntPtr name; // name char * public IntPtr rcpspec; // rcpid char * public int para_count; // # of pparameter public IntPtr para_list; // parameter list TRCP_PARA** public IntPtr rcpbody; // recipe body char * } public struct TRCP_PARA { public public public public IntPtr rcpparnm; int par_fmt; int par_size; IntPtr rcpparval; // // // // para para para para name char * format array size value void * } (1)index は、DSHEng4 が管理するための情報管理インデクスです。 この値は、EngGetRcpInfo()関数でレシピ情報を取得した際にのみ与えられ、そのケースだけ有効です。 (2)state は、ユーザが定義する状態値であり、API 関数で設定、取得ができます。 EngSetRcpState(), EngGetRcpState(), EngSetRcpInfo, EngGetRcpInfo() (3)name は、レシピ情報の固有名前です。 変数情報定義ファイルで登録された場合は、定義ファイルで指定された名前になります。 それ以外でシステムに登録された際は、レシピ ID と同じ値が与えられます。 4 3.3 デコード関数 (1)S15F13 メッセージデコード関数 int DshDecodeS15F13( ref DSHMSG smsg, ref TRCP_INFO info ); smsg : Polling によって得られる SECSII メッセージの格納構造体,DSHMSG です。 info : 情報を格納したい構造体、TRCP_INFO です。 正常にデコードできた場合、=0 が返却され、失敗した場合には=(-1)が返却されます。 3.4 生成情報取得プログラミング TRCP_INFO が info 内に格納されていると仮定した場合、以下のようなプログラミングになります。 (1)レシピ ID 取得 string rcpid = Marshal.PtrToStringAnsi(info.rcpspec); (2)TRCP_PARA のポインタリストの取得 para_count > の条件で取得します。 IntPtr[] ptr_list = new IntPtr[info.para_count]; Marshal.Copy(info.para_list, p, 0, info.para_count); 以下 para_count 分のパラメータを取得します。 (3)TRCP_PARA 情報の取得 int ei; for ( i=0; i < info.para_count ){ i 番目を取得する。 TRCP_PARA pinfo = (TRCP_PARA)Marshal.PtrToStructure(ptr_list[i], typeof(TRCP_PARA)); } また、レシピ情報 TRCP_INFO を DSHEng4 内に登録するためには、次の関数を使用します。 int EngAllocRcpInfo( byte[] rcpid, ref int index ); int EngSetRcpInfo( ref TRCP_INFO info ); // TRCP_INFO の内容を設定(更新) または int EngSetRcpInfoX( int index, // RCPIDの登録 ref TRCP_INFO info ); 5 4.S15F14 応答情報の設定と送信 まず、応答情報を TRCP_ERR_INFO 構造体内に生成し、それをユーザ作成 DLL の中の応答送信関数を呼出し て S15F14 を送信します。 4.1 S15F14 メッセージの構造 次のようになります。 L,2 1. <rmack> 2. L,n 1. L,2 1. <errcode> 2. <errtext> . . n. L,2 1. <errcode> 2. <errtext> 4.2 エラー応答情報格納構造体 TRCP_ERR_INFO public struct TRCP_ERR_INFO { public int rmack; public int err_count; public IntPtr err_list; } err_countの数だけ、errcode, errtextが // U1 // # of err // error list TERR_INFO** errcode_listにエラー情報として格納されます。 6 4.3 エラー情報設定関数と S15F14 送信関数 以下の関数を使用します。 (1)TRCP_ERR_INFO 構造体内にエラー情報を設定する関数 ① 初期設定 int DshInitTRCP_ERR_INFO(ref TRCP_ERR_INFO erinfo, int rmack, int err_count); erinfo : エラー情報格納構造体 rmack : ack err_count: エラーパラメータ数(errtext, errcode) ② エラー情報の設定 ‒ 1 個のパラメータ(errtext, errcode)を設定 int DshPutTRCP_ERR_INFO(ref erinfo, err_code, err_text); erinfo : エラー情報格納構造体 errcode : errcode errtext : errtext 格納ポインタ (2)S15F14 送信関数 ‒ ユーザ作成 DLL ( DSHEngU.dll)の関数 ① 送信関数 int DshResponseS15F14( uint trid, ref TRCP_INFO info, ref TRCP_ERR_INFO erinfo); trid : ポーリング時に S15F13 取得時に渡されたトランザクション ID info : S15F13 情報格納構造体 erinfo : エラー情報格納構造体 本関数内で、erinfo 内に使用されたメモリを開放します。 7 4.4 応答情報設定、S15F14 送信プログラミング 例として、エラー情報が S15F13 で得られたパラメータ数分のエラーを設定し、応答する例を以下に示しま す。 int trid; // ここにトランザクション ID が格納されているものとする。 TRCP_INFO info; // ここに S15F13 情報が既に格納されているものとする。 TRCP_ERR_INFO erinfo = new TRCP_ERR_INFO(); rmack =0; // rmack err_count = info.para_count; // err_count を S15F13 に含まれるパラメータ数とする。(全パラメータ) DshInitTRCP_ERR_INFO(ref erinfo, rmack, err_count); // TRCP_ERR_INFO の初期化 if (err_count > 0) { for (int i = 0; i < err_count; i++) { byte[] err_text = user_lib.StringToByte("err_text-" + i.ToString()); errcode = i + 1; // errcode をパラメータの順位+1 とする。 DshPutTRCP_ERR_INFO (ref erinfo, pinfo.errtext, errcode); // i 番目のパラメータのエラー情報設定 } } ei = DshResponseS15F14(trid, ref info, ref erinfo); DshFreeTRCP_INFO(ref info); . 8 // DSHEng4U の関数で S15F14 を送信する。
© Copyright 2024 Paperzz