Program For Keithley 2000
Visual Basic Ver.6
GP-IB
By H. Abe
ケスレーのデジタルマルチメータ用のプログラムです。
GP-IB の設定の仕方は、
「Visual Basic を用いたGP-IB制御」を参考にしてください。
コンテックのGP-IBボード
GPIB通信ドライバ(API-PAC
(W32)を使ってプログラムが作られています。
対応OS:Windows XP/2000/Me/98SE/98。
特に、API-GPIB(98/PC)
Ver.4.06 が、ホームページから無料でダウンロードできます!
Dim BaseColor As Long
Dim talker As Long, stbyte As Long, nP As Integer
Dim TimerCount As Single, FLG As Integer, nCycle As Integer
Dim ScaleH As Single, ScaleW As Single, FileName As String, Ans As Integer
Dim Xmin As Single, Xmax As Single, Ymin As Single, Ymax As Single
Dim Cmd(31) As Long, CmdR(31) As Long
Dim Pstb(31) As Long ' 返送されたステータスバイト配列
Dim temp As String * 1000, t(50000) As Single, Tem(50000) As Single
Dim AdrComp As Integer, Adr2000 As Integer
Private Sub Form_Load()
Form2.Show
AdrComp = 0 ' Computer Address
Adr2000 = 7 ' Model 2000 Multimeter Address
nP = 10
'----------------------------------------------------------------------------
e1 = GpIni(): 'GPIB 初期化
e2 = GpIfc(1): 'インターフェイスクリア (1×100μsec)
e3 = GpRen(): 'GPIB remote enable
e4 = GpDelim(1, 1): 'Delimiter [1: CR+LF / 1: EOI valid]
e5 = GpTimeout(2000): 'Timeout (2000×1msec)
e6 = GpSdc(Adr2000): 'SDC (Select Device Clear)
If e1 <> 0 Then Form2.Text1.Text = "GP-IB intialization Failed" Else Form2.Text1.Text = "GP-IB intialization OK"
If e2 <> 0 Then Form2.Text2.Text = "Interface Clear Failed"
Else Form2.Text2.Text = "Interface Clear OK"
If e3 <> 0 Then Form2.Text3.Text = "GP-IB Remote Enable Failed"
Else Form2.Text3.Text = "GP-IB Remote Enable OK"
If e4 <> 0 Then Form2.Text4.Text = "Delimiter Failed" Else Form2.Text4.Text = "Delimiter OK"
If e5 <> 0 Then Form2.Text5.Text = "Timeout (2sec) Failed"
Else Form2.Text5.Text = "Timeout (2msec) OK"
If e6 <> 0 Then Form2.Text6.Text = "Select Device Clear Failed"
Else Form2.Text6.Text = "Select Device Clear OK"
'----------------------------------------------------------------------
e7 = GpCrst(Adr2000): 'Reset Model 2000 (*RST)
e8 = GpCcls(Adr2000): 'Clear Status (*CLS)
If e7 <> 0 Then Form2.Text7.Text = "Reset Model 2000 Failed"
Else Form2.Text7.Text = "Reset Model 2000 OK"
L = Len(Str(nP))
' *** Set up trigger model ***
Cmd(0) = 2 'talker + listener
Cmd(1) = AdrComp 'talker address (GPIB)
Cmd(2) = Adr2000 'listener address(Model 2000)
e9 = GpTalk(Cmd(0), 19, ":INIT:CONT 0;:ABORT") 'Reset trigger
mode
e10 = GpTalk(Cmd(0), 13, ":SAMP:COUNT 1") 'Sample Count 1
e11 = GpTalk(Cmd(0), 14, ":TRIG:SOUR IMM") 'Measure immediate
e12 = GpTalk(Cmd(0), 10 + L, ":TRIG:COUN" + Str$(nP)) 'Measure
nP points
If e9 <> 0 Then Form2.Text9.Text = "Reset Trigger Mode Failed"
Else Form2.Text9.Text = "Reset Trigger Mode OK"
If e10 <> 0 Then Form2.Text10.Text = "Sample Count Failed" Else Form2.Text10.Text = "Sample Count OK"
If e11 <> 0 Then Form2.Text11.Text = "Measure Immediate Failed" Else Form2.Text11.Text = "Measure Immediate OK"
If e12 <> 0 Then Form2.Text12.Text = "Measure DATA Points
Failed" Else Form2.Text12.Text = "Measure DATA points OK"
' *** Set up Buffer ***
e13 = GpTalk(Cmd(0), 12, ":TRACE:CLEAR") 'Clear Buffer
e14 = GpTalk(Cmd(0), 10 + L, ":TRAC:POIN" + Str$(nP)) 'Store nP points
e15 = GpTalk(Cmd(0), 16, ":FORM:DATA ASCII") 'ASCII data
e16 = GpTalk(Cmd(0), 15, ":FORM:ELEM READ") 'Readings only
e17 = GpTalk(Cmd(0), 20, ":TRAC:FEED:CONT NEXT") 'Fill and stop
If e13 <> 0 Then Form2.Text13.Text = "Clear Buffer Failed"
Else Form2.Text13.Text = "Clear Buffer OK"
If e14 <> 0 Then Form2.Text14.Text = "Store DATA Points Failed"
Else Form2.Text14.Text = "Store DATA Pointrs OK"
If e15 <> 0 Then Form2.Text15.Text = "Ascii DATA Failed" Else Form2.Text15.Text = "Ascii DATA OK"
If e16 <> 0 Then Form2.Text16.Text = "Readings only Failed"
Else Form2.Text16.Text = "Readings only OK"
If e17 <> 0 Then Form2.Text17.Text = "Fill and stop Failed"
Else Form2.Text17.Text = "Fill and Stop OK"
' *** Set up function parameters ***
e = GpTalk(Cmd(0), 17, ":SENS:FUNC 'TEMP'") '温度
' e = GpTalk(Cmd(0), 12, ":UNIT:TEMP C") '(℃)
e = GpTalk(Cmd(0), 15, ":TEMP:TC:TYPE K") 'Thermocouple Type
K
e = GpTalk(Cmd(0), 12, ":TEMP:NPLC 1") 'Sampling Speed (Med)0.01->10
' e = GpTalk(Cmd(0), 14, ":TEMP:NPLC 0.1") 'Sampling Speed
(Fast)0.01->10
' e = GpTalk(Cmd(0), 12, ":TEMP:NPLC 5") 'Sampling Speed (Slow)0.01->10
' *** Set up SRQ on buffer full ***
e18 = GpTalk(Cmd(0), 19, ":STAT:MEAS:ENAB 512") 'SRQ buf full
e19 = GpCsre(Adr2000, 1) 'Turn on srq (*SRE)
If e18 <> 0 Then Form2.Text18.Text = "SRQ Buffer Full Failed"
Else Form2.Text18.Text = "SRQ Buffer Full OK"
If e19 <> 0 Then Form2.Text19.Text = "Turn on SRQ Failed" Else Form2.Text19.Text = "Turn on SRQ OK"
' *** Start meaurements ***
e20 = GpTalk(Cmd(0), 5, ":INIT") 'Start measurements
If e20 <> 0 Then Form2.Text20.Text = "INIT Failed" Else
Form2.Text20.Text = "INIT OK"
' *** Wait for SRQ ***
Cmd(0) = 1 ' トーカ数
Cmd(1) = Adr2000 ' トーカアドレス
e21 = GpPoll(Cmd(0), Pstb(0)) ' ポーリング
talker = Cmd(Pstb(0)) '
stbyte = Pstb(Pstb(0)) ' RQSビットONのトーカを発見した配列番号
If e21 <> 0 Then Form2.Text21.Text = "Polling Failed =>
" & e21 Else Form2.Text21.Text = "Polling OK"
' *** Send stored data ***
Cmd(0) = 2 'talker + listener
Cmd(1) = AdrComp 'talker address (GPIB)
Cmd(2) = Adr2000 'listener address (Model 2000)
e22 = GpTalk(Cmd(0), 11, ":TRAC:DATA?") 'Read stored data
If e22 <> 0 Then Form2.Text22.Text = "Read Stroed DATA Failed"
Else Form2.Text22.Text = "Read Stored DATA OK"
CmdR(0) = 2 'talker + listener
CmdR(1) = Adr2000 'talker address (Model 2000)
CmdR(2) = AdrComp 'listener address (GPIB)
e23 = GpListen(CmdR(0), 16 * nP, temp)
If e23 <> 0 Then Form2.Text23.Text = "Read Failed => " & e23 Else Form2.Text23.Text = "Read OK"
'----------------------------------------------
n = 1
For I = 1 To nP
buf$ = Mid$(temp, n, 15)
n = n + 16
Next I
Tem(0) = Val(buf$)
t(0) = 0#
Text5.Text = Val(buf$)
'-----------------------------------
Cmd(0) = 2 'talker + listener
Cmd(1) = AdrComp 'talker address (GPIB)
Cmd(2) = Adr2000 'listener address (Model 2000)
e24 = GpTalk(Cmd(0), 16, ":STAT:MEAS:EVEN?") 'Clear status
If e24 <> 0 Then Form2.Text24.Text = "Clear Status Failed" Else Form2.Text24.Text = "Clear Status OK"
'-----------------------------------------------------
e = GpResetren()
Timer1.Interval = 100 ' (100 msec)
Timer1.Enabled = False
ScaleH = 100: ScaleW = 2000
BaseColor = Command2.BackColor
Command3.Enabled = False
End Sub
Private Sub Command2_Click()
Command2.Enabled = False
Command3.Enabled = True
Command2.BackColor = vbGreen
Command3.BackColor = BaseColor
Xmin = Val(Text6.Text)
Xmax = Val(Text7.Text)
Ymin = Val(Text3.Text)
Ymax = Val(Text2.Text)
e = GpRen() ' GPIB remote enable
FLG = 0
If Val(Text4.Text) <= 0 Then
Beep
e = MsgBox("Sampling time < 0", vbOKOnly, "警告")
Exit Sub
End If
If Xmax <= Xmin Then
Beep
e = MsgBox("Xmin > Xmax", vbOKOnly, "警告")
Exit Sub
End If
If Ymax <= Ymin Then
Beep
e = MsgBox("Ymin > Ymax", vbOKOnly, "警告")
Exit Sub
End If
Picture1.Cls
'--------------------------------------------------
nCycle = 1
Open "A:\User\abe\project_VB\Keithley_Model2000\dummy.dat"
For Output As #2
Do
Call Meas
If t(nCycle - 1) > Xmax * 0.95 Then
Xmax = Xmax * 5#
Text7.Text = Xmax
Picture1.Cls
For I = 1 To nCycle - 1
X1 = (t(I - 1) - Xmin) / (Xmax - Xmin) * ScaleW
X2 = (t(I) - Xmin) / (Xmax - Xmin) * ScaleW
Y1 = ScaleH - (Tem(I - 1) - Ymin) / (Ymax - Ymin) * ScaleH
Y2 = ScaleH - (Tem(I) - Ymin) / (Ymax - Ymin) * ScaleH
Picture1.Line (X1, Y1)-(X2, Y2), 6
Next I
End If
If Tem(nCycle - 1) > Ymax Then
Ymax = Tem(nCycle)
Text2.Text = Ymax
Picture1.Cls
For I = 1 To nCycle - 1
X1 = (t(I - 1) - Xmin) / (Xmax - Xmin) * ScaleW
X2 = (t(I) - Xmin) / (Xmax - Xmin) * ScaleW
Y1 = ScaleH - (Tem(I - 1) - Ymin) / (Ymax - Ymin) * ScaleH
Y2 = ScaleH - (Tem(I) - Ymin) / (Ymax - Ymin) * ScaleH
Picture1.Line (X1, Y1)-(X2, Y2), 6
Next I
End If
If Tem(nCycle - 1) < Ymin Then
Ymin = Tem(nCycle)
Text3.Text = Ymin
Picture1.Cls
For I = 1 To nCycle - 1
X1 = (t(I - 1) - Xmin) / (Xmax - Xmin) * ScaleW
X2 = (t(I) - Xmin) / (Xmax - Xmin) * ScaleW
Y1 = ScaleH - (Tem(I - 1) - Ymin) / (Ymax - Ymin) * ScaleH
Y2 = ScaleH - (Tem(I) - Ymin) / (Ymax - Ymin) * ScaleH
Picture1.Line (X1, Y1)-(X2, Y2), 6
Next I
End If
If FLG = 1 Then Exit Do
Loop
Close #2
e = GpResetren()
Command2.Enabled = True
End Sub
Private Sub Command3_Click()
FLG = 1
Command3.BackColor = vbRed
Command2.BackColor = BaseColor
Beep
e = MsgBox("データを保存しますか?", vbYesNo, "確認")
If e = 6 Then
On Error Resume Next
CommonDialog1.CancelError = True
CommonDialog1.Filter = "データファイル(*.dat)|*.dat|" &
"すべてのファイル(*.*)|*.*|"
CommonDialog1.FilterIndex = 1
CommonDialog1.DefaultExt = "dat"
CommonDialog1.ShowSave
FileName = CommonDialog1.FileName
If Err.Number = cdlCancel Then
Exit Sub
Else
If Dir(FileName) <> "" Then Ans = MsgBox("上書きしますか?",
vbYesNo, "確認")
If Ans = vbNo Then Exit Sub
End If
Open FileName For Output As #1
For k = 1 To nCycle
Print #1, t(k), Tem(k)
Next k
Beep
MsgBox (FileName & " 保存しました")
Close #1
End If
Command3.Enabled = False
Call Meas
End Sub
Private Sub Meas()
Cmd(0) = 2 'talker + listener
Cmd(1) = AdrComp 'talker address (GPIB)
Cmd(2) = Adr2000 'listener address(Model 2000)
e9 = GpTalk(Cmd(0), 19, ":INIT:CONT 0;:ABORT") 'Reset trigger
mode
e13 = GpTalk(Cmd(0), 12, ":TRACE:CLEAR") 'Clear Buffer
e16 = GpTalk(Cmd(0), 15, ":FORM:ELEM READ") 'Readings only
e17 = GpTalk(Cmd(0), 20, ":TRAC:FEED:CONT NEXT") 'Fill and
stop
e19 = GpCsre(Adr2000, 1) 'Turn on srq (*SRE)
e20 = GpTalk(Cmd(0), 5, ":INIT") 'Start measurements
e22 = GpTalk(Cmd(0), 11, ":TRAC:DATA?") 'Read stored data
CmdR(0) = 2 'talker + listener
CmdR(1) = Adr2000 'talker address (Model 2000)
CmdR(2) = AdrComp 'listener address (GPIB)
e23 = GpListen(CmdR(0), 16 * nP, temp)
'----------------------------------------------
n = 1
For I = 1 To nP
t(nCycle) = t(nCycle - 1) + Val(Text4.Text) / nP
buf$ = Mid$(temp, n, 15)
Tem(nCycle) = Val(buf$)
Print #2, t(nCycle), Tem(nCycle)
X1 = (t(nCycle - 1) - Xmin) / (Xmax - Xmin) * ScaleW
X2 = (t(nCycle) - Xmin) / (Xmax - Xmin) * ScaleW
Y1 = ScaleH - (Tem(nCycle - 1) - Ymin) / (Ymax - Ymin) * ScaleH
Y2 = ScaleH - (Tem(nCycle) - Ymin) / (Ymax - Ymin) * ScaleH
Picture1.Line (X1, Y1)-(X2, Y2), 6
nCycle = nCycle + 1
n = n + 16
Next I
Text5.Text = Val(buf$)
Text1.Text = t(nCycle - 1)
Call delay(Val(Text4.Text)) ' Sampling time
End Sub
Private Sub delay(TimeData)
TimerCount = 0
Timer1.Enabled = True
Do While TimeData >= TimerCount
DoEvents
Loop
Timer1.Enabled = False
End Sub
Private Sub form_unload(cancel As Integer)
Unload Form2
e = GpResetren()
e = GpExit()
End Sub
Private Sub Timer1_Timer()
TimerCount = TimerCount + 0.1 ' (0.1 sec)
End Sub