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

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

  • 前言
  • 一、查手册
  • 二、下载安装驱动
  • 三、编程测试
  • 四、编写正式应用
  • 五、总结

前言

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

一、查手册

到公司网站下载手册,企查查企查查,找到一段有用的描述
利用VISA协议控制信号发生器by Delphi7_第2张图片
表明该仪器支持多种物理连接如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驱动。

二、下载安装驱动

利用VISA协议控制信号发生器by Delphi7_第3张图片

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

三、编程测试

利用VISA协议控制信号发生器by Delphi7_第4张图片
驱动包自带的Sample例子一个但有如上图一大堆代码,鱼的记忆只有7秒,而我只有10秒,10秒内我是不可能看完的,超过我的耐心极限,不看啦!可恶的是还是VC++工程,需要安装几个G的VS,我先吐为净!
安装了一个仅有48M大小的Dev C++,然后设置include和lib路径如下:
利用VISA协议控制信号发生器by Delphi7_第5张图片
那些冗长的测试代码是996或007爆肝者的事,我只要几行代码如下:

#include 
#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位,又把我骗了: 利用VISA协议控制信号发生器by Delphi7_第6张图片
将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';

画个界面,调用以上三个函数即可:
利用VISA协议控制信号发生器by Delphi7_第7张图片
仪器地址可以在仪器面板上查到如下:
利用VISA协议控制信号发生器by Delphi7_第8张图片

五、总结

编程解决实际问题,要善于抓住问题的主线,即教员说的主要矛盾,绕开那些没用的花花草草,不要陷入敌人的圈套,最后用最简单朴素的烹饪方法达到目的。
利用VISA协议控制信号发生器by Delphi7_第9张图片

你可能感兴趣的:(自动化控制,硬件编程,测试工具,tcp/ip,物联网)