VC_GPIB_Demo - 日理万妓 2022-07-15 03:20 150阅读 0赞 \#include "stdafx.h" \#include "C:\\Program Files\\IVI Foundation\\VISA\\WinNT\\agvisa\\include\\visa.h" \#pragma comment(lib,"C:\\\\Program Files\\\\IVI Foundation\\\\VISA\\\\WinNT\\\\agvisa\\\\lib\\\\msc\\\\agvisa32.lib") \#include <stdio.h> void main () \{ ViSession defaultRM, vi; char buf \[256\] = \{0\}; /\* Open session to GPIB device at address 22 \*/ viOpenDefaultRM (&defaultRM); viOpen (defaultRM, "GPIB0::22::INSTR", VI\_NULL,VI\_NULL, &vi); /\* Initialize device(Reset) \*/ viPrintf (vi, "\*RST\\n"); /\* Send an \*IDN? string to the device \*/ viPrintf (vi, "\*IDN?\\n"); /\* Read results \*/ viScanf (vi, "%t", &buf); //viQueryf(vi, "\*IDN?\\n","%t",%buf);//上两条语句可用此条代替 /\* Print results \*/ printf ("Instrument identification string: %s\\n", buf); //信号源---特定的信号源可能命令不一样,需要参考编程文档 int freq=999; viPrintf(vi, "FREQ %dMHz\\n",freq); viPrintf(vi, "POW 0dBm\\n"); viPrintf(vi, "OUTP ON\\n"); //RF ON viPrintf(vi, "MOD ON\\n"); //调制开 //频谱仪 viPrintf(vi, "SYST:DISP:UPDate ON\\n");//屏幕显示,不显示速度较快 viPrintf(vi, "FREQ:CENT 999MHz\\n"); viPrintf(vi, "FREQ:SPAN 10MHz\\n"); viPrintf(vi, "CALC:MARK:AOFF\\n"); viPrintf(vi, "SWE:TIME 2s\\n");//扫描时间 viPrintf(vi, "SYST:PSAVE ON\\n");//省电模式 viPrintf(vi, "DISP:TRAC:Y:RLEV 10dBm\\n"); viPrintf(vi, "DISP:WIND:TRAC:Y:RLEV:OFFS 10dB\\n"); viPrintf(vi, "CALC:MARK:X 999MHz\\n");//MARK ON viPrintf(vi, "BAND:RES 100kHz\\n");//RBW viPrintf(vi, "BAND:VID 300kHz\\n");//VBW //自动校准需要单次扫描,连续扫描不准确 viPrintf(vi, "INIT:CONT OFF\\n"); //WAI用于同步,还有OPC等也可用于同步,仅用于overlapping command,sequential command //无用,不过用 viPrintf(vi, "INIT:IMM;\*WAI\\n"); viPrintf(vi, "CALC:MARK:MAX\\n"); //读取mark的值 viQueryf(vi, "CALC:MARK:Y?\\n","%t",buf); printf("The mark value is:%s.\\n",buf); //功率计 viPrintf(vi, "SENS:CORR:OFFS 31\\n");//外部补偿电平 db!!!!ok viPrintf(vi, "DISP:TRAC:VCENT 55dBm\\n");//参考电平 viPrintf(vi, "TRIG:LEV 40dBm\\n");//触发电平 dBm viPrintf(vi, "TRIG:DEL 0\\n");//触发事件位置us ns/div us/div ms/div viPrintf(vi, "DISP:PULS:TIMEBASE 10us\\n");//时间单位 (moren s) 100us viPrintf(vi, "DISP:TRAC:VSCALe 5dB\\n");//db/格 db dBm,dBV,dBmV,dbuV dBuV //网分仪 viPrintf(vi, "SYST:DISP:UPDate ON\\n"); viPrintf(vi, "SWE:COUnt 12\\n"); viPrintf(vi, "CALC:PAR:SEL 'CH1\_S11\_1'\\n"); viPrintf(vi, "CALC:PAR:DEF 'My\_S11',s11\\n"); // viPrintf(vi, "CALCulate1:PARameter:SELect 'Ch1Trc2' 'S21'\\n"); viPrintf(vi, "SYST:DISP:UPDate ON\\n"); viPrintf(vi, "CALC:FORM PHAS\\n"); viPrintf(vi, "FORMat ASCII\\n"); viQueryf(vi, "INITiate1:CONTinuous OFF;\*OPC?\\n","%s", buf); viPrintf(vi, "SENS1:FREQ:STAR 1000MHz\\n"); viPrintf(vi, "SENS1:FREQ:STOP 1125MHz\\n"); viPrintf(vi, "SENS1:SWE:POIN 126\\n"); viPrintf(vi, "OUTP1 OFF\\n"); viPrintf(vi, "SOUR:POW -7\\n"); viPrintf(vi, "CALC1:MARK1 ON\\n"); // /\* Close session \*/ viClose(vi); viClose(defaultRM); while(1);//pause for see the result. \} /\* 一段VC写的VISA GPIB控制代码。 注意事项: 1.必须先安装Agilent IO Library驱动,本人添加的是默认位置的库; 装了驱动后有很多很好的文档C:\\Program Files\\Agilent\\IO Libraries Suite\\Manuals\\visa.pdf 2.安捷伦提供SICL 和 VISA两种库,不推荐用SICL,因为VISA更通用, NI也用VISA,函数名一致,都是viOpenDefaultRM,viOpen,viPrintf,viQueryf,viClose。 3.GPIB是用来控制电子仪器的,主要用在自动化控制,测试上。标准是SCPI,可以google下。 4.其实不难,但要多实践,只是调用API(头文件visa.h,库agvisa32.lib),API常用的就是几个, viOpenDefaultRM,viOpen,viPrintf,viQueryf,viClose... 还有viSetAttribute,viScanf等; viSetAttribute(vi,VI\_ATTR\_TMO\_VALUE,20000);//超时时间20s 其他的主要是SCPI命令,大多是标准化的,查查编程文档即可。 5.较新的技术是: LXI(LAN Extention Interface),网口控制, 因为一个方面是GPIB接口较贵(3k-5k),设备也只能接十几个(通常足够了); 6.扫描时需要单次同步,这样才准确; 7,应该多在Agilent和NI官网看看。 8.好书:《NI-VISAProgrammersMan》,《Agilent VISA User's Guide》 9.自动搜索仪器,根据\*IDN知道什么仪器 ViChar buffer\[255\]; ViRsrc mathes=buffer; ViUInt32 nmatched; ViFindList list; viFindRsrc(defaultRM,"GPIB?\*INSTR",&list,&nmatched, matched); viFindNext(list,matches); viFindNext(list,matches); ... viClose(list); 10. 测量多个数据可能用到strtok函数,或直接保存到一个数组里; 11.至于GPIB规范,总线电缆 包括16根信号线和9根地线。16根信号线中,8根为数据线,5根 为接口管理线,3根为握手线。IFC,ATN,了解即可。 12.FORMAT ASCii | In 自动校准用,写多了也没什么意思了。 //\*/ 信号源 //信号源设置较少,主要设置频率和功率。 viPrintf(vi\_sig, "FREQ 999MHz\\n"); viPrintf(vi\_sig, "POW 0dBm\\n"); viPrintf(vi\_sig, "OUTP ON\\n"); //射频开 viPrintf(vi\_sig, "MOD ON\\n"); //调制开 其他滤波器什么的,很少用。 最新的仪器有有个很强大的功能,按下某个键即可显示其相应的SCPI命令, 于此我们不用查编程文档了,真是爽歪歪。 viPrintf(vi\_sig,"DM:IQ:STATE ON\\n"); // viPrintf(vi\_4438c, "OUTP:MOD:STAT OFF\\n");// // viPrintf(vi\_4438c,"DM:STATE ON\\n"); //频谱仪 viPrintf(vi\_spec, "SYST:DISP:UPDate ON\\n"); viPrintf(vi\_spec, "FREQ:CENT %dMHz\\n",m\_cent\_freq); viPrintf(vi\_spec, "FREQ:SPAN %dMHz\\n",m\_span); viPrintf(vi\_spec, "DISP:WIND:TRAC:Y:RLEV %ddBm\\n",m\_rlevel); viPrintf(vi\_spec, "BAND:VID %dkHz\\n",m\_rbw); viPrintf(vi\_spec, "BAND:RES %dkHz\\n",m\_vbw); viPrintf(vi\_spec, "CALC:MARK:AOFF\\n"); // char buf\[255\]; viPrintf(vi\_spec,"INIT:CONT OFF\\n"); viPrintf(vi\_spec,"INIT:IMM;\*WAI\\n"); viPrintf(vi\_spec,"CALC:MARK:MAX\\n"); viPrintf(vi\_spec,"\*WAI\\n"); viQueryf(vi\_spec,"CALC:MARK:Y?\\n","%t",buf); viPrintf(vi\_spec,"\*WAI\\n"); viPrintf(vi\_spec,"INIT:CONT ON\\n"); viPrintf(vi\_spec, "SWE:TIME 2s\\n"); //功率计 /\* viPrintf(vi\_boonton,"SENS:CORR:OFFS 31dBm\\n");//外部补偿电平 viPrintf(vi\_boonton,"DISP:TRAC:VCENT 55dBm\\n");//参考电平 viPrintf(vi\_boonton,"TRIG:LEV 40dBm\\n");//触发电平 viPrintf(vi\_boonton,"DISP:PULS:TIMEBASE 10us\\n");//时间单位 viPrintf(vi\_boonton,"DISP:TRAC:VSCALe 5dB\\n");//db/格 viPrintf(vi\_boonton,"\*CLS\\n"); viPrintf(vi\_boonton,"CALC:MODE PULSE\\n"); viPrintf(vi\_boonton,"DISP:PARA:MODE MEAS\\n"); viPrintf(vi\_boonton,"SENS:CORR:OFFS 0\\n");//0dB//外部补偿电平 viPrintf(vi\_boonton,"TRIG:LEV 0\\n");//触发电平0 viPrintf(vi\_boonton,"DISP:TRAC:VCENT 0\\n");//参考电平 viPrintf(vi\_boonton,"DISP:TRAC:VSCALe 5\\n");//db/格 10 viPrintf(vi\_boonton,"TRIG:DEL 0\\n");//触发事件位置s 0 viPrintf(vi\_boonton,"DISP:PULS:TIMEBASE 5us\\n");//pow viPrintf(vi\_boonton,"DISP:PULS:TIMEBASE 5us\\n"); viPrintf(vi\_boonton,"\*WAI\\n"); // viQueryf(vi\_boonton,"FETCH:INTER:MAX ?\\n","%t",buf); viQueryf(vi\_boonton,"FETCH:ARRAY:AMEA:POW ?\\n","%t",buf); viPrintf(vi\_boonton,"TRIG:SLOP POS\\n"); viPrintf(vi\_boonton,"DISP:PULS:TIMEBASE 100ns\\n"); viPrintf(vi\_boonton,"\*WAI\\n"); viQueryf(vi\_boonton,"FETCH:ARRAY:AMEA:TIM ?\\n","%t",buf\_time); viQueryf(vi\_boonton,"FETCH:INTER:MAX ?\\n","%t",buf\_p);//0410 viQueryf(vi\_boonton,"FETCH:ARRAY:AMEA:POW ?\\n","%t",buf\_p); viPrintf(vi\_boonton,"\*WAI\\n"); str\_time=buf\_time;count=0; /测试下降沿 viPrintf(vi\_boonton,"TRIG:SLOP NEG\\n"); viPrintf(vi\_boonton,"\*WAI\\n"); viQueryf(vi\_boonton,"FETCH:ARRAY:AMEA:TIM ?\\n","%t",buf\_time); viQueryf(vi\_boonton,"FETCH:ARRAY:AMEA:POW ?\\n","%t",buf\_p2); // viQueryf(vi\_boonton,"FETCH:INTER:MAX ?\\n","%t",buf\_p2);//均值 viPrintf(vi\_boonton,"\*WAI\\n"); // viQueryf(vi,"FETCH:INTER:AVER?\\n","%t",buf);READ:INTER:AVER viQueryf(vi,"FETCH:INTER:MAX?\\n","%t",buf); READ:INTER:MAX // viPrintf(vi\_zvb, "SYST:DISP:UPDate ON\\n"); viPrintf(vi\_zvb, "SWE:COUnt %d\\n",m\_point); viPrintf(vi\_zvb, "CALC:PAR:SEL 'CH1\_S11\_1'\\n"); viPrintf(vi\_zvb, "CALC:PAR:DEF 'My\_S11',s11\\n"); // viPrintf(vi\_zvb, "CALCulate1:PARameter:SELect 'Ch1Trc2' 'S21'\\n"); viPrintf(vi\_zvb, "SYST:DISP:UPDate ON\\n"); viPrintf(vi\_zvb, "CALC:FORM PHAS\\n"); viPrintf(vi\_zvb, "FORMat ASCII\\n"); viQueryf(vi\_zvb, "INITiate1:CONTinuous OFF;\*OPC?\\n","%s", ValueStr); viPrintf(vi\_zvb, "SENS1:FREQ:STAR 1000MHz\\n"); viPrintf(vi\_zvb, "SENS1:FREQ:STOP 1125MHz\\n"); viPrintf(vi\_zvb, "SENS1:SWE:POIN 126\\n"); viPrintf(vi\_zvb, "OUTP1 OFF\\n"); viPrintf(vi\_zvb, "SOUR:POW -7\\n"); viPrintf(vi\_zvb,"CALC1:MARK1 ON\\n");
还没有评论,来说两句吧...