第3章 サンプルプログラム |
|
|
RS-232Cサンプルプログラム |
以下のサンプルプログラムは、Visual Basic Professional Edition 以上に付属のMSComm コントロールを用いて作成しました。
(1)Visual Basic メニューの、プロジェクト−コンポーネントを開き、Comm Control をチェックしてOKボタンを押して下さい。 MSComm コントロールが登録されます。(電話のアイコン) (2)フォームに、テキストボックス、MSComm コントロール、コマンドボタンを貼り付けて下さい。 (3)テキストボックス Text1 のプロパティウインドウの Multiline を True にして下さい。 (4)コマンドボタンをダブルクリックすると、コードの入力状態になりますので、下記のプログラムを入力して下さい。 |
以下のサンプルプログラムで$の付く変数は、文字列型です。
[例1]セットコマンドの使用法 |
Private Sub Sample1_Click() '******************************************************************************* ' RS232C SAMPLE PROGRAM NO.1 ' セットコマンドの使用法 ' ' コマンドリストの<使用可能条件>を満足している状態において<コマンド>の書式通り ' に送信します。 '******************************************************************************* deli$ = Chr$(13) & Chr$(10) 'デリミタ定義 MSComm1.PortOpen = True 'ポートオープン MSComm1.Output = ":FUNCTION MEM" & deli$ 'メモリレコーダファンクションに設定 MSComm1.Output = ":CONFIGURE:TDIV 1.E-3" & deli$ 'TIME/DIV 1msに設定 MSComm1.Output = ":CONFIGURE:SHOT 30" & deli$ '記録長を30DIVに設定 MSComm1.Output = ":TRIGGER:SOURCE OR" & deli$ 'トリガソース OR MSComm1.Output = ":TRIGGER:KIND CH1,LEVEL" & deli$ 'レベルトリガ CH1 MSComm1.Output = ":TRIGGER:PRETRIG 5" & deli$ 'プリトリガ 5% MSComm1.Output = ":TRIGGER:LEVEL CH1,0" & deli$ 'トリガレベル 0V MSComm1.Output = ":TRIGGER:SLOPE CH1,UP" & deli$ 'トリガスロープ UP MSComm1.Output = ":TRIGGER:KIND CH2,OFF" & deli$ 'CH2 OFF MSComm1.Output = ":TRIGGER:KIND CH3,OFF" & deli$ 'CH3 OFF MSComm1.Output = ":TRIGGER:KIND CH4,OFF" & deli$ 'CH4 OFF MSComm1.Output = ":TRIGGER:KIND CH5,OFF" & deli$ 'CH5 OFF MSComm1.Output = ":TRIGGER:KIND CH6,OFF" & deli$ 'CH6 OFF MSComm1.Output = ":TRIGGER:KIND CH7,OFF" & deli$ 'CH7 OFF MSComm1.Output = ":TRIGGER:KIND CH8,OFF" & deli$ 'CH8 OFF MSComm1.Output = ":START" & deli$ '実行処理 MSComm1.PortOpen = False 'クローズ End Sub
|
[例2]クエリの使用法 |
Private Sub Sample2_Click() '******************************************************************************* ' RS232C SAMPLE PROGRAM NO.2 ' クエリの使用法 ' ' ・コマンドリストの<使用可能条件>を満足している状態において<コマンド>の書式通 ' りに送信して、出力準備させます。 ' ・<クエリ>によって出力準備されるデータは、コマンドリストの<応答>記載されている ' 形式となります。 '******************************************************************************* deli$ = Chr$(13) & Chr$(10) 'デリミタ定義 MSComm1.PortOpen = True 'オープン MSComm1.Output = ":HEADER OFF" & deli$ 'ヘッダ OFF MSComm1.Output = ":FUNCTION?" & deli$ 'ファンクションの問い合わせ Do ans$ = ans$ & MSComm1.Input '問い合わせ結果を変数ANS$にセット Loop Until InStr(1, ans$, Chr$(10)) MSComm1.Output = ":SYSTEM:TIME?" & deli$ '現在時刻を問い合わせる Do tm$ = tm$ & MSComm1.Input '問い合わせ結果を変数にセット Loop Until InStr(1, tm$, Chr$(10)) Text1.Text = "FUNCTION = " & ans$ Text1.Text = Text1.Text & "TIME = " & tm$ MSComm1.PortOpen = False 'クローズ End Sub
|
[例3]ストレージデータの出力法 |
Private Sub Sample3_Click() '******************************************************************************* ' RS232C SAMPLE PROGRAM NO.3 ' ストレージデータの出力法 ' ' ・:MEMORY:MAXPOINT?クエリによって、ストレージデータが入出力可能であるか調べます。 ' ストレージされていない状態では、MAXPOINT?による出力値が0となり、データの出力 ' はできません。 ' ・出力したいデータのチャネルとポイントを:MEMORY:POINTコマンドによって指定します。 ' データを入出力すると自動的にポイントが移動していきます。連続したデータを取込 ' む場合には、一度指定するだけで済みます。 ' ・ASCII形式で取込む場合は、:MEMORY:ADATA?クエリ、電圧値形式の場合は:VDATA? ' クエリを使用します。まとめて出力できるデータ数は:ADATA?で1〜80個、:VDATA? ' で1〜40個ですがバッファの容量により、個数制限されます。 ' ・より多くのデータをまとめて出力させるほど、処理全体の時間は短くなります。 ' ・記録長10DIVでストレージされているデータのCH1のデータ1000個を取り込みます。 '******************************************************************************* deli$ = Chr$(13) & Chr$(10) 'デリミタ定義 Dim d(1000) As Double MSComm1.PortOpen = True 'オープン MSComm1.Output = ":FUNCTION MEM" & deli$ 'メモリレコーダファンクションに設定 MSComm1.Output = ":CONFIGURE:SHOT 10" & deli$ '記録長10DIVに設定 MSComm1.Output = ":TRIGGER:MODE SINGLE" & deli$ 'トリガをSINGLEに設定 MSComm1.Output = ":START;*OPC;:STOP;*OPC?" & deli$ 'スタート処理 '注記 'MEMファンクションでは":START;*OPC;:STOP;*OPC?"とすることによって、指定記録長分 '分の取り込みの終了を待つことができます。RECファンクションではできません。 'これはMEMファンクションは1度のSTOPキーでは、記録長分の取り込みが終わるまで '取り込みを中断しないためです。 Do o$ = o$ & MSComm1.Input Loop Until InStr(1, o$, Chr$(10)) MSComm1.Output = ":HEADER OFF" & deli$ 'ヘッダをOFF MSComm1.Output = ":MEMORY:MAXPOINT?" & deli$ 'ストレージデータ数を読み出す Do mx$ = mx$ & MSComm1.Input Loop Until InStr(1, mx$, Chr$(10)) If (Val(mx$) = 0) Then MSComm1.PortOpen = False Exit Sub End If MSComm1.Output = ":MEMORY:POINT CH1,0" & deli$ '出力データをCH1、ポイント0に設定 For i = 1 To 1000 vd$ = "" MSComm1.Output = ":MEMORY:VDATA? 1" & deli$ Do vd$ = vd$ & MSComm1.Input Loop Until InStr(1, vd$, Chr$(10)) d(i) = Val(vd$) Next For i = 1 To 1000 'データ表示 Text1.SelText = Format(d(i), "Scientific") & deli$ Next MSComm1.PortOpen = False 'クローズ End Sub
|
[例4]ストレージデータの入力法 |
Private Sub Sample4_Click() '******************************************************************************* ' RS232C SAMPLE PROGRAM NO.4 ' ストレージデータの入力法 ' ' ・:MEMORY:PREPAREによって、ストレージメモリ準備をします。 ' ・入力するデータのチャネルとポイントを:MEMORY:POINTコマンドによって指定します。 ' 指定後、:MEMORY:ADATAコマンドによって入力します。 '******************************************************************************* deli$ = Chr$(13) & Chr$(10) 'デリミタ定義 MSComm1.PortOpen = True 'オープン MSComm1.Output = ":FUNCTION MEM" & deli$ ' メモリレコーダファンクションに設定 MSComm1.Output = ":CONFIGURE:SHOT 10" & deli$ '記録長10DIVに設定 MSComm1.Output = ":MEMORY:PREPARE;*OPC?" & deli$ 'ストレージメモリの準備 Do o$ = MSComm1.Input Loop Until InStr(1, o$, Chr$(10)) MSComm1.Output = ":MEMORY:POINT CH1,0" & deli$ '入力データをCH1、ポイント0に設定 For i = 0 To 1000 'SIN波のセット MSComm1.Output = ":MEMORY:ADATA " & Str$(Int(1600 * Sin(3.14 * i / 500))) & deli$ Next MSComm1.PortOpen = False 'クローズ End Sub
|
[例5]入力チャネルの有無を調べ、その入力レベルをディスプレイ上にモニタ表示させる。 |
Private Sub Sample5_Click() '******************************************************************************* ' RS232C SAMPLE PROGRAM NO.5 ' 入力チャネルの有無を調べ、その入力レベルをディスプレイ上にモニタ表示させる。 '******************************************************************************* deli$ = Chr$(13) & Chr$(10) 'デリミタ定義 MSComm1.PortOpen = True 'オープン MSComm1.Output = ":HEADER OFF" & deli$ 'ヘッダ OFF MSComm1.Output = "*OPT?" & deli$ '入力チャネルの問い合わせ Do op$ = op$ & MSComm1.Input Loop Until InStr(1, op$, Chr$(10)) ch1% = Val(Mid$(op$, 1, 1)) ch2% = Val(Mid$(op$, 3, 1)) ch3% = Val(Mid$(op$, 5, 1)) ch4% = Val(Mid$(op$, 7, 1)) MSComm1.Output = ":MEMORY:GETREAL" & deli$ 'リアルタイムデータの取り込み If (ch1% <> 0) Then '各チャネルのリアルタイムデータの出力 MSComm1.Output = ":MEMORY:AREAL? CH1" & deli$ ar$ = "" Do ar$ = ar$ & MSComm1.Input Loop Until InStr(1, ar$, Chr$(10)) ch1_data$ = "CH1 = " & ar$ Else ch1_data$ = "CH1 = NON" End If If (ch2% <> 0) Then MSComm1.Output = ":MEMORY:AREAL? CH2" & deli$ ar$ = "" Do ar$ = ar$ & MSComm1.Input Loop Until InStr(1, ar$, Chr$(10)) ch2_data$ = "CH2 = " & ar$ Else ch2_data$ = "CH2 = NON" End If If (ch3% <> 0) Then MSComm1.Output = ":MEMORY:AREAL? CH3" & deli$ ar$ = "" Do ar$ = ar$ & MSComm1.Input Loop Until InStr(1, ar$, Chr$(10)) ch3_data$ = "CH3 = " & ar$ Else ch3_data$ = "CH3 = NON" End If If (ch4% <> 0) Then MSComm1.Output = ":MEMORY:AREAL? CH4" & deli$ ar$ = "" Do ar$ = ar$ & MSComm1.Input Loop Until InStr(1, ar$, Chr$(10)) ch4_data$ = "CH4 = " & ar$ Else ch4_data$ = "CH4 = NON" End If Text1.Text = ch1_data$ & deli$ & ch2_data$ & deli$ & ch3_data$ & deli$ & ch4_data$ & deli$ 'データ表示 MSComm1.PortOpen = False 'クローズ End Sub
|
[例6]ストレージされているデータをAドライブにSAVEする。 |
Private Sub Sample6_Click() '******************************************************************************* ' RS232C SAMPLE PROGRAM NO.6 ' ストレージされているデータをAドライブにSAVEする。 '******************************************************************************* deli$ = Chr$(13) & Chr$(10) 'デリミタ定義 na$ = "a:\sample.dat" 'Aドライブとファイル名を設定 MSComm1.PortOpen = True 'オープン MSComm1.Output = ":HEADER OFF" & deli$ 'ヘッダ 0FF MSComm1.Output = ":MEMORY:MAXPOINT?" & deli$ 'ストレージされているデータ数を読み出す Do mx$ = mx$ & MSComm1.Input Loop Until InStr(1, mx$, Chr$(10)) If (Val(mx$) = 0) Then MSComm1.PortOpen = False Exit Sub End If Open na$ For Output As #1 MSComm1.Output = ":MEMORY:POINT CH1,0" & deli$ 'ストレージデータの出力ポイントを設定 Print #1, 10 For i = 0 To 10 MSComm1.Output = ":MEMORY:ADATA? 1" & deli$ 'ストレージデータを読み出す ad$ = "" Do ad$ = ad$ & MSComm1.Input Loop Until InStr(1, ad$, Chr$(10)) Print #1, Val(ad$) 'ファイルへ出力 Next Close #1 MSComm1.PortOpen = False 'クローズ End Sub
|
[例7]SAMPLE PROGRAM NO.6で保存したファイルからデータを取出し、本体へセットする。 |
Private Sub Sample7_Click() '******************************************************************************* ' RS232C SAMPLE PROGRAM NO.7 ' SAMPLE PROGRAM NO.6で保存したファイルからデータを取出し、本体へセットする。 '******************************************************************************* deli$ = Chr$(13) & Chr$(10) 'デリミタ定義 na$ = "a:\sample.dat" 'Aドライブとファイル名を指定 MSComm1.PortOpen = True 'オープン MSComm1.Output = ":HEADER OFF" & deli$ 'ヘッダ OFF MSComm1.Output = ":MEMORY:PREPARE;*OPC?" & deli$ 'ストレージデータの準備 Do o$ = MSComm1.Input Loop Until InStr(1, o$, Chr$(10)) Open na$ For Input As #1 MSComm1.Output = ":MEMORY:POINT CH1,0" & deli$ 'ストレージデータの入力ポイントを設定 Line Input #1, mx For i = 0 To mx Line Input #1, dt 'ファイルからデータを読み込む MSComm1.Output = ":MEMORY:ADATA " & Str$(dt) & deli$ 'ストレージメモリにデータを書込む Next Close #1 MSComm1.PortOpen = False 'クローズ End Sub
|