サンプルプログラム > サンプルコード(Visual Basic.6.0)

サンプルコード(Visual Basic 6.0) | サンプルコード(Visual C++ 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では利用できません。

VISAセッションの取得と通信設定

VISAセッションの取得と通信設定 | 最も簡単な測定 | 電流を設定して測定する
トリガ回数を指定して複数回測定する | インピーダンス、電圧電流の同時測定

 

下記のコードは、後述するすべてのサンプルプログラムに共通の部分です。本製品と通信する前に実行する必要があります。

変数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)を通じて本製品との通信をおこないます。

サンプルコード(最も簡単な測定)

VISAセッションの取得と通信設定 | 最も簡単な測定 | 電流を設定して測定する
トリガ回数を指定して複数回測定する | インピーダンス、電圧電流の同時測定

次の例は、インピーダンス、電圧、電流を測定して、それぞれ実数型変数に格納するプログラムです。

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

サンプルコード(電流を設定して測定する)

VISAセッションの取得と通信設定 | 最も簡単な測定 | 電流を設定して測定する
トリガ回数を指定して複数回測定する | インピーダンス、電圧電流の同時測定

次の例は、重畳電流(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

サンプルコード(トリガ回数を指定して複数回測定する)

VISAセッションの取得と通信設定 | 最も簡単な測定 | 電流を設定して測定する
トリガ回数を指定して複数回測定する | インピーダンス、電圧電流の同時測定

次の例は、インピーダンス測定を連続して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

サンプルコード(インピーダンス、電圧、電流の同時測定)

VISAセッションの取得と通信設定 | 最も簡単な測定 | 電流を設定して測定する
トリガ回数を指定して複数回測定する | インピーダンス、電圧電流の同時測定

次の例は、本製品の測定機能をフルに生かしてすべてのデータを同時に測定します。

一般にインピーダンス測定は時間がかかるため、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