GP-IBによるPCへの測定データ転送 (2006/08/21)

周波数領域の測定は,主にスペクトルアナライザAgilent 8564ECを用いますが,パソコンへのデータ転送にはGP-IBインターフェースを利用する必要があります.しかし,パソコンへ転送するためのGP-IBコントローラやそれを制御するソフトウェアは,ものによっては,合わせて十万円を越えることがあります.複数の測定機器を遠隔制御するには見合った価格になるかも知れませんが,今回はスペクトルアナライザの測定データの転送をしたいだけですので,そこまでの金額はかけられません.

GP-IBに関して取り扱っている掲示板などを見ていたら,GP-IBコントローラの製作キットが低価格でアクティブセルにて販売されていることが分かりました.さらに,Microsoft Visual Basicなどを用いて,このGP-IBキットを含めて各社のGPIBコントローラを共通のプログラムで記述できる共通化モジュールEasyGPIBがフリーで提供されていました.そこで,早速,GP-IBコントローラの製作キット"GP232+Uキット"(価格は約15,000円)を購入しました.また,購入することで最新のバージョンのEasyGPIBがダウンロードすることができるようになります.下の写真は,製作したGP-IBコントローラ"GP232"の写真です.

GP232

パソコンへのデータ転送のプログラムは,Microsoft Visual Basic 6.0を使用しました.プログラミングには,次の書籍を参考にしました.

すぐに役に立つVisual Basicを活用した計測制御入門, 熊谷秀樹 編著, 日刊工業新聞社
今回の Visual Basic のプロジェクトファイルをまとめたアーカイブです [8564EC データ転送プログラム].使用していただくのは自由ですが,説明書はつけていませんし,全くメンテを行っていませんので,注意して下さい.なお,このプログラムを動かすためには,EasyGPIB共通化モジュールが必要です.一番下にこのプログラムのソースを貼り付けておきます.

ここで,下の写真のスペクトルアナライザAgilent 8564ECの基準信号(300MHz, -10dBmの正弦信号)をパソコンに転送してみます.

Agilent 8564EC

データを転送するまでの操作は全てスペクトルアナライザ側で行います.ここでは,中心周波数を300MHz,周波数スパンを100MHz,参照レベルを0dBm,周波数分解能(RBW)を1MHzとしています.さて,作成したプログラムのバイナリ"8564ec_transfer.exe"を実行しますと,次のウィンドウが立ち上がります.

8564EC Data Transfer - 1

機器側のGP-IBアドレスを指定して(デフォルトは18),"Card Open"をクリックすれば,測定機器と接続できます.接続すると,次のように,GP-IBコントローラの情報が表示されます.

8564EC Data Transfer - 2

ここで,"データ保存"をクリックして,ファイル名を指定して保存すれば,CSV形式で測定データを保存できます.ここでは,"cal_output.csv"として保存しています.

8564EC Data Transfer - 3

下は,"cal_output.csv"をMicrosoft Office Excelにて,表示したものです.測定条件の後に,測定した周波数と電力のデータ列があります.

8564EC Data Transfer - 4

転送した測定データから作成したグラフは次の通りです.

Measurement Graph

8564ec_transfer のソースです.

Option Explicit
' 最大の測定ポイント番号 MAX_PT
'   測定ポイントの範囲は,0 - MAX_PT.
Private Const MAX_PT As Integer = 600
' フォームイニシャライズ処理
Private Sub Form_Initialize()
    Dim i As Integer
    ' 測定器のイニシャライズ
    For i = 0 To 30
        cmbEquipAddress.AddItem (i)
    Next i
    cmbEquipAddress.ListIndex = 18  ' 測定器アドレス 18
    ' エラープロパティのイニシャライズ
    txtErrorNumber.Text = eg.ErrorNumber
    txtErrorHold.Text = eg.ErrorHold
    txtLocalErrorNumber = eg.LocalErrorNumber
    ' Enabled のイニシャライズ
    Call CmdEnabledBeforeCardOpen
