agilent VISA项目开发小记

2011年10月4日 20:03

整个国庆节一直都在搞这个东西,就是编写一个针对8003/8013卡的应用程序。到现在为止,程序基本将近完成,功能尚待完善,调试和维护工作也会很麻烦。

首先,介绍一下8003/8013卡,其英文全名是“MODEl  8003/8013 Ethernet---Parallel Interface”,可译为“8003/8013 以太网板卡---并行接口”。 8003/8013是Agilen公司的一个最新产品,用户相对还是比较陌生,所以在这方面搞点开发,还是很有必要。8003/8013卡上有接线头,通过导线连接到电源表上,通过电源表供电。通过以太网,用网线使之连接至电脑网口或者局域网内,在windows下可对其进行开发。板卡上有8个提示灯,功能分别如下 PWR:Indicates power on ;LAN :Indicates tht the unit isready and is connected to an active LAN; ACT:Indicates message are beingtransferred between unit and LAN;RDY:Indicate the unit has passed selftest;Talk:indicates the unit was send a device_read command;LSTN: indicates theunit was send a device_write command.

8003/8013的VISA ResourceStrings are :

 TCPIP::ip::insto::INSTR  forcommands and data transfer

  TCPIP::ip::inst1::INSTR  for transparent data transfer

开发中使用第一个工具资源地址。

在后来,进入了一个误区,我一直以为通过IP地址和端口就可以运用套接字对卡进行操作,于是花了大部分时间在套接字上,而且把套接字的客户端额服务器端都写好了,当调试时发现,数据无法发送到8003/8013里,后来我以为insto应该是有一个初始化命令,于是就把TCPIP::ip::insto::INSTR当做一个命令发送给卡,结果卡片仍然没有数据回复,经检测发现数据在网线上传输了,但是没有到达板卡,既然没有到达板上,当然是不可能受到任何回复的。

8003/8013的使用说明是厚厚的一本全英文,网上没有关于8003/8013的中文介绍,于是就上了Angilen的网站,硬着头皮在上面看了一遍又一遍,发现要想开发8003/8013,必须安装接口驱动,这个驱动就是VXI-11compliantVISA Library ,庆幸的是一个师兄那里恰好有安捷伦的库,于是就安装好了,并add interface,add instruments,修改了部分配置后,才发现久违的8003/8013终于有反应了。

虽然现在写VISA程序的不少,但是大部分还停留在VB和C++上,在.net环境下要想配置好VISA,真是难上加难,配了好几天,没有成功,果断放弃了开发应用程序界面最方便的C#.net,转向了vc++。MFC,看来还是要重新好好搞搞了。从安捷伦库安装目录下找到了最为关键的 VISA32.lib,visa.h,和visatype.h。后来师兄帮忙,把三个文件考进工程文件中,并添加到了环境中,并修改了一些参数配置,终于结束。当然代码编写过程中也存在不少郁闷的地方,总是出错,不过后来在师兄帮助下,算是都还得到了解决。

界面和后台代码写毕,输入8003/8013的Ip地址,8003/8013的IP地址是可以修改的,并得到了资源地址的字符串即 TCPIP0::10.10.150.254::inst0::INSTR,通过 viopen()函数,打开地址和接口,并开始向卡发送ViString格式的命令,发送代码之后紧接着就要进行接收。连接调试发送命令是:*IDN?,*esr?*clr?,之后都得到了正确的设备信息。

接下来就该进行设备信息读出并重新写入了,发送和读操作已经完成,至于写操作明天再说吧。

 

 

 

人生总有很多不情愿的事情。但是,你却深陷其中。真的不知道生活本来就应该是这样,如果生活本来是去改变的,那么脱离了天道自然的本质,那还是我自己吗?也许是,衣暖饭饱之后的无聊打发吧,总是在做一些无聊。每天看到好友状态里同学的说说,我就感觉热心沸腾,敬佩你们。

百无聊赖之中还算是做了一些有点意思的事情。深知,苦海中寻觅的痛苦,点点滴滴都是汗水。

关于8013/8003衰减矩阵硬件控制程序。

1、 Visual c++下的环境配置:

Linking to VISALibraries

Your applicationmust link to the VISA import library as follows,

assuming defaultinstallation directories and Microsoft compilers:

    C:\VXIPNP\WinNT\lib\msc\visa32.lib

The followingsteps will help you do this. This information is specific to

your developmentenvironment.

Microsoft VisualC++ Version 6.0 Development Environment

1 Use the Filemenu to create a new project or open an existing project.

2 Select Project> Settings from the menu and click the C/C++ tab.

3 Select CodeGeneration from the Category list box and select

Multi-Threadedusing DLL from the Use Run-Time Libraries list

box. (VISArequires these definitions for Win32.) Click OK to close

the dialog box.

4 Select Project> Settings from the menu. Click the Link tab and add

visa32.lib tothe Object/Library Modules list box. Optionally,

you may add thelibrary directly to your project file. Click OK to

close the dialogbox.

5 You may wantto add the include files and library files search paths.

They are set asfollows:

• Select Tools > Options from the menu.

• Click the Directories tab to set the include file path.

• Select Include Files from the Show Directories For list box.

2、 关于visa程序的编写命令,是很简单的,只有几个发送和接收而已。

This exampleprogram queries a GPIB device

anidentification string and prints the

