3.2 GP-IB (Visual Basic) サンプルプログラム


・以下のサンプルプログラムは、National Instruments 社のGP-IB ボード(PC カードも含む)を使用した場合です。


[例1] セットコマンドの使用法


Private Sub Sample1_Click()
'*******************************************************************************
' GPIB SAMPLE PROGRAM NO.1
' セットコマンドの使用法
' 
' コマンドリストの<使用条件>を満足している状態において<コマンド>の書式通りに送信します。
'*******************************************************************************
    Adr = 5 'GP-IB Address = 5
    Call ibdev(0, Adr, 0, T1s, 1, 0, rec%)              'デバイスの初期化
    If (rec% < 0) Then
    MsgBox "Could not open device", 64, "ERROR"
    Call ibonl(rec%, 0)
    Exit Sub
    End If
    Call ibwrt(rec%, ":FUNCTION MEM")                   'メモリレコーダファンクションに設定
    Call ibwrt(rec%, ":CONFIGURE:TDIV +1.E-3")          'TIME/DIV 1msに設定
    Call ibwrt(rec%, ":CONFIGURE:SHOT 20")              '記録長を20DIVに設定
    Call ibwrt(rec%, ":TRIGGER:SOURCE OR")              'トリガソースOR
    Call ibwrt(rec%, ":TRIGGER:KIND CH1,LEVEL")         'レベルトリガCH1
    Call ibwrt(rec%, ":TRIGGER:PRETRIG 5")              'プリトリガ5%
    Call ibwrt(rec%, ":TRIGGER:LEVEL CH1,2")            'トリガレベル2V
    Call ibwrt(rec%, ":TRIGGER:SLOPE CH1,UP")           'トリガスロープUP
    Call ibwrt(rec%, ":TRIGGER:KIND CH2,OFF")           'CH2 OFF
    Call ibwrt(rec%, ":TRIGGER:KIND CH3,OFF")           'CH3 OFF
    Call ibwrt(rec%, ":TRIGGER:KIND CH4,OFF")           'CH4 OFF
    Call ibwrt(rec%, ":START") '実行処理
    Call ibonl(rec%, 0)                                 'オフライン
End Sub


[例2] クエリの使用法


Private Sub Sample2_Click()
'***************************************************************************
'  GPIB SAMPLE PROGRAM NO.2
'  クエリの使用法
'
' ・コマンドリストの<使用条件>を満足している状態において<クエリ>の書式通りに送信して、
'  出力準備させます。次に本体をトーカに指定して、出力データを受信します。
' ・<クエリ>によって出力準備されるデータは、コマンドリストの<応答>に記載されている形式となります。
'***************************************************************************
    Adr = 5 'GP-IB Address = 5
    Call ibdev(0, Adr, 0, T1s, 1, 0, rec%)                                      'デバイス初期化
    If (rec% < 0) Then
        MsgBox "Could not open device", 64, "ERROR"
        Call ibonl(rec%, 0)
        Exit Sub
    End If
    Call ibwrt(rec%, ":HEADER OFF")                                             'ヘッダをOFFにする
    Call ibwrt(rec%, ":FUNCTION?")                                              'ファンクションを問い合わせる
    rd$ = Space$(30)
    Call ibrd(rec%, rd$)
    Text1.Text = Left$(rd$, ibcnt% - 1)
    Call ibwrt(rec%, ":SYSTEM:TIME?")                                           '現在時刻を問い合わせる
    rd$ = Space$(30)
    Call ibrd(rec%, rd$)
    Text1.Text = Text1.Text & Chr$(13) & Chr$(10) & Left$(rd$, ibcnt% - 1)
    Call ibonl(rec%, 0)                                                         'オフライン
End Sub


[例3] サービス・リクエストの使用法


