第 4 章 チュートリアル ( 高機能版 ActiveX コントロール ) 26
4.3 データ送受信(非コントローラモード)
では、次にGP-IB I/Oモジュールが非コントローラモード時でのデータ送受信で使用するプログラ ムを作成します。使用するメソッド,プロパティ,イベントの詳細は巻末の高機能版ActiveXコント ロールリファレンスを参照してください。
ここで作成するデータ送受信(非コントロールモード)プログラムは、基本的にStep4で作成した データ送受信(コントロールモード)プログラムと作成手順は同じです。
1. Visual C++を起動し新しいプロジェクト(プロジェクト名:GpibTrans_s_ActvX)を作成し、環境設 定まで行います。(Step1,Step2を参照してください)
2. OnClose関数を追加し、OnInitDialog関数,OnClose関数にコードを記述します。OnInitDialog関数 には、(List 1-7)を記述し、OnClose関数には、(List 1-3)を記述します。(Step3を参照)
※ Step3の手順1にある「制御対象名の変数追加」は、行う必要ありません。
(List 1-7:CgpibTrans_s_ActvXDlgクラスのOnInitDialog関数のコード)
CGpibTrans̲m̲ActvXDlg::OnInitDialog() {
CDialog::OnInitDialog();
// TODO: 特別な初期化を行う時はこの場所に追加してください。
LONG lRet; // 関数の実行結果 CString szErrMsg; // エラーメッセージ
lRet = m̲GpibHost.Open();
if(lRet != 0){
szErrMsg.Format("初期化に失敗しました(%d)", lRet);
MessageBox(szErrMsg,"オープンエラー", MB̲ICONERROR);
exit(0);
}
// GP‑IB I/Oモジュールが、スレーブモードに設定されていることを確認します。
if (m̲GpibHost.GetIsMaster() != FALSE) {
MessageBox("GP‑IB I/Oモジュールが、スレーブモードに設定されていません。", "実行エラー", MB̲ICONERROR);
m̲GpibHost.Close();
exit(0);
}
return TRUE; // TRUE を返すとコントロールに設定したフォーカスは失われません。
}
この部分は、デフォルトのままです
ここから記述します
3. データ送受信(非コントローラモード)用のダイアログボックスを作成します。基本的にデータ 送受信(コントローラモード)と変わりはありません。Step4を参照に行ってください。
(変更点)
コントローラモード 非コントローラモード プロジェクト名 GpibTrans_m_ActvX GpibTrans_s_ActvX クラス名 CGpibTrans_m_ActvXDlg CGpibTrans_s_ActvXDlg
4. 作成したOnSend関数,OnRecv関数にそれぞれ(List 1-8),(List 1-9)のコードを記述します。
(List 1-8:CgpibTrans_s_ActvXDlgクラスのOnSend関数のコード)
void CGpibTrans̲s̲ActvXDlg::OnSend() {
// TODO: この位置にコントロール通知ハンドラ用のコードを追加してください LONG lRet; // 関数の実行結果
CString szErrMsg; // エラーメッセージ COleVariant vtData;
// SlaveSendメソッドを呼び出し、データを送信します。
// 第2引数を省略する(NULL終端までの文字列を送信する) UpdateData(TRUE); // 送信データをメンバ変数に格納 vtData = m̲szSendData; // データ代入
lRet = m̲GpibHost.SlaveSend(vtData, COleVariant((long)0, VT̲ERROR));// データ送信 if (lRet != 0) {
szErrMsg.Format("データ送信に失敗しました(%d)", lRet);
MessageBox(szErrMsg,"送信エラー", MB̲ICONERROR);
} }
(List 1-9:CgpibTrans_s_ActvXクラスのOnRecv関数のコード)
void CGpibTrans̲s̲ActvXDlg::OnRecv() {
// TODO: この位置にコントロール通知ハンドラ用のコードを追加してください LONG lRet; // 関数の実行結果
LONG lRecvSize; // 受信データサイズ CString szErrMsg; // エラーメッセージ
// I/Oモジュール番号0よりデータ受信を開始します
lRet = m̲GpibHost.SlaveReceive(&lRecvSize); // データ受信 if(lRet != 0){
szErrMsg.Format("データ受信に失敗しました(%d)",lRet);
MessageBox(szErrMsg,"受信エラー", MB̲ICONERROR);
} }
5. データ受信完了を通知するイベント(OnReceiveFinishGpc4304advancedctrl1イベント)に は、先ほどと同じコード(List 1-6)を記述します。
プログラムの入力が終わったら保存してください。
では、プログラムを実行してみます。先ほどのではなく、今度は図4-1の接続例2で行います。そ れぞれのコンピュータにPCI-4304を差し込みます。
次に、各I/Oモジュールの設定を行います。コントローラ/非コントローラは、どちらのI/Oモジュー ルがなっても構いません。それぞれの設定を行った方のI/Oモジュールがコントローラまたは、非 コントローラに設定されます。下図を参照に設定を行ってください。
・コントローラモードの設定
1.コントロールパネルの
「InterfacePCI GPIB」の設定
注)左図のように「I/Oモジュール番号」
はI/Oモジュール上にあるRSW1の番号 に、「動作モード」は MASTER に、「送 信(受信)デミリタ」を EOI に設定「し ます。
2.プロパティページの設定
(『データ送受信(コントローラモード)』
Step2参照)
3.「接続機器設定」の設定
(『データ送受信(非コントローラモード)』の Step2参照)
ここでの接続機器は、PCI-4304になります。デ バイス名を PCI-4304 に1次アドレスは、先 ほど設定したコントローラの設定値 0 と異な る値にします。
非コントローラモードの設定
1.コントロールパネルの「InterfacePCI GP-IB」の設定 注)左図のように「I/Oモジュール番号」はI/Oモジュール 上にあるRSW1の番号に、「動作モード」は“SLAVE”に、
「送信(受信)デミリタ」を“EOI”に設定「します。また、
「1次アドレス」は、コントローラの「接続機器設定」で
設定した値に設定します。
2.プロパティページの設定 (
『高機能版と標準版ActiveXコントロールの違い』のStep2 参照)
左図のように各設定を行います。
注)「マスタ/スレーブ」は、“スレーブ”に、「マイアドレス」
は、1次アドレスの値を設定します。
では、プログラムを動かしてみます。コントロール側で“GPC4304”と入力し、「送信」をクリッ クします。その後、非コントロール側で「受信」をクリックすると、“GPC4304”と受信データが 表示されます。
コントローラモード 非コントローラモード
「送信」をクリック 「受信」をクリック
次に非コントロール側で“GPC4304”と入力し、「送信」をクリックします。その後、コントロー ル側で「受信」をクリックすると、“GPC4304”と受信データが表示されます。
コントローラモード 非コントローラモード
「送信」をクリック
「受信」をクリック
List1-8のSlaveSendメソッド,List1-9のSlaveReciveメソッドの役割は、Step4のMasterSendメソッ ド,MasterReciveメソッドと同じです。
「使用例」
lRet = m_GpibHost.SlaveSend(vtData, COleVariant((long)0, VT_ERROR));
送信 す る デ ー タ を 指 定 します。
送 信 デ ー タ 長(バ イ ト 数)を指定します。
メソッド実行後の状態 が格納されます。
「使用例」
lRet = m_GpibHost.SlaveReceive(&lRecvSize);
メソッド実行後の状態が 格納されます。
データ受信完了時に受信バッファに格 納されている受信データのサイズを格 納する変数を指定します。