#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”);

GPIB编程控件指令相关推荐

  1. Xamarin XAML语言教程控件模板的模板绑定

    Xamarin XAML语言教程控件模板的模板绑定 控件模板的模板绑定 为了可以轻松更改控件模板中控件上的属性值,可以在控件模板中实现模板绑定功能.模板绑定允许控件模板中的控件将数据绑定到公共属性上. ...

  2. 模态对话框阻塞主线程的话不影响其他线程操作主线程控件(不阻塞)

    Task.Factory.StartNew(() => {Thread.Sleep(5000);this.Invoke(new Action(() => {this.button7.Tex ...

  3. 关于跨线程操作GUI线程控件的疑问

    单元测试能够帮助开发人员确保所开发的模块.类以及类中的方法等的正确性,在项目开发过程中,及时进行单元测试能够避免不必要的BUG以及提高测试效率. 在本文中,我们会分别来学习如何使用MSTest.xUn ...

  4. Python GUI库TKinter子线程与主线程控件传递消息策略

    TKinter GUI库没有像MFC那样的强制安全策略,在MFC中子线程无法直接控制主线程中的GUI控件,比如修改文本框或者按钮上的内容.因为如果只有2个线程,即一个主线程和一个子线程的情况下子线程直 ...

  5. C#.NET跨线程控件的相关操作

    在.NET中,如果我们在非UI线程上访问窗体上的控件的时候,会产生一个跨线程调用的异常,那么如何处理这种情况呢?在上一章中,我介绍了使用Control.Invoke方法,如果你不习惯使用委托,那么.N ...

  6. 【开源】Winform甘特日程控件GanttPlanner V1.0发布

    背景 做过WinForm和Web的朋友们可能都有这个感觉:做用户体验良好的WinForm应用程序要远比Web应用程序困难的多.这是因为Web应用程序毕竟只靠HTML+CSS+JS就能做出各种强大的功能 ...

  7. java工单自动化流程控件,一种工单审批的自动化处理方法及系统与流程

    本发明涉及IT运维技术领域,尤其涉及一种工单审批的自动化处理方法及系统. 背景技术: 工单系统是企业内部工作任务传达的系统,用于记录.处理.跟踪.审批一项工作执行情况,工单系统的普遍现状是由申请人在工 ...

  8. 银光甘特图/日历图/排程控件GTP.NET for Silverlight介绍及正版下载

    2019独角兽企业重金招聘Python工程师标准>>> GTP.NET for Silverlight是Silverlight下的控件包,提供了交互式的甘特图以及日程安排图,达到时间 ...

  9. python工程控件_工程脚本插件方案 - c集成Python基础篇

    序: 为什么要集成脚本,怎么在工程中集成Python脚本. 在做比较大型的工程时,一般都会分核心层和业务层.核心层要求实现高效和稳定的基础功能,并提供调用接口供业务层调用的一种标准的框架划分.在实际中 ...

最新文章

  1. CS架构和BS架构的发展趋势即在图像处理软件中的应用
  2. android studio资产目录,在Android Studio中设置单元测试的自定义资产目录
  3. 开源项目托管GitHub简单使用
  4. Cloud 学习笔记10.MapReduce 容错
  5. 2021Q1美妆行业季度观察报告
  6. Android开发笔记(一百四十七)标签布局TabLayout
  7. 各个行业的前端静态页面模板
  8. MAC配置thinkPHP的心路历程(课设vue-tpadmin商城)
  9. php通过COM类调用组件
  10. android跑马灯效果横向,Android TextView 横向滚动(跑马灯效果)
  11. 01_测试基础知识---微信公众号测试点
  12. 看到的有意思的文章(一)
  13. 什么是keep-alive?
  14. java背单词软件_背单词的java小软件
  15. AE PR模板基本图形预设素材包动态字幕文字标题排版动画预设效果
  16. [机器学习]三行代码快速划分交叉训练中训练集和验证集
  17. 如何把图片转换成渐进式图片
  18. 身份证OCR识别在远程开户中的应用
  19. 三八节送什么礼物好?最适合送礼的无线蓝牙耳机品牌排名
  20. 【华人学者风采】李凯 普林斯顿大学

热门文章

  1. C --cp2 类似cat工具的小程序。
  2. jetty9 Form too large 异常解决方案
  3. win7系统计算机文件夹缓慢,win7系统搜索文件很慢的两种解决方法
  4. STM32F103C8T6引脚笔记
  5. HTML怎么设艺术字体,用CSS设计艺术字集锦(二)
  6. A-star 算法原理分析
  7. 微信公众平台数据统计功能的作用是什么?
  8. 怎样删除计算机中的来宾用户密码,win7怎么删除来宾账户_win7如何删除来宾账户...
  9. 钉钉邮箱登录入口_钉邮的使用攻略②
  10. el-table单元格中加上横向柱状图