Private Sub Sample3_Click()
'***************************************************************************
' GPIB SAMPLE PROGRAM NO.3
' サービス・リクエストの使用法
'
'・*SRE、*ESEコマンドによって、本体のサービス・リクエスト応答イネーブル値を設定し、コント
'  ローラ側のサービス・リクエスト割り込み発生時におけるジャンプ先をセットしてからサービス・
'  リクエストの割り込みを許可します。
'・<クエリ>によって出力準備されるデータは、コマンドリストの<応答>に記載され
'  ている形式となります。
'***************************************************************************
    Adr = 5
    Call ibdev(0, Adr, 0, T10s, 1, 0, rec%)                                     'デバイスの初期化
    If (rec% < 0) Then
    MsgBox "Could not open device", 64, "ERROR"
    Call ibonl(rec%, 0)
    Exit Sub
    End If
    Call ibwrt(rec%, "HEADER OFF")                                              'ヘッダOFF
    Call ibwrt(rec%, "*SRE 32")                                                 'ステータスバイトのビット5(ESB)をイネーブル
    Call ibwrt(rec%, "*ESE 16")                                                 '実行エラー(EXE)をイネーブル
    Call ibwrt(rec%, "*CLS")                                                    'ステータスバイトのクリア
    Call ibwrt(rec%, ":FUNCTION MEM")                                           'メモリレコーダファンクションを設定
    For i = 1 To 16
    gra$ = ":DISPLAY:GRAPH CH1," + LTrim(Str$(i))
    Call ibwrt(rec%, gra$)
    Call ibwait(rec%, RQS Or TIMO)
    If (ibsta% And RQS) Then
    Call err_check                                                              'サービス・リクエストを受信した時のジャンプ先
    Exit Sub
    End If
    Next
    Call ibonl(rec%, 0)                                                         'オフライン
End Sub

Sub err_check(rec As Integer)
    Call ibrsp(rec%, spr%)                                                      'シリアルポール
    Call ibwrt(rec%, "*ESR?")
    rd$ = Space$(30)
    Call ibrd(rec%, rd$)
    b = Val(rd$)
    If (b And &H4) <> 0 Then Text1.Text = Text1.Text & Chr$(13) & Chr$(10) _
    & "Query Error!"                                                            'クエリエラー
    If (b And &H8) <> 0 Then Text1.Text = Text1.Text & Chr$(13) & Chr$(10) _
    & "Machine Error!"                                                          '機器に依存したエラー
    If (b And &H10) <> 0 Then Text1.Text = Text1.Text & Chr$(13) & Chr$(10) _
    & "Execute Error!"                                                          '実行エラー
    If (b And &H20) <> 0 Then Text1.Text = Text1.Text & Chr$(13) & Chr$(10) _
    & "Command Error!"                                                          'コマンドエラー
    Call ibonl(rec%, 0)
End Sub


[例4] ストレージデータの出力法


Private Sub Sample4_Click()
'***************************************************************************
' GPIB SAMPLE PROGRAM NO.4
' ストレージデータの出力法
'
' ・:MEMORY:MAXPOINT?クエリによって、ストレージデータが入出力可能であるかどうか調
'  べます。ストレージされていない状態では、MAXPOINT?による出力値が0となり、
'  データの出力はできません。
' ・出力したいデータのチャネルとポイントを:MEMORY:POINTコマンドによって指定します。デ
'   ータを入出力すると自動的にポイントが移動していきます。連続したデータを取込む
'   場合には、一度指定するだけで済みます。
' ・ASCII形式で取込む場合は、:MEMORY:ADATA?クエリ、電圧値形式の場合は、
'   :MEMORY:VDATA?クエリを使用します。
'   まとめて出力できるデータ数は:ADATA?で1〜80個、VDATA?で1〜40個ですがバ
'   ッファの容量により、個数制限されます。
' ・より多くのデータをまとめて出力させるほど、処理全体の時間は短くなります。
' ・記録長20DIVでストレージされているデータのCH1のデータ2000個を取り込みます。
'***************************************************************************
    Adr = 5
    Dim d(2000)
    Call ibdev(0, Adr, 0, T1s, 1, 0, rec%)              'デバイス初期化
    If (rec% < 0) Then
    MsgBox "Could not open device", 64, "ERROR"
    Call ibonl(rec%, 0)
    Exit Sub
    End If
    Call ibwrt(rec%, ":FUNCTION MEM")                   'メモリレコーダファンクションに設定
    Call ibwrt(rec%, ":CONFIGURE:SHOT 20")              '記録長20DIVに設定
    Call ibwrt(rec%, ":TRIGGER:MODE SINGLE")            'トリガモードをシングルに設定
    Call ibwrt(rec%, ":START;:STOP;*OPC?")              'スタート処理
    rd$ = Space$(30)
    Call ibrd(rec%, rd$)
    Call ibwrt(rec%, ":HEADER OFF")                     'ヘッダをOFF
    Call ibwrt(rec%, ":MEMORY:MAXPOINT?")               'ストレージデータ数を読み出す
    rd$ = Space$(30)
    Call ibrd(rec%, rd$)
    mx% = Val(rd$)
    If (mx% <> 2000) Then
        Call ibonl(rec%, 0)
        Exit Sub
    End If
    Call ibwrt(rec%, ":MEMORY:POINT CH1,0")             '出力データをCH1、ポイント0に設定
    For i = 0 To 2000
    Call ibwrt(rec%, ":MEMORY:VDATA? 1")                '測定データを取込む
    rd$ = Space$(30)
    Call ibrd(rec%, rd$)
    d(i) = Val(rd$)
    Next
    For i = 0 To 2000                                   'データ表示
        Text1.Text = d(i)
    Next
    Call ibonl(rec%, 0)                                 'オフライン
