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

サンプルコード(Visual Basic 6.0) | サンプルコード(Visual C++ 6.0)サンプルプログラム

サンプルコード(Visual C++ 6.0)

ここで示されるサンプルはMicrosoft Visual C++ 6.0を前提にしています。またI/OライブラリにはVISAライブラリ(VISA C API)を使用するものとします。

VISAライブラリは当社ウェブサイトから「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セッションの取得と通信設定 | 最も簡単な測定 | 電流を設定して測定する
トリガ回数を指定して複数回測定する | インピーダンス、電圧電流の同時測定

 

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

変数pResourceNameに代入する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の値は、本製品のインターフェース設定画面でも確認できます。シリアル番号は、本製品後面パネルで確認できます。

 

下記サンプルで使用するシリアル番号は一例です。

       //

       // Initiation of VISA

       //

       

       ViSession viRM;

       ViSession vi;

       ViStatus vs;

       

       char* pResourceName = "GPIB0::3::INSTR"; //if you use GPIB

    // char* pResourceName = "ASRL1::INSTR"; //if you use RS232

    // char* pResourceName = "USB0::0x0B3E::0x1018::AB000001::INSTR"; //if you use USB

       

       

       vs = viOpenDefaultRM( &viRM);

       vs = viOpen( viRM, pResourceName, VI_NO_LOCK, 0, &vi);

       

       // common settings

       vs = viSetAttribute( vi, VI_ATTR_TMO_VALUE, 10000);

       vs = viSetAttribute( vi, VI_ATTR_TERMCHAR, 0x10);

       vs = viSetAttribute( vi, VI_ATTR_TERMCHAR_EN, 1);

       vs = viSetAttribute( vi, VI_ATTR_WR_BUF_OPER_MODE, VI_FLUSH_ON_ACCESS);

       vs = viSetAttribute( vi, VI_ATTR_RD_BUF_OPER_MODE, VI_FLUSH_ON_ACCESS);

       

       short iIntfType;

       vs = viGetAttribute( vi, VI_ATTR_INTF_TYPE, &iIntfType);

       if( iIntfType == VI_INTF_ASRL) {

              vs = viSetAttribute( vi, VI_ATTR_ASRL_BAUD, 19200);

              vs = viSetAttribute( vi, VI_ATTR_ASRL_DATA_BITS, 8);

              vs = viSetAttribute( vi, VI_ATTR_ASRL_PARITY, VI_ASRL_PAR_NONE);

              vs = viSetAttribute( vi, VI_ATTR_ASRL_STOP_BITS, VI_ASRL_STOP_TWO);

              vs = viSetAttribute( vi, VI_ATTR_ASRL_FLOW_CNTRL, VI_ASRL_FLOW_XON_XOFF);

       

              vs = viSetAttribute( vi, VI_ATTR_ASRL_END_OUT, VI_ASRL_END_TERMCHAR);

              vs = viSetAttribute( vi, VI_ATTR_ASRL_END_IN, VI_ASRL_END_TERMCHAR);

              vs = viSetAttribute( vi, VI_ATTR_IO_PROT, VI_PROT_4882_STRS);

       }

       

       else if( iIntfType == VI_INTF_GPIB) {

       }

       

       else if( iIntfType == 7) {

              vs = viPrintf( vi, "SYST:REN 1");

       }

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

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

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

MEAS:<meter_fn>?クエリを使用しているので、細かい測定条件は設定していません。インピーダンス測定は、絶対値、レジスタンス、リアクタンス、位相、すべて同時測定されているため、FETC?クエリを併用しています。インピーダンスの4種類のデータはすべて同時に測定されたものです。

 

       double adImpData[4];

       vs = viQueryf( vi,

              "MEAS:IMP:MAGN?;:FETC:IMP:RES?;REAC?;PHAS?",

              "%lf;%lf;%lf;%lf",

              &adImpData[0],

              &adImpData[1],

              &adImpData[2],

              &adImpData[3]

              );

       

       double dVoltData;

       vs = viQueryf( vi, "MEAS:VOLT?", "%lf", &dVoltData);

       

       double dCurrData;

       vs = viQueryf( vi, "MEAS:CURR?", "%lf", &dCurrData);

       

       vs = viClose( vi);

       vs = viClose( viRM);

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

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

次の例は、重畳電流(KFM2005)/測定交流電流(KFM2030)の設定をしてインピーダンスを測定するプログラムです。

重畳電流を16.5 mApp、周波数を1 kHzに設定し、移動平均回数を4に設定しています。ここではMEAS:<meter_fn>?クエリを使用しないで、READ?クエリを使用します。電圧、電流の測定はここでは省略します。KFM2030の場合には重畳電流16.5 mAppを、測定交流電流165 mAppに置き換えてください。

 

       vs = viPrintf( vi, "CONF:IMP");

       vs = viPrintf( vi, "IMP:CURR:AC:LEV 165E-4;FREQ 1000");

       vs = viPrintf( vi, "IMP:AVER:MOV:COUN 4");

       

       double adImpData[4];

       vs = viQueryf( vi,

              "READ:IMP:MAGN?;:FETC:IMP:RES?;REAC?;PHAS?",

              "%lf;%lf;%lf;%lf",

              &adImpData[0],

              &adImpData[1],

              &adImpData[2],

              &adImpData[3]

              );

       

       vs = viClose( vi);

       vs = viClose( viRM);

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

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

