サンプルプログラム > サンプルコード(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では利用できません。
下記のコードは、後述するすべてのサンプルプログラムに共通の部分です。本製品と通信する前に実行する必要があります。
変数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");
}
次の例は、インピーダンス、電圧、電流を測定して、それぞれ実数型変数に格納するプログラムです。
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);
次の例は、重畳電流(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);
次の例は、インピーダンス測定を連続して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
次の例は、本製品の測定機能をフルに生かしてすべてのデータを同時に測定します。
一般にインピーダンス測定は時間がかかるため、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);