文書番号 DSHEng4-09-39007-00 DSHEng4 - S16F11 プロセスジョブ生成要求メッセージ受信処理プログラミング 2009 年 9 月 (株)データマップ 目 次 1.はじめに ................................................................................. 2.処理の流れ ............................................................................... 3.S16F11 メッセージのデコードと情報の取得 ................................................... 3.1 S16F11 メッセージの構造 ............................................................. 3.2 情報格納構造体 TPRJ_INFO............................................................ 3.3 デコード関数 ....................................................................... 3.4 生成情報取得とPRJ情報登録プログラミング............................................. 4.S16F12 応答情報の設定と送信 ............................................................... 4.1 S16F12 メッセージの構造 ............................................................. 4.2 エラー応答情報格納構造体TPRJ_ERR_INFO ................................................ 4.3 エラー情報設定関数とS16F12 送信関数 ................................................. 4.4 応答情報設定、S16F12 送信プログラミング ............................................. 1 2 3 3 5 6 6 7 7 7 8 9 1.はじめに プロセスジョブ生成要求 S16F11 受信メッセージに対するユーザプログラム(APP)のプログラミングにつ いて説明します。 まず、APP の 1 次メッセージ受信方法については、つぎのドキュメントを参照ください。 アプリケーション開発メモ :文書番号 DSHEng4-09-39003-00 「 DSHEng4 における 1 次メッセージ受信のプログラミング 」 S16F11 は、ホストが、プロセスジョブ生成の実行を要求するためのメッセージです。 DSHEng4 では、受信した S16F11 を構造体の中にデーコードしたり、S16F12 の応答情報を設定したりするた めの便利な関数が準備されています。 なお、プログラミング例では、DSHEng4 の関数についてクラス名の指定が省略されています。 1 2.処理の流れ DSHEng4 の処理と APP(アプリケーション)プログラムの関係の処理 START S16F11 は、DSHMSG 構造体で渡される。 Polling プログラムから トランザクション ID は TMSG_QUEUE_INFO 内に渡される。 受信 S16F11 メッセージが渡される。 DSHMSG, TMSG_QUEUE_INFO TPRJ_INFO 内には、 DshDecodeS16F11()関数を使って パラメータ情報がデコードされる。 S16F11 を TPRJ_INFO 構造体に パラメータ情報として、キャリアまたは基板情報、レシピ情報 デコードする。 などがある。 装置管理情報の更新、 PRJ 管 理 情 報 の 設 定 ( RCP, CARRIER, MATERIAL EngAllocPrjInfo() etc) EngSetPrjInfo() 関連装置状態変数も更新 装置に対しプロセスジョブ情報 装置への制御を行う。 を与える。 以上の処理の内容、結果によって S16F12 応答メッセージのための応答情報を 応答情報を TPRJ_ERR_INFO を TPRJ_ERR_INFO 構造体に設定する。 構造体内に設定する。 (1) acka とエラー情報の数を設定 DshInitTPRJ_ERR_INFO()関数で acka とエラー情報の数 err_count を設 定する。 DshPutTPRJ_ERR_PRJID()関数を使 (2) PRJID を設定する。 って err_count 数分だけエラー情報を 設定する。 DshPutTPRJ_ERR_INFO ()関数を使 (3)エラー情報を設定する。 って err_count 数分だけエラー情報を errcode と errtext の対で設定する。 設定する。 DshResponseS16F12H()関数を使っ ユーザ作成 DLL 内の関数を使って送信する。 て S16F12 を送信する。 END 2 3.S16F11 メッセージのデコードと情報の取得 受信したメッセージを APP プログラムが処理しやすい形の情報にするために、S16F11 の情報を次の TPRJ_INFO 構造体の中にデコードします。 3.1 S16F11 メッセージの構造 以下の通りです。 L,7 1. <dataid> 2. <prjobid > 3. <mf> 4a. L,n 1. L,2 1. <carrierid> 2. L, j 1. <slotid1> 2. <slotid2> 4a, 4b は mf の値によって決まる。 mf の指定がない場合、 4(a or b)は L,n が L,0 となる。 mf=13 の場合、4a が適用される。 デモプログラムでは、mf=13 を想定して 処理する。 . j. <slotidj> . . n. L,2 1. <carrierid> 2. L, j 1. <slotid1> 2. <slotid2> . j. <slotidj> 4b. L,n 1. <mid1> 2. <mid2> . j. <midj> 5. L,3 1. <prrecipemethod> 2. <rcpspec> 3. L,m 1.L,2 1. <rcpparnm1> 2. <rcpparval1> . m. L,2 1. <rcpparnmm> 2. <rcpparvalm 3 6. <prprocessstart> 7. <prpauseevent> 4 3.2 情報格納構造体 TPRJ_INFO 構造体の構成は C#言語の表現で次のようになります。 public struct TPRJ_INFO { public int index; public int state; public IntPtr prjobid; public int mf; public int cj_index; public int car_count; public IntPtr car_list; public int mid_count; public IntPtr mid_list; public int prrecipemethod; public IntPtr rcp_info; public int prprocessstart; public int ceid_count; public IntPtr pause_ceid_list; } // // // // // // // // // // // // // // info index info state prjob id char * material format code control job information index mf=13のケース # of carrier carrier id list TCAR_INFO** mf=14のケース # of mid MID list char ** fmt=51(8) U1 recipe info TRCP_INFO* fmt 11(8) Bool 1=auto,0=man # of pause ceid pause ceid list uint* (1)index は、DSHEng4 が管理するための情報管理インデクスです。 この値は、EngGetRcpInfo()関数でプロセスジョブ情報を取得した際にのみ与えられ、そのケースだけ有効で す。(S16F11 には含まれません) (2)state は、ユーザが定義する状態値であり、API 関数で設定、取得ができます。 EngSetRcpState(), EngGetRcpState(), EngSetRcpInfo, EngGetRcpInfo() (S16F11 には含まれません) (3)prjobid は、プロセスジョブ ID です。(本説明書では prjid とも表現しています。) (3)mf は、材料のフォーマットコードです。現仕様では値、13,14 についてのみサポートします。 13 = キャリア単位、14=基板単位での量の意味になります。 したがって、mf=13 のとき、car_count, car_list に情報がセットされ、mf=14 の場合、mid_count, mid_list に情報 が設定されます。 (4)cj_index は、対応する ControlJob 情報の Index 値ですが、これはユーザの便宜で使用可能です。 (S16F11 には含まれません。) (5)car_count は、キャリアの数です。car_list は、TCAR_INFO 構造体リストのポインタです。 TCAR_INFO 構造体内の carid, slot_count, slot_list にのみ情報の意味があります。 (6)mid_count は、マテリアル ID の数です。mid_list は MID(文字列名)のポインタの配列になります。 (7)prrecipemethod は、レシピの適用識別、prprocesstart は、自動/手動開始の識別、rcp_info は TRCP_INFO 構造体のポインタです。ここにレシピ ID とレシピパラメータ情報が格納されています。 (8)public int ceid_count、pause_ceid_list は一時停止時のためのイベンの数とイベント ID リスト です。 (注)16F11 と S16F15(Multi Create)と共通に使用するため prjid を複数個格納できるように なっています。 5 3.3 デコード関数 (1)S16F11 メッセージデコード関数 int DshDecodeS16F11( ref DSHMSG smsg, ref TPRJ_INFO info ); smsg : Polling によって得られる SECSII メッセージの格納構造体,DSHMSG です。 info : 情報を格納したい構造体、TPRJ_INFO です。 正常にデコードできた場合、=0 が返却され、失敗した場合には=(-1)が返却されます。 3.4 生成情報取得と PRJ 情報登録プログラミング TPRJ_INFO が info 内に格納されていると仮定した場合、以下のようなプログラミングになります。 (1)プロセスジョブ ID 取得 string prjid = Marshal.PtrToStringAnsi(info.prjobid); (2)mf (Material Format)の値による処理 if ( info->mf == dsh_info.MF_CARRIER ){ キャリアの処理(CarrierID とスロット ID) }else if ( info->mf == dsh_info.MF_MATERIAL ){ 基板の処理(MID) }else{ 無処理 } (3)TRCP_INFO 情報の取得 TRCP_INFO rcp_info = (TRCP_INFO)Marshal.PtrToStructure(info.rcp_info, typeof(TRCP_INFO)); また、プロセスジョブ情報 TOBJ_INFO を DSHEng4 内に登録するためには、次の関数を使用します。 int EngAllocPrjInfo( byte[] prjid, ref int index ); int EngSetPrjInfo( ref TPRJ_INFO info ); // TPRJ_INFO の内容を設定(更新) または int EngSetPrjInfoX( int index, // PRJIDの登録 ref TPRJ_INFO info ); 6 4.S16F12 応答情報の設定と送信 まず、応答情報を TPRJ_ERR_INFO 構造体内に生成し、それをユーザ作成 DLL の中の応答送信関数を呼出て S16F12 を送信します。 4.1 S16F12 メッセージの構造 次のようになります。 L,2 1. <prjobid> 2. L,2 1. acka 2. L,n L,2 1. <errcode> 2. <errtext> . . n. L,2 1. <errcode> 2. <errtext> 4.2 エラー応答情報格納構造体 TPRJ_ERR_INFO public struct TPRJ_ERR_INFO { public int prj_count; // # of prj public IntPtr prj_list; // prj list char ** public int acka; // Boolean public int err_count; // # of error public IntPtr err_list; // error list TERR_INFO** } err_countの数だけ、errcode, errtextが errcode_listにエラー情報として格納されます。 (注) 16F11 と S16F15(Multi Create)と共通に使用するため prjid を複数個格納できるように なっています。 7 4.3 エラー情報設定関数と S16F12 送信関数 以下の関数を使用します。 (1)TPRJ_ERR_INFO 構造体内にエラー情報を設定する関数 ① 初期設定 int DshInitTPRJ_ERR_INFO(ref TPRJ_ERR_INFO erinfo, int prj_count, int acka, int err_count); erinfo : エラー情報格納構造体 prj_count : PRJID の数 (S16F15 と互換のため) acka : ack err_count: エラーパラメータ数(errtext, errcode) ② 1 個の PRJID 設定(prj_count を設定します。 ) int DshPutTPRJ_ERR_PRJID(ref TPRJ_ERR_INFO errinfo, byte[] prjid); ③ エラー情報の設定 ‒ 1 個のパラメータ(errtext, errcode)を設定 int DshPutTPRJ_ERR_INFO(ref TPRJ_ERR_INFO erinfo, int err_code, byte[] err_text); erinfo : エラー情報格納構造体 errcode : errcode errtext : errtext 格納ポインタ (2)S16F12 送信関数 ‒ ユーザ作成 DLL ( DSHEngU.dll)の関数 ① 送信関数 int DshResponseS16F12( uint trid, ref TPRJ_INFO info, ref TPRJ_ERR_INFO erinfo); trid : ポーリング時に S16F11 取得時に渡されたトランザクション ID info : S16F11 情報格納構造体 erinfo : エラー情報格納構造体 本関数内で、erinfo 内に使用されたメモリを開放します。 8 4.4 応答情報設定、S16F12 送信プログラミング 例として、エラー情報が S16F11 で得られたパラメータ数分のエラーを設定し、応答する例を以下に示しま す。 int trid; // ここにトランザクション ID が格納されているものとする。 TPRJ_INFO info; // ここに S16F11 情報が既に格納されているものとする。 TPRJ_ERR_INFO erinfo = new TPRJ_ERR_INFO(); byte[] prjid = user_lib.PtrToByteArray(info.prjobid); // prjobid ==> prjid[] バイト配列にセット (注)参照 acka = 0; // acka err_count = 1; // err_count を仮に = 1 とする DshInitTPRJ_ERR_INFO(ref erinfo, 1, acka, err_count); // TPRJ_ERR_INFO の初期化 prjid=1 個 DshPutTPRJ_ERR_PRJID(ref erinfo, prjid); // prjid 1 個設定 if (err_count > 0) // error 情報を設定 { for (int i = 0; i < err_count; i++) { byte[] err_text = user_lib.StringToByte("err_text-" + i.ToString()); errcode = i + 1; // errcode をパラメータの順位+1 とする。 DshPutTPRJ_ERR_INFO (ref erinfo, pinfo.errtext, errcode); // i 番目のパラメータのエラー情報設定 } } ei = DshResponseS16F12(trid, ref info, ref erinfo); // DSHEng4U の関数で S16F12 を送信する。 DshFreeTPRJ_INFO(ref info); . (注) user_lib クラスは、デモプログラムに実装されているクラスで、データ変換などを行う ライブラリ関数が準備されています。 PtrToByteArray()は IntPtr が指す領域の文字列を byte[] に転送するための関数です。 9
© Copyright 2024 Paperzz