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を活用した計測制御入門, 熊谷秀樹 編著, 日刊工業新聞社, 2005年, ISBN: 4-526-05713-0

今回のデータ転送プログラムは Microsoft Visual Basic 6.0 を用いて作成しました.本プログラムは2006年当時の環境を対象としたものであり,現在は配布およびメンテナンスを行っていません.参考のため,当時のソースコードを一番下に掲載します.

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

Agilent 8564EC

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

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