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

データ送受信(コントローラモード)

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

第 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μ単位)

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