End Sub


[例5] ストレージデータの入力法


Private Sub Sample5_Click()
'***************************************************************************
' GPIB SAMPLE PROGRAM NO.5
' ストレージデータの入力法
'
' ・:MEMORY:PREPAREによって、ストレージメモリの準備をします。
' ・入力するデータのチャネルとポイントを:MEMORY:POINTコマンドによって指定します。
'   指定後、:MEMORY:ADATAコマンドによって入力します。
'
'***************************************************************************
    Adr = 5
    Call ibdev(0, Adr, 0, T10s, 1, 0, rec%)                                 'デバイス初期化
    If (rec% < 0) Then
    MsgBox "Could not open device", 64, "ERROR"
    Call ibonl(rec%, 0)
    Exit Sub
    End If
    Call ibwrt(rec%, ":FUNCTION MEM")                                       'メモリレコーダファンクションに設定
    Call ibwrt(rec%, ":CONFIGURE:SHOT 20")                                  '記録長20DIVに設定
    Call ibwrt(rec%, ":MEMORY:PREPARE")                                     'ストレージメモリの準備
    Call ibwait(rec%, TIMO) '待機
    Call ibwrt(rec%, ":MEMORY:POINT CH1,0")                                 '入力データをCH1、ポイント0に設定
    For i = 0 To 2000                                                       'SIN波のセット
        SND$ = ":MEMORY:ADATA " + LTrim(Str$(Int(500 * Sin(3.14 * i / 500))))
        Call ibwrt(rec%, SND$)
    Next
    Call ibonl(rec%, 0)                                                     'オフライン
End Sub


[例6] START 処理を実行させ、トリガが検出されない場合には、STOP 処理をする。


Private Sub Sample6_Click()
'***************************************************************************
' GPIB SAMPLE PROGRAM NO.6
' START処理を実行させ、トリガが検出されない場合には、STOP処理をする。
'
' ・シリアルポールによりステータスレジスタのビット5(ESB)を確認します。
' ・:ESR0?によりビット2(トリガ待ち終了)を確認、トリガが検出されない場合
'   :ABORTにより強制終了します。
' ・:ESR0?によりビット1(スタート処理終了)を確認し、終了します。
'
'***************************************************************************
    Adr = 5
    Call ibdev(0, Adr, 0, T1s, 1, 0, rec%)                  'デバイス初期化
    
    If (rec% < 0) Then
        MsgBox "Could not open device", 64, "ERROR"
        Call ibonl(rec%, 0)
        Exit Sub
    End If
    
    Call ibwrt(rec%, ":HEADER OFF")                         'ヘッダOFF
    Call ibwrt(rec%, "*CLS;*ESE 1")                         'SESERのOPC イネーブル
    Call ibwrt(rec%, ":FUNCTION MEM")                       'メモリレコーダファンクションに設定
    Call ibwrt(rec%, ":CONFIGURE:TDIV 1.E-3")               'TIME/DIV 1ms に設定
    Call ibwrt(rec%, ":CONFIGURE:SHOT 20")                  '記録長を20DIVに設定
    Call ibwrt(rec%, ":TRIGGER:SOURCE OR")
    Call ibwrt(rec%, ":TRIGGER:KIND CH1,LEVEL;KIND CH2,LEVEL")
    Call ibwrt(rec%, ":TRIGGER:KIND CH3,OFF;KIND CH4,OFF")
    Call ibwrt(rec%, ":TRIGGER:LEVEL CH1,0;SLOPE CH1,UP")
    Call ibwrt(rec%, ":TRIGGER:LEVEL CH2,0;SLOPE CH2,UP")
    Call ibwrt(rec%, ":TRIGGER:MODE SINGLE")
    Call ibwrt(rec%, ":START;*OPC")                         'スタート処理
    
    Do
        Call ibrsp(rec%, spr%)                              'シリアルポール
    Loop While ((spr% And &H20) = 0)
    
    Call ibwait(rec%, TIMO)
    Call ibwrt(rec%, ":ESR0?")
    rd$ = Space$(30)
    Call ibrd(rec%, rd$)
    esr0% = Val(rd$)
    
    If (esr0% And &H4) = 0 Then
        Call ibwrt(rec%, ":ABORT")
        Call ibonl(rec%, 0)
        MsgBox "NOT TRIGGER"
        Exit Sub
    End If
    
    Do While ((esr0% And &H2) = 0)                          'スタート処理が終了するまでループ
        Call ibwrt(rec%, ":ESR0?")
        rd$ = Space$(30)
        Call ibrd(rec%, rd$)
        esr0% = Val(rd$)
    Loop
    
    MsgBox "STORAGE END"
    Call ibonl(rec%, 0)                                     'オフライン