End Sub
' フォーム終了処理
Private Sub Form_Terminate()
    If cmdCardClose.Enabled Then
        eg.CardCLose
    End If
End Sub
' カードオープンクリックイベント
Private Sub cmdCardOpen_Click()
    Dim Addr As Integer
    Addr = Val(cmbEquipAddress.Text)
    ' カードオープン
    eg.CardOpen: Call ReadErrors
    If eg.ErrorNumber <> 0 Then Exit Sub
    ' 測定器アドレスのチェック
    If (Addr <= 0) Or (Addr > 30) Then
        MsgBox "8564ECのアドレス設定が正しくありません"
        Exit Sub
    End If
    ' 測定器アドレスの設定
    eg.ActiveAddress = Addr
    Call ReadErrors
    If eg.ErrorNumber <> 0 Then Exit Sub
    ' 測定器アドレスの表示
    txtCardAddress.Text = eg.ActiveAddress
    Call ReadErrors
    If eg.ErrorNumber <> 0 Then Exit Sub
    ' デリミタの設定と表示
    eg.Delimiter = eg.DELIMs.Eoi
    Call ReadErrors
    If eg.ErrorNumber <> 0 Then Exit Sub
    txtCardDelimiter.Text = eg.Delimiter
    Call ReadErrors
    If eg.ErrorNumber <> 0 Then Exit Sub
    ' タイムアウトの設定と表示
    eg.TimeOut = 5
    Call ReadErrors
    If eg.ErrorNumber <> 0 Then Exit Sub
    txtCardTimeout.Text = eg.TimeOut
    Call ReadErrors
    If eg.ErrorNumber <> 0 Then Exit Sub
    ' EasyGPIB バージョンの表示
    txtCardVersion.Text = eg.Version
    Call ReadErrors
    If eg.ErrorNumber <> 0 Then Exit Sub
    ' 正常終了
    Call CmdEnabledAfterCardOpen
End Sub
' カードクローズクリックイベント
Private Sub cmdCardClose_Click()
    eg.CardCLose
    Call ReadErrors
    If eg.ErrorNumber <> 0 Then Exit Sub
    Call CmdEnabledBeforeCardOpen
