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函数结合起来使用最好。