利用VISA协议控制信号发生器by Delphi7

前言

大量重复手工测量数据,看上去,高科技,其实搬砖很无趣!还好,我有VISA神器!市场上大部分仪器都支持VISA协议编程控制。比如下图R/S公司的信号发生器,不过坑不少。R/S信号发生器

一、查手册

到公司网站下载手册,企查查企查查,找到一段有用的描述
在这里插入图片描述
表明该仪器支持多种物理连接如GPIB、串口和网口,而最便宜、方便的莫过于网口,网口支持VISA、VXI和HiSLIP协议。选择困难症又犯了,越高层的协议越方便,但依赖的软件包越多,还是用中层的VISA吧。
找到的例子程序说明如下:
2.0 Prerequisites

  • Microsoft Visual Studio 2005
  • National Instruments NI-488.2 Software 1.60 (or higher) (GPIB only)
  • National Instruments VISA 3.0 or Agilent I/O Library 14 (or higher)
  • National Instruments or Agilent GPIB board
  • rssma VXI Plug&Play Instrument Driver

3.0 How to use this example

After installing instrument driver unzip the example and open the solution
file (RSSMA_FM_Example.sln). Make an executable file and run it.
To generate signal, fill in the Resource String (by default it is GPIB::28).
Using controls set all parameters of the output signal. All parameters will …
需要安装VC++和好几个驱动,太啰嗦了,不尿性!
不能被牵着鼻子走,我只安装VISA驱动。

二、下载安装驱动

在这里插入图片描述

如上图,因本人win7是64位的,所以驱动的32位选项都是灰色不能用的。因憎恶.NET所以不安装它。蜜汁疑惑的地方是64/32-bit选项下只有64-bit,完全不讲武德啊!你究竟是64bit还是32bit呢。暗战多年的我隐约嗅到一丝不详的气息!

三、编程测试

在这里插入图片描述
驱动包自带的Sample例子一个但有如上图一大堆代码,鱼的记忆只有7秒,而我只有10秒,10秒内我是不可能看完的,超过我的耐心极限,不看啦!可恶的是还是VC++工程,需要安装几个G的VS,我先吐为净!
安装了一个仅有48M大小的Dev C++,然后设置include和lib路径如下:
在这里插入图片描述
那些冗长的测试代码是996或007爆肝者的事,我只要几行代码如下:

#include <stdio.h>
#include "visa.h"
ViSession defaultRM;
ViStatus status;

int main(void)
{
  status = viOpenDefaultRM(&defaultRM);
  if (status < VI_SUCCESS)
      printf("Can't open a session to the VISA Resource Manager!\n");
 else
 	  printf("Open Visa driver OK!\n");
   return 0;
}

编译只用了0.5秒,运行时却悲剧了,直接闪退崩溃。我的Dev C++用的是64bit的gcc编译器,链接的也是RS的64bit库,应该没有问题,可是这正是错误的根源!没有无缘无故的恨,憎恨MS是有原因的,RS的64bit库只能在VC++下正常使用! 垄断做手脚成了习惯了。
而下图路径下居然有32bit的Visa库,原来RS嘴上说64位,其实还有32位,又把我骗了: 在这里插入图片描述
将Dev c++ 设置为32bit编译器,链接以上32bit库,一切OK,世界终于平静了。

四、编写正式应用

根据设计模式的原则,应该将内核与界面(UI)分离,所以将仪器的控制写成DLL库供界面调用。

#include <stdio.h>
#include "visa.h"
 
static ViSession defaultRM;
static ViSession viDev;
static ViStatus status;
const float Max_Freq = 40;  // GHz
const float Max_Pow  = 30;  // dBm
 
DLLIMPORT int InitVI(const char * pAddress);
DLLIMPORT int CloseVI(void);
DLLIMPORT ViStatus SetFreqPow(double dBm, double Val, int Hz);

界面可以用Labview/Matlab/C#/VB/Delphi,前面几个都太庞大了,动不动就几个G,还要依赖运行库,最后成品程序发布给客户,还需要配上庞大的运行库、甚至还要做些设置。
最后我还是选择Delphi7,几分钟就写好,一个exe交给客户,不管winxp还是win7/10都可以正常使用,无需任何额外库和设置。
如下在Delphi7中声明下我们自己写的vi.dll库即可。

function  InitVI(Address:PChar):Integer; external'./vi.dll';
function  CloseVI():Integer;   external'./vi.dll';
function  SetFreqPow(dBm, Val:Double; Hz:Integer):Integer; external'./vi.dll';

画个界面,调用以上三个函数即可:
在这里插入图片描述
仪器地址可以在仪器面板上查到如下:
在这里插入图片描述

五、总结

编程解决实际问题,要善于抓住问题的主线,即教员说的主要矛盾,绕开那些没用的花花草草,不要陷入敌人的圈套,最后用最简单朴素的烹饪方法达到目的。
在这里插入图片描述

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值