DSHEng4 - S16F11 プロセスジョブ生成要求メッセージ受信処理

文書番号 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