第 3 章 サンプルプログラム
Visual Basicサンプルプログラム
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