大量重复手工测量数据,看上去,高科技,其实搬砖很无趣!还好,我有VISA神器!市场上大部分仪器都支持VISA协议编程控制。比如下图R/S公司的信号发生器,不过坑不少。
到公司网站下载手册,企查查企查查,找到一段有用的描述
表明该仪器支持多种物理连接如GPIB、串口和网口,而最便宜、方便的莫过于网口,网口支持VISA、VXI和HiSLIP协议。选择困难症又犯了,越高层的协议越方便,但依赖的软件包越多,还是用中层的VISA吧。
找到的例子程序说明如下:
2.0 Prerequisites
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
#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';
画个界面,调用以上三个函数即可:
仪器地址可以在仪器面板上查到如下:
编程解决实际问题,要善于抓住问题的主线,即教员说的主要矛盾,绕开那些没用的花花草草,不要陷入敌人的圈套,最后用最简单朴素的烹饪方法达到目的。