DSHEng4 - S15F13 レシピ生成要求メッセージ受信処理プログラミング

文書番号 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 を送信する。