End Sub


[例7] 入力ユニットの有無を調べ、その入力レベルをディスプレイ上にモニタ表示させる。


Private Sub Sample7_Click()
'***************************************************************************
' GPIB SAMPLE PROGRAM NO.7
' 入力ユニットの有無を調べ、その入力レベルをディスプレイ上にモニタ表示させる。
'***************************************************************************
    Adr = 5
    Call ibdev(0, Adr, 0, T1s, 1, 0, rec%)              'デバイス初期化
    
    If (rec% < 0) Then
        MsgBox "Could not open device", 64, "ERROR"
        Call ibonl(rec%, 0)
        Exit Sub
    End If
    
    Call ibwrt(rec%, ":HEADER OFF")
    Call ibwrt(rec%, "*OPT?")                           'ユニットの問い合わせ
    rd$ = Space$(30)
    Call ibrd(rec%, rd$)
    ch1% = Val(Mid$(rd$, 1, 1))
    ch2% = Val(Mid$(rd$, 3, 1))
    ch3% = Val(Mid$(rd$, 5, 1))
    ch4% = Val(Mid$(rd$, 7, 1))
    Call ibwrt(rec%, ":MEMORY:GETREAL")                 'リアルタイムデータの取り込み
    
    If (ch1% <> 0) Then
        Call ibwrt(rec%, ":MEMORY:AREAL? CH1")          'リアルタイムデータ(CH1)の出力
        rd$ = Space$(30)
        Call ibrd(rec%, rd$)
        ch1_data$ = "CH1 = " & rd$
    Else
        ch1_data$ = "CH1 = NON"
    End If
    
    If (ch2% <> 0) Then
        Call ibwrt(rec%, ":MEMORY:AREAL? CH2")
        rd$ = Space$(30)
        Call ibrd(rec%, rd$)
        ch2_data$ = "CH2 = " & rd$
    Else
        ch2_data$ = "CH2 = NON"
    End If
    
    If (ch3% <> 0) Then
        Call ibwrt(rec%, ":MEMORY:AREAL? CH3")
        rd$ = Space$(30)
        Call ibrd(rec%, rd$)
        ch3_data$ = "CH3 = " & rd$
    Else
        ch3_data$ = "CH3 = NON"
    End If
    
    If (ch4% <> 0) Then
        Call ibwrt(rec%, ":MEMORY:AREAL? CH4")
        rd$ = Space$(30)
        Call ibrd(rec%, rd$)
        ch4_data$ = "CH4 = " & rd$
    Else
        ch4_data$ = "CH4 = NON"
    End If
    
    ret$ = Chr$(13) & Chr$(10)
    Text1.Text = ch1_data$ & ret$ & ch2_data$ & ret$ & ch3_data$ & ret$ & ch4_data$
    Call ibonl(rec%, 0)                                 'オフライン
End Sub


[例8] ストレージデータの出力法(バイナリデータ)


