第 4 章 チュートリアル ( 高機能版 ActiveX コントロール ) 26
4.5 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の発行,クリア,ステータス・バイトに関しては機器によって異なります。詳しくはお持ちの機 器のマニュアルをお読みください。
「関数の追加」をクリックします
3. 「メンバ関数の追加」ウィンドウのメンバ関数名を”OnSrqEvent”にし、「OK」ボタンをクリッ クしてください。
OnSrqEventとします
4. そのまま「コード編集」ボタンをクリックし、イベントが立ち上がった時に呼ばれる
“OnSrqEvent”関数を実装します。以下のようにコード(List1-12)を記述してください。
(List 1-12:CGpibEventActvXDlgクラスのOnSrqEventイベントのコード)
void CGpibSrqActvXDlg::OnSrqEvent() {
// TODO: この位置にコントロール通知ハンドラ用のコードを追加してください LONG lRet; // 関数の実行結果
CString szErrMsg; // エラーメッセージ
COleSafeArray saStbTbl; // ステータス・バイトを格納するための配列 LONG lStbTbl[2]={0,0}; // シリアル・ポーリングを行う機器数+1の配列
// (それぞれの要素を0で初期化)
LONG lStb; // ステータス・バイトを格納するバッファ LONG lElement[]={0}; // 要素を指定するための配列
char szSpStatus[256]; // シリアル・ポーリングステータス
// ステータス・バイトを格納するための1次元配列saRetを作成します saStbTbl.CreateOneDim(VT̲I4, 2, lStbTbl, 0);
lRet = m̲GpibHost.GetCheckSrq();
if(lRet == 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);
}
// レジスタをクリアします
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);
}
※ コード中の網掛け部分はSRQのクリアを行う部分ですので、機器によって異なります。
これでイベントが発生した場合に行われる処理の作成が完了しました。先ほどと同じように、実 際にイベントが立ち上がるか確認するためにSRQ信号を発行させる処理を加えてみましょう。
5. コントロールからボタンを選択し、ダイアログボックスに貼り付けます。ダイアログボックス に貼り付けた後にボタンにカーソルを合わせ、右クリック→「プロパティ」を選択し、以下の ように設定します。
ID IDC_ACTION
キャプション 動作実行
6. メンバ関数“OnActionl”を作成します。「動作実行」ボタンにカーソルを合わせ、右クリック→
「ClassWizard」を選択します。「メッセージマップ」を選択し、以下のように設定した後、「関 数の追加」をクリックします。
プロジェクト GpibEventActvX クラス名 CGpibEventActvXDlg オブジェクト IDC_ACTION メッセージ BN_CLICKED
メンバ関数名を決定するダイアログボックスが表示されますので、“OnAction”になっているこ とを確認し、「OK」をクリックします。
7. そのまま「コード編集」ボタンをクリックし、“OnAction”関数を実装します。以下のように コード(List1-13)を記述してください。
(List 1-13:CGpibSpActvXDlgクラスのOnAction関数のコード)
void CGpibEventActvXDlg::OnAction() {
// TODO: この位置にコントロール通知ハンドラ用のコードを追加してください LONG lRet; // 関数の実行結果
CString szErrMsg; // エラーメッセージ
// スタンダード・イベント・レジスタの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);
} }
※ このコード中はSRQの発行を行う部分ですので、機器によって異なります。
それでは、機器の電源が入っていることを確認してプログラムを実行してください。「動作実行」
ボタンを押すと、SRQ信号が発行され、イベントが立ち上がります。イベント内で、シリアル・
ポーリングを行っていますので、先程と同じように以下のようなメッセージボックスが表示され ます。
では、これより使用したメソッド、プロパティについて説明します。
(List 1-10)ではまず、SRQ信号が有効か無効かを判断しています。SRQ信号の有無はCheckSrqプロ パティで行います。(List 1-10)ではSRQ信号の情報を取得し、(List 1-11)ではプロパティの値を設定 しています。
「使用例」
・ 情報を取得する場合
lRet = m_GpibHost.GetCheckSrq ( );
・ 設定する場合
m_GpibHost.SetCheckSrq (FALSE);
プロパティの値(TRUE/FALSE)が格納されます。
SRQ受信割り込みの有効(TRUE)/無効(FALSE)を 設定します。
このプロパティは、コントローラがSRQを受信するとTRUEになります。FALSEになる条件は、コ ントローラがシリアル・ポーリングを実行するか、もしくは、上の使用例のようにCheckSrqプロ パティを、強制的にFALSEに設定した場合です。
何らかの要因でシリアル・ポーリングをしてもSRQ発信機器が検出できなかった場合、この
CheckSrqプロパティはクリア(FALSEに設定)されません。その場合は、プロパティの設定で、強制
的にFALSEにすることが可能です。
ただし、このCheckSrqを強制的にTRUEに設定することはできません。つまり、「このプロパティ
をTRUEに設定して機器からSRQを発行しよう」というような使い方はできません。機器からSRQ
信号が出された時に、はじめてこのプロパティがTRUEになります。
次に、シリアル・ポーリングですが、ExecSpollメソッドを使用します。
「使用例」
lRet = m_GpibHost.ExecSpoll(gszDevice, saStbTbl);
メソッド実行が失敗するとエラー コードが格納されます。
シリアル・ポーリングを行うGP-IB機器名(DeviceNameXx プロパティの値)を指定します。
取得したステータス・バイトを格納する配列変数を指定します。
第2引数には、必ずGP-IB機器の数+1の領域を持った配列変数を指定してください。各機器から得 られたステータスの次の配列要素に-1が格納されるためです。また、List 1-10のように、VARIANT 型から派生したクラスに宣言した配列も使用できます。
以上でSRQ割り込み発生時のポーリング処理,SRQイベント処理が行えるようになりました。実際 のシステム構築には、そのシステムの目的(仕様)にあわせ、これらの処理を組み合わせ、また、繰 り返し行うことになると思います。受信したデータを元に次の処理を行うであるとか、SRQを確 認後、コマンドの送信を行う等です。
本冊子では紹介しておりませんが、エラーイベント等を利用すると、いわゆる危機回避ロジック をシステム内に組み込むことが可能です。「機能をいかにうまく組み合わせて使うか」がシステ ム構築における信頼性向上の鍵となります。