• 検索結果がありません。

SRQ割り込みとポーリング処理

ドキュメント内 visual C++によるGP-IB入門書 (ページ 54-58)

第 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の発行,クリア,ステータス・バイトに関しては機器によって異なります。詳しくはお持ちの機 器のマニュアルをお読みください。

ドキュメント内 visual C++によるGP-IB入門書 (ページ 54-58)