第 5 章 チュートリアル(DLL編) 61
5.3 SRQ割り込みとポーリング処理
・メンバ変数名を決定するダイアログボックスが表示されますので、“OnSpoll”になっていること を確認して「OK」をクリックします。
・そのまま「コード編集」ボタンをクリックして、“OnSpoll”関数を実装します。以下のようにコー ド(List 2-11)を記述してください。
(List 2-11:CGpibSpDllDlgクラスのOnSpoll関数のコード)
void CGpibSpDllDlg::OnSpoll() {
// TODO: この位置にコントロール通知ハンドラ用のコードを追加してください INT nStbTbl[2]; // ステータス・バイト格納テーブル INT nStbAdrs[2]; // SRQ送出機器アドレス格納テーブル INT nSrqRet; // SRQ割り込み確認の実行結果 INT nSpRet; // シリアルポールの実行結果
INT lLoop = 0; // シリアルポーリングを繰り返すためのループ用変数 char SpStatus[256]; // シリアル・ポーリングステータス
CString szErrMsg; // エラーメッセージ
//‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑
// シリアルポーリングを行います
// SRQ割り込みの確認を行います while(lLoop < 10000){
// SRQ信号の有無を確認します
nSrqRet = PciGpibExCheckSrq(BoardNo);
// SRQ信号が有効になった場合ループを抜けます if(nSrqRet == GP‑IB̲SUCCESS) break;
lLoop++;
}
switch(nSrqRet){
case GP‑IB̲SUCCESS̲ACTIVE̲SRQ: // SRQ信号が有効な場合の処理 // シリアル・ポーリングを実行します
nSpRet = PciGpibExExecSpoll(BoardNo, gnDevAdrsTbl, nStbTbl, nStbAdrs);
if(nSpRet != GP‑IB̲SUCCESS){
szErrMsg.Format("シリアル・ポーリングに失敗しました(%d)", nSpRet);
MessageBox(szErrMsg, "ポーリングエラー", MB̲ICONERROR);
} else{
// シリアルポールで得たステータスバイトデータをエディットボックスに表示します sprintf(SpStatus, "%Xh", nStbTbl[0]);
MessageBox(SpStatus, "ステータス・バイト", MB̲ICONINFORMATION);
} break;
case GP‑IB̲SUCCESS̲NOT̲ACTIVE̲SRQ: // SRQ信号が無効な場合の処理 MessageBox("SRQ信号は無効です","SRQ信号無効エラー", MB̲ICONERROR);
break;
default: // エラーが発生した場合の処理
szErrMsg.Format("エラーが発生しました(%d)", nSrqRet);
MessageBox(szErrMsg,"SRQ信号確認エラー", MB̲ICONERROR);
break;
} }
以上でSRQ割り込みとポーリング処理のプログラムは完成です。プログラムを実行後、機器から SRQが発行された時に、「SP実行」ボタンをクリックすると、接続された機器に対しSRQ信号確 認後シリアル・ポーリングを行います。そして、得られたステータス・バイトをメッセージボッ クスに表示します。
次に、実際にシリアル・ポーリングを行うために、機器からSRQを発行させる機能,SRQ信号をク リアするコードを追加してみましょう。
4. SRQの発行とクリアの機能を追加します。
先程実装したメンバ関数“OnSpoll”に、(List 2-12)の網掛け部分を追加してください。
(List 2-12:CGpibSpDllクラスのOnSpoll関数(変更後)のコード)
void CGpibSpDllDlg::OnSpoll() {
// TODO: この位置にコントロール通知ハンドラ用のコードを追加してください INT nRet; // 関数の実行結果
INT nStbTbl[2]; // ステータス・バイト格納テーブル INT nStbAdrs[2]; // SRQ送出機器アドレス格納テーブル INT nSrqRet; // SRQ割り込み確認の実行結果 INT nSpRet; // シリアルポールの実行結果
INT lLoop = 0; // シリアルポーリングを繰り返すためのループ用変数 char SpStatus[256]; // シリアル・ポーリングステータス
char SendBuf[32]; // 送信コマンドを格納する変数 CString szErrMsg; // エラーメッセージ
//‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑
// SRQ信号の発行を行います
// スタンダード・イベント・レジスタのBit0に1を立て、オペレーション完了をイネーブルにします sprintf(SendBuf,"*ESE 1");
nRet = PciGpibExMastSendData(BoardNo, gnDevAdrsTbl, strlen(SendBuf), SendBuf, WM̲NULL);
if(nRet != GP‑IB̲SUCCESS){
szErrMsg.Format("データ送信に失敗しました(%d)", nRet);
MessageBox(szErrMsg, "送信エラー", MB̲ICONERROR);
}
// ステータス・バイト・サマリ・レジスタのBit5に1を立て、
//スタンダード・イベントをイネーブルにします sprintf(SendBuf,"*SRE 32");
nRet = PciGpibExMastSendData(BoardNo, gnDevAdrsTbl, strlen(SendBuf), SendBuf, WM̲NULL);
if(nRet != GP‑IB̲SUCCESS){
szErrMsg.Format("データ送信に失敗しました(%d)", nRet);
MessageBox(szErrMsg, "送信エラー", MB̲ICONERROR);
}
// *OPCコマンドを実行してオペレーション完了を知らせます sprintf(SendBuf,"*OPC");
nRet = PciGpibExMastSendData(BoardNo, gnDevAdrsTbl, strlen(SendBuf), SendBuf, WM̲NULL);
if(nRet != GP‑IB̲SUCCESS){
szErrMsg.Format("データ送信に失敗しました(%d)", nRet);
MessageBox(szErrMsg, "送信エラー", MB̲ICONERROR);
}
//‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑
// シリアルポーリングを行います
// SRQ割り込みの確認を行います while(lLoop < 10000){
// SRQ信号の有無を確認します
nSrqRet = PciGpibExCheckSrq(BoardNo);
// SRQ信号が有効になった場合ループを抜けます if(nSrqRet == GP‑IB̲SUCCESS) break;
lLoop++;
}
switch(nSrqRet){
case GP‑IB̲SUCCESS̲ACTIVE̲SRQ: // SRQ信号が有効な場合の処理 // シリアル・ポーリングを実行します
nSpRet = PciGpibExExecSpoll(BoardNo, gnDevAdrsTbl, nStbTbl, nStbAdrs);
if(nSpRet != GP‑IB̲SUCCESS){
szErrMsg.Format("シリアル・ポーリングに失敗しました(%d)", nSpRet);
MessageBox(szErrMsg, "ポーリングエラー", MB̲ICONERROR);
} else{
// シリアルポールで得たステータスバイトデータをエディットボックスに表示します sprintf(SpStatus, "%Xh", nStbTbl[0]);
MessageBox(SpStatus, "ステータス・バイト", MB̲ICONINFORMATION);
} break;
case GP‑IB̲SUCCESS̲NOT̲ACTIVE̲SRQ: // SRQ信号が無効な場合の処理 MessageBox("SRQ信号は無効です","SRQ信号無効エラー", MB̲ICONERROR);
break;
default: // エラーが発生した場合の処理
szErrMsg.Format("エラーが発生しました(%d)", nSrqRet);
MessageBox(szErrMsg,"SRQ信号確認エラー", MB̲ICONERROR);
break;
}
//‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑
// SRQ信号のクリアを行います
// GP‑IB機器のレジスタをクリアします sprintf(SendBuf,"*CLS");
nRet = PciGpibExMastSendData(BoardNo, gnDevAdrsTbl, strlen(SendBuf), SendBuf, WM̲NULL);
if(nRet != GP‑IB̲SUCCESS){
szErrMsg.Format("レジスタクリアに失敗しました(%d)", nRet);
MessageBox(szErrMsg, "レジスタクリアエラー", MB̲ICONERROR);
}
// SRQ信号をクリアします(PCI‑4301では必要ありません) nRet = PciGpibExClearSrq(BoardNo);
if(nRet != GP‑IB̲SUCCESS){
szErrMsg.Format("SRQクリアに失敗しました(%d)", nRet);
MessageBox(szErrMsg, "SRQクリアエラー", MB̲ICONERROR);
} }
それではプログラムを実行してみましょう。まず、機器に電源が入っていることを確認してくだ さい。「SP実行」ボタンを押すと、以下のようにメッセージボックスが出現し、“60h”(16進数で 60)というステータス・バイトが表示されました。
SRQの発行,クリア,ステータス・バイトに関しては機器によって異なります。詳しくはご使用の機 器のマニュアルを参照してください。