End Sub
' データ保存クリックイベント
Private Sub cmdEquipSave_Click()
    Dim Fa As Double             ' 開始周波数 [Hz]
    Dim Fb As Double             ' 終了周波数 [Hz]
    Dim Rl As Double             ' 参照レベル [dBm]
    Dim Rb As Double             ' 分解能帯域幅 [Hz]
    Dim Vb As Double             ' ビデオ帯域幅 [Hz]

    Dim Freq(MAX_PT) As String   ' 測定周波数 [Hz]
    Dim Pwr() As String          ' パワー [dBm]
    Dim FileName As String       ' ファイル名
    Dim Ans As Integer           ' メッセージボックスの回答

    Dim i As Integer

    ' 初期化
    On Error Resume Next
    Call CmdEnabledInSave

    ' データの読み取り
    'eg.AsciiLine = "SNGLS; TS;"  ' シングルスイープ
    If eg.ErrorNumber <> 0 Then GoTo ErrHandler
    eg.AsciiLine = "FA?;": Fa = eg.AsciiLine
    eg.AsciiLine = "FB?;": Fb = eg.AsciiLine
    eg.AsciiLine = "RL?;": Rl = eg.AsciiLine
    eg.AsciiLine = "RB?;": Rb = eg.AsciiLine
    eg.AsciiLine = "VB?;": Vb = eg.AsciiLine
    If eg.ErrorNumber <> 0 Then GoTo ErrHandler
    eg.AsciiLine = "TDF P; TRA?;"
    If eg.ErrorNumber <> 0 Then GoTo ErrHandler
    Pwr() = Split(eg.AsciiLine, ",")
    If eg.ErrorNumber <> 0 Then GoTo ErrHandler
    For i = 0 To MAX_PT
        Freq(i) = Format(Fa + i * (Fb - Fa) / MAX_PT, "0.000000E+00")
    Next i

    ' ファイルへの保存
    With dialogEquipSave
        .CancelError = True
        .Filter = "CSVファイル(*.csv)|*.csv|" & "すべてのファイル(*.*)|*.*|"
        .FilterIndex = 1
        .DefaultExt = "csv"
        .ShowSave
        FileName = .FileName
    End With
    If Err.Number = cdlCancel Then GoTo ErrHandler
    If Dir(FileName) <> "" Then Ans = MsgBox("上書きしますか?", vbYesNo, "確認")
    If Ans = vbNo Then GoTo ErrHandler
    Open FileName For Output As #1
        Print #1, "# Start Frequency: " & Format(Fa, "0.00E+00") & " Hz"
        Print #1, "# Stop Frequency: " & Format(Fb, "0.00E+00") & " Hz"
        Print #1, "# Reference Level: " & Format(Rl, "0.00") & " dBm"
        Print #1, "# Resolution Bandwidth: " & Format(Rb, "0.00E+00") & " Hz"
        Print #1, "# Video Bandwidth: " & Format(Vb, "0.00E+00") & " Hz"
        Print #1, "#1:Frequency [Hz] 2:Power [dBm]"
        For i = 0 To MAX_PT
            Print #1, Freq(i) & ", " & Pwr(i)
        Next i
    Close #1

    ' 正常終了
    Call CmdEnabledOutSave
    Exit Sub

ErrHandler:
    Call ReadErrors
    Call CmdEnabledOutSave
End Sub
' エラー更新クリックイベント
Private Sub cmdErrorReload_Click()
    Call ReadErrors
End Sub
' エラークリアクリックイベント
Private Sub cmdErrorClear_Click()
    eg.ErrorNumber = 0
    eg.ErrorHold = 0
    eg.LocalErrorNumber = 0
    Call ReadErrors
End Sub
' エラープロパティを読み出してテキストボックスに書き込む
Private Sub ReadErrors()
    txtErrorNumber.Text = eg.ErrorNumber
    txtErrorHold.Text = eg.ErrorHold
    txtErrorHoldText.Text = eg.ErrorHoldText
    txtLocalErrorNumber.Text = eg.LocalErrorNumber
    txtLocalErrorText.Text = eg.LocalErrorText
End Sub
' CardOpen 前の各コマンドの Enabled 属性
Private Sub CmdEnabledBeforeCardOpen()
    cmdCardOpen.Enabled = True
    cmdCardClose.Enabled = False
    cmdEquipSave.Enabled = False
    cmdErrorReload.Enabled = False
    cmdErrorClear.Enabled = False
End Sub
' CardOpen 後の各コマンドの Enabled 属性
Private Sub CmdEnabledAfterCardOpen()
    cmdCardOpen.Enabled = False
    cmdCardClose.Enabled = True
    cmdEquipSave.Enabled = True
    cmdErrorReload.Enabled = True
    cmdErrorClear.Enabled = True
End Sub
' データ保存中の Enabled 属性
Private Sub CmdEnabledInSave()
    cmdCardClose.Enabled = False
    cmdEquipSave.Enabled = False
    cmdErrorReload.Enabled = False
    cmdErrorClear.Enabled = False
End Sub
' データ保存後の Enabled 属性
Private Sub CmdEnabledOutSave()
    cmdCardClose.Enabled = True
    cmdEquipSave.Enabled = True
    cmdErrorReload.Enabled = True
    cmdErrorClear.Enabled = True
End Sub

梅原 大祐 / UMEHARA Daisuke umehara@kit.ac.jp
Last modified: Thu Jun 23 09:46:33 JST 2011
Total Access Count