results. Notethat you must change the addre

*/

#include<visa.h>

#include<stdio.h>

void main () {

ViSessiondefaultRM, vi;

char buf [256] ={0};

/* Open sessionto GPIB device at address 2

viOpenDefaultRM(&defaultRM);

viOpen(defaultRM,

"GPIB0::22::INSTR",VI_NULL,VI_NULL,

         &vi);

/* Initializedevice */

viPrintf(vi,"*RST\n");

/* Send an *IDN?string to the device */

viPrintf(vi,"*IDN?\n");

/* Read results*/

viScanf(vi,"%t", buf);

/* Print results*/

printf("Instrumentidentification string:

%s\n",buf);

/* Close session*/

viClose(vi);

viClose(defaultRM);}至于通过这些东西,能做多少事情,那是自己的造化了。

3、 关于数据库。

1》添加类 ADOConn 头文件如下

 #pragma once

#import "c:\program files\commonfiles\system\ado\msado15.dll" \

no_namespace rename ("EOF","adoEOF")rename("BOF","adoBOF")

 

class ADOConn

{

public:

ADOConn(void);

~ADOConn(void);

_ConnectionPtr m_pConnection;

_RecordsetPtr m_pRecordset;

 

void OnInitADOConn(void);

void ExitConnect(void);

_RecordsetPtr& GetRecordSet(_bstr_t bstrSQL);

BOOL ExecuteSQL(_bstr_t bstrSQL);

};

.cpp文件如下

#include"StdAfx.h"

#include"ADOConn.h"

 

ADOConn::ADOConn(void)

{

}

 

ADOConn::~ADOConn(void)

{

}

_RecordsetPtr&ADOConn::GetRecordSet(_bstr_t bstrSQL)

{

try{

        if (m_pConnection==NULL)

        {

          OnInitADOConn();

        }

        m_pRecordset.CreateInstance(_uuidof(Recordset));

m_pRecordset->Open(bstrSQL,m_pConnection.GetInterfacePtr(),adOpenDynamic,adLockOptimistic,adCmdText);

}

catch(_com_error e)

{

      e.Description();

}

return m_pRecordset;

}

BOOLADOConn::ExecuteSQL(_bstr_t bstrSQL)

{

_variant_t RecordsAffected;

try

{

        if (m_pConnection==NULL)

        {

               OnInitADOConn();

        }

        m_pConnection->Execute(bstrSQL,NULL,adCmdText);

        return TRUE;

}

catch (_com_error e)

{

        e.Description();

        return FALSE;

}

}

voidADOConn::OnInitADOConn(void)

{

::CoInitialize(NULL);

try

{

        m_pConnection.CreateInstance("ADODB.Connection");

        CString connectionStr="Driver={SQLServer};Server=(local);Database=studyvc;UID=sa;PWD=123456"; 

        m_pConnection->Open((_bstr_t)connectionStr,"","",adModeUnknown); 

 

 

      //

  //_bstr_t strConnect="uid=sa;pwd=123456;DRIVER=SQL Server;DBQ=studyvc";

  //m_pConnection->Open(strConnect,"","",adModeUnknown);

}

catch(_com_error e)

{

        AfxMessageBox(e.Description());

}

}

 

voidADOConn::ExitConnect(void)

{

if (m_pRecordset!=NULL)

{

        m_pRecordset->Close();

}

m_pConnection->Close();

::CoUninitialize();

}

2》关于调用 刷新listCOntrol

void  CcdatabaseDlg::updatem_grid()

{

m_grid.DeleteAllItems();

ADOConn m_AdoConn;

m_AdoConn.OnInitADOConn();

CString sql;

sql.Format("select * from 用户信息");

_RecordsetPtr m_pRecordset;

m_pRecordset=m_AdoConn.GetRecordSet((_bstr_t)sql);

while(m_AdoConn.m_pRecordset->adoEOF==0)

{

        CString un,pwd;

        un=m_pRecordset->GetCollect("UserName");

        pwd=m_pRecordset->GetCollect("PassWord");

        m_grid.InsertItem(0,"");

        m_grid.SetItemText(0,0,un);

        m_grid.SetItemText(0,1,pwd);

        m_pRecordset->MoveNext();

}

m_AdoConn.ExitConnect();

 

}

3.》添加记录void  CcdatabaseDlg::addnew()

{

 

    ADOConn m_AdoConn;

m_AdoConn.OnInitADOConn();

_bstr_t sql;

sql="select * from 用户信息";

_RecordsetPtr m_pRecordset;

m_pRecordset=m_AdoConn.GetRecordSet(sql);

CString username,passsword;

GetDlgItem(IDC_EDITusername)->GetWindowText(username);

GetDlgItem(IDC_EDITpwd)->GetWindowText(passsword);

        m_pRecordset->AddNew();

       m_pRecordset->PutCollect("UserName",(_bstr_t)username);

        m_pRecordset->PutCollect("PassWord",(_bstr_t)passsword);

        m_pRecordset->Update();

        m_AdoConn.ExitConnect();

MessageBox("保存成功");

m_grid.DeleteAllItems();

updatem_grid();

 

}

4》其他类似,只需要把sql命令写好就行了。关于数据库操作,觉得把记录集和execute函数结合起来使用最好。

你可能感兴趣的:(VISA,SQ,agilent,scpi)