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 |