第 4 章 チュートリアル ( 高機能版 ActiveX コントロール ) 26
4.2 データ送受信(コントローラモード)
ここでは、GP-IB I/Oモジュールがコントローラモード時でのデータ送受信で使用するプログラム の作成を行います。使用するメソッド,プロパティ,イベントの詳細は『92ページ 6.3 高機能版 ActiveXコントロールリファレンス』を参照してください。
では、この高機能版ActiveXコントロールを使用したプログラムの作成を行ってみましょう。
Step1.メインウィンドウ作成
ここでは、これから作成するプログラムの画面作成を行います。
Visual C++を起動し新しいプロジェクトを作成します。
1. 「ファイル」メニューより「新規作成」を選択します。
2. 新規作成ダイアログが表示されますので、「プロジェクト」タブを選択します。
・MFC AppWizard(exe)を選択し、「プロジェクト名」に“GpibTrans_m_ActvX”と記入します。
・「位置」には作業するフォルダを指定してください。その後「OK」をクリックします。
MFC AppWizard(exe)を実行します フォルダを指定します プロジェクト名を書き込みます
3. 作成するアプリケーションの種類は「ダイアログベース」、リソースで使用する言語の指定は
「日本語」を選択し、「次へ」をクリックします。
ダイアログベースを選択します
4. ステップ2では「ActiveXコントロール」にチェックを入れクリック、ステップ3では「次へ」をク リック、ステップ4で「終了」をクリックします。
5. 新規プロジェクト情報というダイアログが表示されますので、「OK」をクリックしてください。
OKをクリックします
6. プロジェクトにGP-IB ActiveXコントロール(高機能版)を追加します。
「プロジェクト」→「プロジェクトへ追加」を選択し、「コンポーネントおよびコントロール」
を選択します。
「コンポーネントおよびコントロール」選択します
・「Registered ActiveX Controls」を選択し、「挿入」ボタンをクリックします。
「Registered ActiveX Controls」を選択します
「挿入」ボタンをクリックします
・表示されたコンポーネントから「Interface BPA-0515 GP-IB Advanced Control 1.1」を選択し、「挿 入」ボタンをクリックします。
クリックします Interface BPA-0515 GP-IB Advanced Control 1.1を選択します
・「OK」ボタンを押した後、クラスの確認画面でクラスの確認を行ってください。そして、「OK」
ボタンをクリックし、コンポーネントおよびコントロールギャラリ画面を閉じてください。こ れで、高機能版GP-IB ActiveXコントロールがプロジェクトに挿入されました。
クリックします
7. ResourceViewを表示し、Dialogフォルダを展開して「IDD_GP-IBTRANS_M_ACTVX_DIALOG」
をダブルクリックします。コントロール内にGP-IB ActiveXコントロール(高機能版)アイコンが 追加されていることが確認できます。
ダブルクリックします
ResourceViewを選択します
ActiveXコントロール(高機能版)
のアイコンが確認できます
8. ダイアログボックスの必要のないボタン,スタティックテキストを削除します。「OK」ボタン,
「キャンセル」ボタン,「TODO:ダイアログのコントロールをここに配置」というスタティック テキストをそれぞれ選択し、Deleteキーを押してください。
それぞれ選択してDeleteキーで削除します
9. コントロールからGP-IB ActiveXコントロール(高機能版)を選択し、ダイアログ上(ここでは右下 隅)に配置します。
ActiveXコントロール(高機能版)を貼り付けます
ここまでで、メインウィンドウの作成は完了です。
Step2.環境設定
ここでは、ActiveXコントロール(高機能版)のプロパティページにプログラムを実行させる環境を 定義し、オブジェクトの作成方法を記述します。
1. 高機能版ActiveXコントロールのプロパティページを開きます。さきほど貼り付けたActiveXコ ントロール(高機能版)のアイコンにカーソルを合わせ、右クリックし、プロパティを選択します。
プロパティの項目は2つ(1番下と下から4番目)ありますが、どちらを選択しても構いません。
どちらを選んでも構いません
2. 「I/Oモジュール初期設定」タブをクリックしI/Oモジュールの設定を行います。
各種設定を行います
デフォルトでは、以下のようになっています。
設定項目 内 容 初期値
I/Oモジュール番号 I/Oモジュール番号
マスタ/スレーブ* マスタ(コントローラモード),
スレーブ(非コントローラモード)の設定
マスタ
マイアドレス GP-IB I/Oモジュールの1次アドレス 0
2次アドレス GP-IB I/Oモジュールの2次アドレス 無し
データ入出力方式 データ出力方式の設定 FIFO データ転送モード 非同期データ転送設定 同期 送受信タイムアウト データ転送タイムアウト 30
STB応答時間 STB受信タイムアウトの時間設定 30
送信バッファサイズ 送信バッファサイズ 65536 受信バッファサイズ 受信バッファサイズ 65536 送信デリミタ* 送信デリミタ(非コントローラモード時) CRLF+EOI 受信デリミタ* 受信デリミタ(非コントローラモード時) CRLF+EOI
NRFD信号ライン待ち設定 GP-IBバス NRFD信号ライン待ち設定 無効
※ 「マスタ/スレーブ」,「送信デリミタ」,「受信デリミタ」の設定はコントロールパネルより
行います。「送信デリミタ」,「受信デリミタ」は使用する機器に合わせたものに設定してく
ださい
3. 「接続機器設定」タブをクリックし接続機器の設定を行います。プロパティページ下部に接続 する機器を設定し「追加」ボタンをクリックしてください。デバイス名は半角32文字以内で自 由に設定できます。(ここではデバイス名をHP34401Aに設定しています。)
4. 次に先程と同じようにActiveXコントロール(高機能版)アイコンを右クリックし、ClassWizard を選択します。
ClassWizardを選択します
5. 「メンバ変数タブ」をクリックし、以下の設定で、「変数の追加」ボタンをクリックします。
プロジェクト名 GpibTrans_m_ActvX クラス名 CGpibTrans_m_ActvXDlg
コントロールID IDC_BPA0515ADVANCEDCTRL1
クリックします
6. 「メンバ変数の追加」ウィンドウが表示されますので、以下の設定にし、「OK」ボタンをク リックしてください。
メンバ変数 m_GpibHost カテゴリ コントロール
変数のタイプ CGpibAdvnanced
クリックします
タイプとメンバを確認して「OK」ボタンをクリックしてください。これでオブジェクトが作成で きました。プログラム中ではm_GpibHost.“メソッド名”等と記述することでメソッドやプロパティ
Step3. 初期化処理と終了処理
GP-IB機器の制御を行う場合には、先にも記載したとおりI/Oモジュールの初期化,GP-IB機器の初 期化を行う必要があります。(『24ページ 3.6 GP-IB制御概略』を参照)
I/Oモジュールの初期化は、ActiveXコントロールのOpenメソッドにより行います。
次に、実際にデータ送受信を行うためにGP-IBの初期化を行います。ここでは、以下のGP-IB初期 化処理を行います。
・IFC(Interface Clear)信号の送出
・REN(Remote Enable)信号の送出
・DC(Device Clear)実行
それぞれの処理にはActiveXコントロールの以下のメソッドを使います。
IFC(Interface Clear)信号の送出 ⇒ SetIfcメソッド REN(Remote Enable)信号の送出 ⇒ SetRenメソッド
DC(Device Clear)実行 ⇒ ExecDeviceClearメソッド
また、GP-IB I/Oモジュールが、コントロール(マスタ)モードに設定されているかの確認も初期化 の中に加えています。
アプリケーションの終了時、もしくは処理の終了時に、I/Oモジュールに対して必ず終了処理を行 わなければなりません。終了処理は、ActiveXコントロールのCloseメソッドにより行います。
では、実際に初期化処理と終了処理のプログラムの作成を行います。
1. FileViewを表示し、SourceFileフォルダを展開してGpibTrans_m_ActvXDlg.cpp関数の最初の部分 に(List 1-1)を記述します。
(List 1-1:GpibTrans_m_ActvXDlg.cppのコード)
// GpibTrans̲m̲ActvXDlg.cpp : インプリメンテーション ファイル //
#include "stdafx.h"
#include "GpibTrans̲m̲ActvX.h"
#include "GpibTrans̲m̲ActvXDlg.h"
#ifdef ̲DEBUG
#define new DEBUG̲NEW
#undef THIS̲FILE
static char THIS̲FILE[] = ̲̲FILE̲̲;
#endif
CString gszDevice; // 制御対象のGP‑IB機器名 この部分を追加
2. メニューバーの「表示」を選択し、「ClassWizard」を開きます。
3. 「ClassWizard」の以下のように設定して、「関数の追加」をクリックします。
プロジェクト GpibTrans_m_ActvX クラス名 CGpibTrans_m_ActvX オブジェクト名 CGpibTrans_m_ActvXDlg メッセージ WM_CLOSE
「関数の追加」をクリックします
4. 以下のように、OnClose関数が追加されますので、「OK」をクリックします。
関数が追加される
5. ClassViewを表示し、CGpibTrans_m_ActvXDlgクラスを展開してOnInitDialog関数とOnClose関数 に、それぞれ(List 1-2),(List 1-3)のコードを記述します。
こ の ク ラ ス に コ ー ドを 追 加 しま す
(List 1-2:CGpibTrans_m_ActvXDlgクラスのOnInitDialog関数のコード)
CGpibTrans̲m̲ActvXDlg::OnInitDialog() {
CDialog::OnInitDialog();
// TODO: 特別な初期化を行う時はこの場所に追加してください。
LONG lRet; // 関数の実行結果 CString szErrMsg; // エラーメッセージ
// プロパティページの"接続機器設定"タブのNo.1に登録されている機器名を // グローバル変数gszDeviceに代入します。
gszDevice = m̲GpibHost.GetDeviceName1();
// GP‑IB I/Oモジュールのオープンを行います 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);
}
// IFC送出を行います lRet = m̲GpibHost.SetIfc();
if (lRet != 0) {
szErrMsg.Format("IFCの送出に失敗しました(%d)", lRet);
MessageBox(szErrMsg,"実行エラー", MB̲ICONERROR);
m̲GpibHost.Close();
exit(0);
}
// RENの設定を行います lRet = m̲GpibHost.SetRen();
if (lRet != 0) {
szErrMsg.Format("RENの設定に失敗しました(%d)", lRet);
MessageBox(szErrMsg,"実行エラー", MB̲ICONERROR);
m̲GpibHost.Close();
exit(0);
}
// デバイスクリアを行います
lRet = m̲GpibHost.ExecDeviceClear();
if (lRet != 0) {
szErrMsg.Format("デバイスクリアに失敗しました(%d)", lRet);
MessageBox(szErrMsg,"実行エラー", MB̲ICONERROR);
m̲GpibHost.Close();
exit(0);
}
return TRUE; // TRUE を返すとコントロールに設定したフォーカスは失われません。
}
(List 1-3:CgpibTrans_m_ActvXDlgクラスのOnClose関数のコード)
CGpibTrans̲m̲ActvXDlg::OnClose() {
// TODO: この位置にメッセージ ハンドラ用のコードを追加するかまたはデフォルトの処理を呼び出してく ださい
LONG lRet; // 関数の実行結果 CString szErrMsg; // エラーメッセージ
lRet = m̲GpibHost.Close();
if(lRet != 0){
szErrMsg.Format("終了処理に失敗しました(%d)",lRet);
MessageBox(szErrMsg,"クローズエラー", MB̲ICONERROR);
}
CDialog::OnClose();
}
プログラムの入力が終わったら保存してください。
この部分は、デフォルトのままです
ここから記述します
では、初期化と終了処理についての説明を行います。ここで使用したOnInitDailog関数は、ダイア ログボックスが表示される前に実行される関数であり、OnClose関数は、ウィンドウまたはアプリ ケーションが終了しなければならない時に実行される関数です。つまり、プログラムを実行しダ イアログが作成(表示)される前に初期化処理(OnInitDialog関数)を行い、ウィンドウが終了する時に 終了処理(OnClose関数)を行います。
『61ページ 第5章 チュートリアル(DLL編))』で作成するサンプルププログラムは、初期化と終 了処理をOnCreate関数とOnDestroy関数で行っています。
DLL関数の場合は、OnCreate関数,OnDestroy関数ではなくActiveXコントロール同様に、OnInitDialog 関数,OnClose関数で初期化,終了処理を行っても構いませんが、ActiveXコントロールでの初期化, 終了処理をOnCreate関数,OnClose関数で行うことはできません。なぜなら、ActiveXコントロール は、ダイアログに張り付いている状態にあります。ですから、ダイアログが表示(作成)される前に ActiveXコントロールのメソッド,プロパティを使用することができません。(下図参照)
……ウィンドウを作成します。
OnInitDialog実行 OnCreate実行 プログラム実行
ActiveXコントロールが有効になる。
……ダイアログを表示します。
OnClose実行 ……ダイアログを破棄します。
ActiveXコントロールが無効になる。
……ウィンドウを閉じます。
OnDestroy実行
初期化の項目は、最初に説明した「IFC信号の送出」「REN信号の送出」「デバイスクリア」に加 えて、GP-IB I/Oモジュールがマスタに設定されているかの確認も行っています。
「使用例」
(初期化処理)
lRet = m̲GpibHost.Open( ); // GP-IB I/Oモジュールオープン lRet = m̲GpibHost.GetIsMaster( ); // マスタ/スレーブの設定確認 lRet = m̲GpibHost.SetIfc( ); // IFC送出
lRet = m̲GpibHost.SetRen( ); // RENの設定 lRet = m̲GpibHost.ExecDeviceClear( ); // デバイスクリア
(終了処理)
lRet = m̲GpibHost.Close( ); // GP-IB I/Oモジュールクローズ IFC送出時間を設定します。
(100μ単位)