Private Sub Sample8_Click()
'***************************************************************************
' GPIB SAMPLE PROGRAM NO.8
' ストレージデータの出力法(バイナリデータ)
'
'・:MEMORY:MAXPOINT?クエリによって、ストレージデータが入出力可能であるか調べる。
'  ストレージされていない状態では、MAXPOINT?による出力値が0となり、データの出
'  力はできません。
'・出力したいデータのチャネルとポイントを:MEMORY:POINTコマンドによって指定します。
'  データを入出力すると自動的にポイントが移動していきます。
'  連続したデータを取込む場合には、一度指定するだけで済みます。
'・:MEMORY:BDATA?により得たバイナリデータを電圧値に変換して、画面上に出力し
'  ます。まとめて出力できるデータ数は、:BDATA?で1〜200個です。
'***************************************************************************
    Adr = 5
    Dim dat(512) As Byte
    Call ibdev(0, Adr, 0, T1s, 1, 0, rec%)                  'デバイス初期化
    
    If (rec% < 0) Then
        MsgBox "Could not open device", 64, "ERROR"
        Call ibonl(rec%, 0)
        Exit Sub
    End If
    
    Call ibwrt(rec%, ":HEADER OFF")
    Call ibwrt(rec%, ":MEMORY:MAXPOINT?")                   'ストレージデータを読み出す
    rd$ = Space$(30)
    Call ibrd(rec%, rd$)
    sp% = Val(rd$)
    
    If (sp% = 0) Then
        Call ibonl(rec%, 0)
        Exit Sub
    End If
    
    Call ibwrt(rec%, ":UNIT:RANGE? CH1")                    'レンジ確認
    rd$ = Space$(30)
    Call ibrd(rec%, rd$)
    rd$ = Left(rd$, ibcnt - 1)
    range# = Val(Mid(rd$, 5))
    Call ibwrt(rec%, ":MEMORY:POINT CH1,0")                 '出力データをCH1、ポイント0に設定
    Call ibwrt(rec%, ":MEMORY:BDATA? 200")                  'バイナリデータを取込む
    Call ibrd32(rec%, dat(0), 403)
    
    For i = 1 To 200
        a% = (dat(2 * i) And &H7) - (dat(2 * i) And &H8)    'バイナリデータを電圧値に変換
        b% = dat(2 * i + 1)
        c% = a% * 256 + b%
        d% = c% * range# / 160
        Text1.Text = Str$(d#)
    Next
    
    Call ibonl(rec%, 0)                                     'オフライン
End Sub


[例9] ストレージされているデータを、A ドライブへセーブする。(シーケンシャル・ファイル)


Private Sub Sample9_Click()
'***************************************************************************
' GPIB SAMPLE PROGRAM NO.9
' ストレージされているデータをAドライブへSAVEする。(シーケンシャル・ファイル)
'***************************************************************************
    Adr = 5
    Call ibdev(0, Adr, 0, T1s, 1, 0, rec%)              'デバイス初期化
    
    If (rec% < 0) Then
        MsgBox "Could not open device", 64, "ERROR"
        Call ibonl(rec%, 0)
        Exit Sub
    End If
    
    Call ibwrt(rec%, ":HEADER OFF")
    Call ibwrt(rec%, ":MEMORY:MAXPOINT?")
    rd$ = Space$(30)
    Call ibrd(rec%, rd$)
    sp% = Val(rd$)
    
    If (sp% = 0) Then
        Call ibonl(rec%, 0)
        Exit Sub
    End If
    
    na$ = "a:\sample.dat"                               'Aドライブとファイル名を指定
    Open na$ For Output As #1
    Call ibwrt(rec%, ":MEMORY:POINT CH1,0")             '出力データをCH1、ポイント0に設定
    Print #1, 10
    
    For i = 0 To 10
        Call ibwrt(rec%, ":MEMORY:ADATA? 1")            'ストレージデータを読み出す
        rd$ = Space$(30)
        Call ibrd(rec%, rd$)
        Print #1, Val(rd$)
    Next
    Close #1
    Call ibonl(rec%, 0)                                 'オフライン
End Sub


[例10] SAMPLE PROGURAM NO.9 で保存したファイルからデータを取出し、本体へセットする。


Private Sub Sample10_Click()
'***************************************************************************
' GPIB SAMPLE PROGRAM NO.10
' SAMPLE PROGRAM NO.9で保存したファイルからデータを取出し、本体へセットする。
'***************************************************************************
    Adr = 5
    Call ibdev(0, Adr, 0, T1s, 1, 0, rec%)                      'デバイス初期化
    
    If (rec% < 0) Then
        MsgBox "Could not open device", 64, "ERROR"
        Call ibonl(rec%, 0)
        Exit Sub
    End If
    
    Call ibwrt(rec%, ":HEADER OFF")
    Call ibwrt(rec%, ":MEMORY:PREPARE")                         'ストレージデータの準備
    Call ibwait(rec%, TIMO)
    na$ = "a:\sample.dat"
    Open na$ For Input As #1
    Call ibwrt(rec%, ":MEMORY:POINT CH1,0")                     '出力データをCH1、ポイント0に設定
    Line Input #1, mx
    
    For i = 0 To mx
        Line Input #1, dt
        Call ibwrt(rec%, ":MEMORY:ADATA " + LTrim(Str$(dt%)))   'ストレージメモリにデータを書込む
    Next
    
    Close #1
    Call ibonl(rec%, 0)                                         'オフライン
End Sub