第 4 章 チュートリアル ( 高機能版 ActiveX コントロール ) 26
4.4 SRQ割り込みとポーリング処理
ボタンはこのように配置します
3. メンバ関数“OnSpoll”を作成します。「SP実行」ボタンにカーソルを合わせ、右クリック→
「ClassWizard」を選択します。「メッセージマップ」を選択し、以下のように設定した後、「関 数の追加」をクリックします。
プロジェクト GpibSpActvX
クラス名 CGpibSpActvXDlg オブジェクト IDC_SPOLL
メッセージ BN_CLICKED
「関数の追加」をクリックします
メンバ関数名を決定するダイアログボックスが表示されますので、“OnSpoll”になっていることを 確認し、「OK」をクリックします。
4. そのまま「コード編集」ボタンをクリックし、“OnSpoll”関数を実装します。以下のように コード(List 1-10)を記述してください。
(List 1-10:CGpibSpActvXDlgクラスのOnSpoll関数のコード)
void CGpibSpActvXDlg::OnSpoll() {
// TODO: この位置にコントロール通知ハンドラ用のコードを追加してください LONG lRet; // 関数の実行結果
CString szErrMsg; // エラーメッセージ
COleSafeArray saStbTbl; // ステータス・バイトを格納するための配列 LONG lStbTbl[2]={0,0}; // シリアル・ポーリングを行う機器数+1の配列
// (それぞれの要素を0で初期化)
LONG lStb; // ステータス・バイトを格納するバッファ LONG lElement[]={0}; // 要素を指定するための配列
LONG lLoop = 0; // シリアルポーリングを繰り返すためのループ用変数 BOOL bSrqFlag; // SRQ信号有効・無効を格納するための変数
char szSpStatus[256]; // シリアル・ポーリングステータス
// ステータス・バイトを格納するための1次元配列saRetを作成します saStbTbl.CreateOneDim(VT̲I4, 2, lStbTbl, 0);
while(lLoop < 10000){
// SRQ信号の有無を確認します bSrqFlag = m̲GpibHost.GetCheckSrq();
// SRQ信号が有効になった場合ループを抜けます if(bSrqFlag == TRUE) break;
lLoop++;
}
if(bSrqFlag == TRUE){ // SRQ信号有効時
lRet = m̲GpibHost.ExecSpoll(gszDevice, saStbTbl);
if (lRet != 0) {// シリアル・ポーリング失敗時
szErrMsg.Format("シリアル・ポーリングに失敗しました(%d)", lRet);
MessageBox(szErrMsg, "ポーリングエラー", MB̲ICONERROR);
}
else{ // シリアル・ポーリング成功時
saStbTbl.GetElement(lElement, &lStb); // 作成した配列の0番目の要素 //(取得したステータスバイト) // をlStbに格納します
sprintf(szSpStatus, "%Xh", lStb);
MessageBox(szSpStatus, "ステータス・バイト", MB̲ICONEXCLAMATION);
} }
else{// SRQ信号無効時
MessageBox("SRQ信号が無効です", "SRQ信号無効エラー", MB̲ICONERROR);
} }
以上でSRQ割り込みとポーリング処理のプロクラムは完成です。プログラムを実行後、機器からSRQ が発行された時に、「SP実行」ボタンをクリックすると、接続された機器に対しSRQ信号確認後シリ アル・ポーリングを行います。そして、得られたステータス・バイトをメッセージボックスに表示し ます。
実際にシリアル・ポーリングを行うために、機器からSRQを発行させる機能、およびSRQ信号をクリ アするコードを追加してみましょう。
5. 先程実装したメンバ関数“OnSpoll”を以下のように変更します。網掛けの部分を追加してくださ い。
(List 1-11:CGpibSpActvXDlgクラスのOnSpoll関数(変更後)のコード)
void CGpibSpActvXDlg::OnSpoll() {
// TODO: この位置にコントロール通知ハンドラ用のコードを追加してください LONG lRet; // 関数の実行結果
CString szErrMsg; // エラーメッセージ
COleSafeArray saStbTbl; // ステータス・バイトを格納するための配列 LONG lStbTbl[2]={0,0};// シリアル・ポーリングを行う機器数+1の配列
// (それぞれの要素を0で初期化)
LONG lStb; // ステータス・バイトを格納するバッファ LONG lElement[]={0}; // 要素を指定するための配列
LONG lLoop = 0; // シリアルポーリングを繰り返すためのループ用変数 BOOL bSrqFlag; // SRQ信号有効・無効を格納するための変数
char szSpStatus[256]; // シリアル・ポーリングステータス
// スタンダード・イベント・レジスタのBit0に1を立て、
// オペレーション完了をイネーブルにします
lRet = m̲GpibHost.MasterSend(gszDevice, COleVariant("*ese 1"), COleVariant((long)0, VT̲ERROR));
if(lRet != 0){
szErrMsg.Format("データ送信に失敗しました(%d)", lRet);
MessageBox(szErrMsg, "送信エラー", MB̲ICONERROR);
}
// ステータス・バイト・サマリ・レジスタのBit5に1を立て、
// スタンダード・イベントをイネーブルにします
lRet = m̲GpibHost.MasterSend(gszDevice, COleVariant("*sre 32"), COleVariant((long)0, VT̲ERROR));
if(lRet != 0){
szErrMsg.Format("データ送信に失敗しました(%d)", lRet);
MessageBox(szErrMsg, "送信エラー", MB̲ICONERROR);
}
// *OPCコマンドを実行してオペレーション完了を知らせます
lRet = m̲GpibHost.MasterSend(gszDevice, COleVariant("*OPC"), COleVariant((long)0, VT̲ERROR));
if(lRet != 0){
szErrMsg.Format("データ送信に失敗しました(%d)", lRet);
MessageBox(szErrMsg, "送信エラー", MB̲ICONERROR);
}
// ステータス・バイトを格納するための1次元配列saRetを作成します saStbTbl.CreateOneDim(VT̲I4, 2, lStbTbl, 0);
while(lLoop < 10000){
// SRQ信号の有無を確認します bSrqFlag = m̲GpibHost.GetCheckSrq();
// SRQ信号が有効になった場合ループを抜けます if(bSrqFlag == TRUE) break;
lLoop++;
}
if(bSrqFlag == TRUE){ // SRQ信号有効時
lRet = m̲GpibHost.ExecSpoll(gszDevice, saStbTbl);
if (lRet != 0) { // シリアル・ポーリング失敗時
szErrMsg.Format("シリアル・ポーリングに失敗しました(%d)", lRet);
MessageBox(szErrMsg, "ポーリングエラー", MB̲ICONERROR);
}
else{ // シリアル・ポーリング成功時
saStbTbl.GetElement(lElement, &lStb); // 作成した配列の0番目の要素 //(取得したステータスバイト)
// をlStbに格納します
sprintf(szSpStatus, "%Xh", lStb);
MessageBox(szSpStatus, "ステータス・バイト", MB̲ICONEXCLAMATION);
} }
else{// SRQ信号無効時
MessageBox("SRQ信号が無効です", "SRQ信号無効エラー", MB̲ICONERROR);
}
この網掛け部分でSRQの発行を行います
lRet = m̲GpibHost.MasterSend(gszDevice, COleVariant("*CLS"), COleVariant((long)0, VT̲ERROR));
if(lRet != 0){
szErrMsg.Format("データ送信に失敗しました(%d)", lRet);
MessageBox(szErrMsg, "送信エラー", MB̲ICONERROR);
}
// SRQ受信割り込みを無効化します m̲GpibHost.SetCheckSrq(FALSE);
}
それではプログラムを実行してみましょう。まず、機器に電源が入っていることを確認してくだ さい。「SP実行」ボタンを押すと、以下のようにメッセージボックスが出現し、“60h”(16進数で 60)というステータス・バイトが表示されました。
SRQの発行,クリア,ステータス・バイトに関しては機器によって異なります。詳しくはお持ちの機 器のマニュアルをお読みください。