久方ぶりにEasy GPIBのお世話になった

 Rionの1/3オクターブバンドアナライザSA27の内部メモリからデータをGPIBで抜き出すのに久方ぶりにEasy GPIBのお世話になった。GPIBはメーカーごとに命令文の構文が違うのだけど、Easy GPIBがサポートしているメーカーのならbasファイルを入れ変えてしまえばプログラムは同じ構文で使える便利な代物だ。これがフリーで使えるのだから有りがたい。以前使った時は、ちょうどこれが世に公開された直後で非常にタイミングが良かった。多分、これが無ければ駄目だっただろう。以前はVB6で作ったが、今回はVBAで作った。基本的にはSA27内部の1000個分のデータをエクセルのセルに格納しているだけ。ストア間隔と周波数範囲を調べて時間軸と周波数軸も付け加えた。

以下はVBAのソース。環境応じてGPIBアドレスを変えてください。
Sub GetData()
Columns("A:AZ").Select
Selection.Clear
Dim oct(45) As Double
Dim oct_s As Integer
oct(0) = 0.8
oct(1) = 1
oct(2) = 1.25
oct(3) = 1.6
oct(4) = 2
oct(5) = 2.5
oct(6) = 3.15
oct(7) = 4
oct(8) = 5
oct(9) = 6.3
oct(10) = 8
oct(11) = 10
oct(12) = 12.5
oct(13) = 16
oct(14) = 20
oct(15) = 25
oct(16) = 31.5
oct(17) = 40
oct(18) = 50
oct(19) = 63
oct(20) = 80
oct(21) = 100
oct(22) = 125
oct(23) = 160
oct(24) = 200
oct(25) = 250
oct(26) = 315
oct(27) = 400
oct(28) = 500
oct(29) = 630
oct(30) = 800
oct(31) = 1000
oct(32) = 1250
oct(33) = 1600
oct(34) = 2000
oct(35) = 2500
oct(36) = 3160
oct(37) = 4000
oct(38) = 5000
oct(39) = 6300
oct(40) = 8000
oct(41) = 10000
oct(42) = 12500
oct(43) = 16000
oct(44) = 20000

Range("A1") = "Mass/ID"
Range("B1") = "time"

eg.CardOpen ' カードを開く
eg.ActiveAddress = 5 ' 対象アドレス

eg.AsciiLine = "DFR?" ' 周波数範囲を習得
Dim c As Integer
c = Val(eg.AsciiLine)

For i = 0 To 29
Cells(1, 4 + i) = oct(c + i)
Next i
Cells(1, 3) = "AP"
Cells(1, 34) = "AP(w)"

Dim s As String
Dim sample As Double
eg.AsciiLine = "RCL?" ' & i ' メモリ情報 ストア数,リコール状態,ストアされているデータの種類,ストア間隔,演算時間の単位
tmp = Split(eg.AsciiLine, ",")
Select Case Val(tmp(3))

Case 0 '1ms
sample = 1 / 1000

Case 1 '2ms
sample = 2 / 1000

Case 2 '5ms
sample = 5 / 1000

Case 3 '10ms
sample = 10 / 1000

Case 4 '20ms
sample = 20 / 1000

Case 5 '50ms
sample = 50 / 1000

Case 6 '0.1s
sample = 0.1

Case 7 '0.2s
sample = 0.2

Case 8 '0.5s
sample = 0.5

Case 9 '1s
sample = 1

Case 10 '2s
sample = 2

Case 11 '5s
sample = 5

Case 12 '10s
sample = 10

Case Else

End Select


Dim t As Double
t = sample
For i = 1 To tmp(0)
Rows(i + 1).Select
eg.AsciiLine = "ADR 0," & str(i) 'メモリのアドレス設定
eg.AsciiLine = "RCL 0," & str(i) 'メモリのアドレス設定
eg.AsciiLine = "ADR?" 'メモリのアドレス設定状態
Cells(i + 1, 1) = eg.AsciiLine
Cells(i + 1, 2) = t

eg.AsciiLine = "DOD?" ' 表示データをアスキーで習得
s = eg.AsciiLine
tmp2 = Split(s, ",")
For j = 0 To 31
Cells(i + 1, 3 + j) = tmp2(j)
Next j

t = t + sample
Next i

eg.CardCLose ' カードを閉じる
End Sub