次の例は、インピーダンス測定を連続して5回測定するプログラムです。

トリガ回数が多いと測定に時間がかかります。ここでは*OPCコマンドを使用して、測定が完了したらサービスリクエストを発生するようにします。標準イベントステータスイネーブルレジスタ(ESE)のOPCビット(ビット0)と、サービスリクエストイネーブルレジスタ(SRE)のESBビット(ビット5)を設定しているのはそのためです。

測定データはコンマ区切りの複数データになるので、データの受け取りと実数変換はVISA viScanf/viQueryf関数の配列サポートを利用します。

測定の開始にINITコマンドを使用します。サービスリクエストの発生を待つためには、viWaitOnEvent関数を使用します。

電圧、電流の測定はここでは省略します。

 

       vs = viPrintf( vi, "CONF:IMP");

       vs = viPrintf( vi, "IMP:CURR:AC:LEV 165E-4;FREQ 1000");

       vs = viPrintf( vi, "IMP:AVER:MOV:COUN 4");

       vs = viPrintf( vi, "TRIG:COUN 5");

       

       //

    // Initiate measurement and wait for SRQ

    //

       vs = viPrintf( vi, "*ESE 1;*SRE 32;*CLS;INIT;*OPC");

       vs = viEnableEvent( vi, VI_EVENT_SERVICE_REQ, VI_QUEUE, 0);

       ViEventType et;

       ViEvent ev;

       do {

              vs = viWaitOnEvent( vi, VI_EVENT_SERVICE_REQ, 1000, &et, &ev);

       

              // wait for SRQ.

              // Do other job if you need...

       

       } while( ev == VI_NULL);

       vs = viClose(ev);

       vs = viDisableEvent( vi, VI_EVENT_SERVICE_REQ, VI_QUEUE);

       

       // End of waiting for SRQ

       

       double adImpMagn[5];

       double adImpRes[5];

       double adImpReac[5];

       double adImpPhas[5];

       

       int iNumData = 5;

       vs = viQueryf( vi, "FETC:IMP:MAGN?", "%,#lf", &iNumData, adImpMagn);

       vs = viQueryf( vi, "FETC:IMP:RES?", "%,#lf", &iNumData, adImpRes);

       vs = viQueryf( vi, "FETC:IMP:REAC?", "%,#lf", &iNumData, adImpReac);

       vs = viQueryf( vi, "FETC:IMP:PHAS?", "%,#lf", &iNumData, adImpPhas);

       

       

       vs = viClose( vi);

       vs = viClose( viRM);

 

上記の例はサービスリクエスト機能を使用するため、RS232Cでは動作しません。RS232Cの場合は測定開始とSRQ待ちの部分を、次の「OPCビット待ち」の処理に置き換えてください。

 

       //

    // Initiate measurement and wait for OPC bit

    //

       

       vs = viPrintf( vi, "*CLS;INIT;*OPC");

       int iEsr = 0;

       do {

              vs = viQueryf( vi, "*ESR?", "%d", &iEsr);

       

              // wait for OPC bit on *ESR register

              // Do other job if you need...

       

              Sleep(1000);

       

       } while( iEsr == 0);

       

       // End of waiting for OPC bit

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

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

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

一般にインピーダンス測定は時間がかかるため、1回のインピーダンス測定の間に電圧・電流を何度も測定できます。電圧・電流測定のトリガ回数を16にして、3秒インターバルで測定します。

 

       vs = viPrintf( vi, "FUNC:ALL");

       vs = viPrintf( vi, "CONF:IMP;VOLT;CURR");

       vs = viPrintf( vi, "IMP:CURR:AC:LEV 165E-4;FREQ 0.1");

       vs = viPrintf( vi, "TRIG:SEQ1:COUN 1;SOUR IMM");

       vs = viPrintf( vi, "TRIG:SEQ2:COUN 16;SOUR TIM;TIM 3.0");

       

       vs = viPrintf( vi, "*ESE 1;*SRE 32;*CLS;INIT;*OPC");

       vs = viEnableEvent( vi, VI_EVENT_SERVICE_REQ, VI_QUEUE, 0);

       

       ViEventType et;

       ViEvent ev;

       do {

              vs = viWaitOnEvent( vi, VI_EVENT_SERVICE_REQ, 1000, &et, &ev);

       

              // wait for SRQ.

              // Do other job if you need...

       

       } while( ev == VI_NULL);

       vs = viClose(ev);

       vs = viDisableEvent( vi, VI_EVENT_SERVICE_REQ, VI_QUEUE);

       

       

       double dImpMagn;

       double dImpRes;

       double dImpReac;

       double dImpPhas;

       

       vs = viQueryf( vi,

              "FETC:IMP:MAGN?;RES?;REAC?;PHAS?",

              "%lf;%lf;%lf;%lf",

              &dImpMagn,

              &dImpRes,

              &dImpReac,

              &dImpPhas

              );

       

       double adVolt[16];

       double adCurr[16];

       int iNumData = 16;

       vs = viQueryf( vi, "FETC:VOLT?", "%,#lf", &iNumData, adVolt);

       vs = viQueryf( vi, "FETC:CURR?", "%,#lf", &iNumData, adCurr);

       

       vs = viClose( vi);

       vs = viClose( viRM);