サンプルプログラム > サンプルコード(Visual Basic.6.0)
サンプルプログラム
サンプルコード(Visual Basic 6.0)
ここで示されるサンプルはMicrosoft Visual Basic 6.0を前提にしています。またI/OライブラリにはVISA COM Softwareを使用するものとします。
VISA COM Softwareは当社ウェブサイトから「KI-VISA Library 2.2.x」をダウンロードするか、National Instruments社のNI-VISA (VER.3.0以降推奨)またはAgilent Technologies社のAgilent VISA (Agilent I/O Library VER M01.00以降推奨)を使用することができます。
それよりも古いバージョンのVISAではUSB機能を利用できないので注意してください。またUSB機能はWindows95およびNT3.5x/4.0では利用できません。
下記のコードは、後述するすべてのサンプルプログラムに共通の部分です。本製品と通信する前に実行する必要があります。
変数strIoResourceに代入するVISAリソース文字列は、GPIB/RS232C/USBによって書式が異なります。
GPIBの場合には、デバイスアドレスは3を前提にしています。
RS232Cの場合には、通信パラメータを19200bps、Data 8bits、Stop 2bit、Parity NONE、XFlow、Ack-OFFを前提にしています。本製品のインターフェース設定をあわせてください。
USBの場合には、本製品で設定する項目はありませんが、VISAリソース文字列にUSB VID(ベンダーID)、PID(プロダクトID)、シリアル番号を指定する必要があります。 VIDとPIDの値は、本製品のインターフェース設定画面でも確認できます。シリアル番号は、本製品後面パネルで確認できます。
下記サンプルで使用するシリアル番号は一例です。
Dim rm As VisaComLib.ResourceManager
Dim session As VisaComLib.IMessage
Dim strIoResource As String
strIoResource = "GPIB0::3::INSTR" 'If you use GPIB
' strIoResource = "ASRL1::INSTR" 'If you use RS232
' strIoResource = "USB0::0x0B3E::0x1018::AB000001::INSTR" 'If you use USB
Set rm = CreateObject("VISA.GlobalRM")
'Set rm=CreateObject("AgilentRM.SRMCls") 'If you use Agilent VISA
Set session = rm.Open(strIoResource)
' Settings specific for ASRL (RS232) resource
If session.HardwareInterfaceType = INTF_ASRL Then
Dim rs As ISerial
Set rs = session
rs.BaudRate = 19200 'Baudrate 19200bps
rs.DataBits = 8 'Data 8bits
rs.StopBits = ASRL_STOP_TWO 'Stop 2bit
rs.Parity = ASRL_PAR_NONE 'Parity NONE
rs.FlowControl = ASRL_FLOW_XON_XOFF 'X-flow
rs.EndIn = ASRL_END_TERMCHAR 'Terminates with Termchar when reading
rs.EndOut = ASRL_END_TERMCHAR 'Add Termchar when writing
session.IOProtocol = PROT_4882_STRS
End If
' Settings specific for USB resource
If session.HardwareInterfaceType = 7 Then
session.WriteString("SYST:REN 1"); 'Make sure to Enable Remote
End If
' Other common settings
session.TerminationCharacter = 10
session.TerminationCharacterEnabled = True
session.Timeout = 10000
以降、VisaComLib.IMessageインターフェース(変数session)を通じて本製品との通信をおこないます。
次の例は、インピーダンス、電圧、電流を測定して、それぞれ実数型変数に格納するプログラムです。
MEAS:<meter_fn>?クエリを使用しているので、細かい測定条件は設定していません。インピーダンス測定は、絶対値、レジスタンス、リアクタンス、位相、すべて同時測定されているため、FETC?クエリを併用しています。インピーダンスの4種類のデータはすべて同時に測定されたものです。
Dim adImpData(0 To 3) As Double
session.WriteString "MEAS:IMP:MAGN?;:FETC:IMP:RES?;REAC?;PHAS?"
Dim asImpData() As String
asImpData = Split(session.ReadString(256), ";", 4)
Dim ndx As Integer
For ndx = 0 To 3
adImpData(ndx) = CDbl(asImpData(ndx))
Next ndx
Dim dVoltData As Double
session.WriteString "MEAS:VOLT?"
dVoltData = CDbl(session.ReadString(256))
Dim dCurrData As Double
session.WriteString "MEAS:CURR?"
dCurrData = CDbl(session.ReadString(256))
session.Close
次の例は、重畳電流(KFM2005)/測定交流電流(KFM2030)の設定をしてインピーダンスを測定するプログラムです。
重畳電流を16.5 mApp、周波数を1 kHzに設定し、移動平均回数を4に設定しています。ここではMEAS:<meter_fn>?クエリを使用しないで、READ?クエリを使用します。電圧、電流の測定はここでは省略します。KFM2030の場合には重畳電流16.5 mAppを、測定交流電流165 mAppに置き換えてください。
session.WriteString "CONF:IMP"
session.WriteString "IMP:CURR:AC:LEV 165E-4;FREQ 1000"
session.WriteString "IMP:AVER:MOV:COUN 4"
Dim adImpData(0 To 3) As Double
session.WriteString "READ:IMP:MAGN?;:FETC:IMP:RES?;REAC?;PHAS?"
Dim asImpData() As String
asImpData = Split(session.ReadString(256), ";", 4)
Dim ndx As Integer
For ndx = 0 To 3
adImpData(ndx) = CDbl(asImpData(ndx))
Next ndx
session.Close
次の例は、インピーダンス測定を連続して5回測定するプログラムです。
トリガ回数が多いと測定に時間がかかります。ここでは*OPCコマンドを使用して、測定が完了したらサービスリクエストを発生するようにします。標準イベントステータスイネーブルレジスタ(ESE)のOPCビット(ビット0)と、サービスリクエストイネーブルレジスタ(SRE)のESBビット(ビット5)を設定しているのはそのためです。
測定データはコンマ区切りの複数データになるので、データの受け取りと実数変換はVisual BasicのSplit関数を利用します。
測定の開始にINITコマンドを使用します。サービスリクエストの発生を待つためには、WaitOnEvent関数を使用します。
電圧、電流の測定はここでは省略します。
session.WriteString "CONF:IMP"
session.WriteString "IMP:CURR:AC:LEV 165E-4;FREQ 1000"
session.WriteString "IMP:AVER:MOV:COUN 4"
session.WriteString "TRIG:SEQ1:COUN 5"
' Initiate measurement and wait for SRQ
session.WriteString "*ESE 1;*SRE 32;*CLS;INIT:SEQ1;*OPC"
Dim em As VisaComLib.IEventManager
Set em = session
em.EnableEvent EVENT_SERVICE_REQ, EVENT_QUEUE, 0
On Error Resume Next
Do
Dim ev As VisaComLib.IEvent
Set ev = em.WaitOnEvent(1000, EVENT_SERVICE_REQ, 0)
' wait for SRQ
' Do other job if you need...
Loop While ev Is Nothing
On Error GoTo 0
ev.Close
em.DisableEvent EVENT_SERVICE_REQ, EVENT_QUEUE, 0
' End of waiting for SRQ
Dim adImpMagn(0 To 4) As Double
Dim adImpRes(0 To 4) As Double
Dim adImpReac(0 To 4) As Double
Dim adImpPhas(0 To 4) As Double
Dim iNumData As Integer
iNumData = 5
Dim ndx As Integer
Dim asImpData() As String
session.WriteString "FETC:ARR:IMP:MAGN?"
asImpData = Split(session.ReadString(256), ",", iNumData)
For ndx = 0 To iNumData - 1
adImpMagn(ndx) = CDbl(asImpData(ndx))
Next ndx
session.WriteString "FETC:ARR:IMP:RES?"
asImpData = Split(session.ReadString(256), ",", iNumData)
For ndx = 0 To iNumData - 1
adImpRes(ndx) = CDbl(asImpData(ndx))
Next ndx
session.WriteString "FETC:ARR:IMP:REAC?"
asImpData = Split(session.ReadString(256), ",", iNumData)
For ndx = 0 To iNumData - 1
adImpReac(ndx) = CDbl(asImpData(ndx))
Next ndx
session.WriteString "FETC:ARR:IMP:PHAS?"
asImpData = Split(session.ReadString(256), ",", iNumData)
For ndx = 0 To iNumData - 1
adImpPhas(ndx) = CDbl(asImpData(ndx))
Next ndx
session.Close
上記の例はサービスリクエスト機能を使用するため、RS232Cでは動作しません。RS232Cの場合は測定開始とSRQ待ちの部分を、次の「OPCビット待ち」の処理に置き換えてください。
' Initiate measurement and wait for OPC bit
session.WriteString "*CLS;INIT:SEQ1;*OPC"
Dim iEsr As Integer
Do
session.WriteString "*ESR?"
iEsr = CInt(session.ReadString(16))
'
' wait for OPC bit on *ESR register
' Do other job if you need...
Sleep 1000 ' Win32 API Sleep() function, you need declare it.
Loop While iEsr = 0
次の例は、本製品の測定機能をフルに生かしてすべてのデータを同時に測定します。
一般にインピーダンス測定は時間がかかるため、1回のインピーダンス測定の間に電圧・電流を何度も測定できます。電圧・電流測定のトリガ回数を16にして、3秒インターバルで測定します。
session.WriteString "FUNC:ALL"
session.WriteString "CONF:IMP;VOLT;CURR"
session.WriteString "IMP:CURR:AC:LEV 165E-4;FREQ 0.1"
session.WriteString "TRIG:SEQ1:COUN 1;SOUR IMM"
session.WriteString "TRIG:SEQ2:COUN 16;SOUR TIM;TIM 3.0"
session.WriteString "*ESE 1;*SRE 32;*CLS;INIT;*OPC"
Dim em As VisaComLib.IEventManager
Set em = session
em.EnableEvent EVENT_SERVICE_REQ, EVENT_QUEUE, 0
On Error Resume Next
Do
Dim ev As VisaComLib.IEvent
Set ev = em.WaitOnEvent(1000, EVENT_SERVICE_REQ, 0)
' wait for SRQ
' Do other job if you need...
Loop While ev Is Nothing
On Error GoTo 0
ev.Close
em.DisableEvent EVENT_SERVICE_REQ, EVENT_QUEUE, 0
' End of waiting for SRQ
Dim dImpMagn As Double
Dim dImpRes As Double
Dim dImpReac As Double
Dim dImpPhas As Double
Dim asData() As String
session.WriteString "FETC:IMP:MAGN?;RES?;REAC?;PHAS?"
asData = Split(session.ReadString(256), ";", 4)
dImpMagn = CDbl(asData(0))
dImpRes = CDbl(asData(1))
dImpReac = CDbl(asData(2))
dImpPhas = CDbl(asData(3))
Dim adVolt(0 To 15) As Double
Dim adCurr(0 To 15) As Double
Dim iNumData As Integer
iNumData = 16
Dim ndx As Integer
session.WriteString "FETC:ARR:VOLT?"
asData = Split(session.ReadString(256), ",", iNumData)
For ndx = 0 To iNumData - 1
adVolt(ndx) = CDbl(asData(ndx))
Next ndx
session.WriteString "FETC:ARR:CURR?"
asData = Split(session.ReadString(256), ",", iNumData)
For ndx = 0 To iNumData - 1
adCurr(ndx) = CDbl(asData(ndx))
Next ndx
session.Close