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

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

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

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

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