最近在C#环境中利用Agilent T&M ToolKit进行自动测试系统的程序编写工作。想法是利用Agilent T&M ToolKit中的Direct IO实现仪器的通信与控制,Data Analysis实现测量数据的分析处理,Data Visualization实现数据的图形化表示,C#实现用户界面与数据库访问功能。
对于测量接收机HP8902A,NI公司的网站上提供了LabVIEW Plug and Play (project-style)、LabVIEW Plug and Play、LabWindows/CVI三种类型的仪器驱动
(http://sine.ni.com/apps/utf8/niid_web_display.model_page?p_model_id=176),
看来这台经典仪器已经有很多人研究过了。我想利用LabWindows/CVI类型的驱动,首先在LabWindows/CVI将其生成为DLL文件,接着在C#中进行调用。下面简要介绍这一过程:
(1) 下载的LabWindows/CVI类型的驱动包括三个文件:hp8902a.c,hp8902a.h,hp8902a.fp。其中hp8902a.c对输出函数进行了定义,hp8902a.h对输出函数进行了声明,hp8902a.fp是LabWindows/CVI特有的函数面板文件。
(2) 利用New|Project from Template生成DLL模板,其中Dynamic-Link Library.c文件结构为:
//==============================================================================
//
// Title: Dynamic-Link Library
// Purpose: A short description of the library.
//
// Created on: 2008-2-19 at 10:25:58 by yp.
// Copyright: nudt. All Rights Reserved.
//
//==============================================================================
//==============================================================================
// Include files
#include <utility.h>
#include "Dynamic-Link Library.h"
//==============================================================================
// Constants
//==============================================================================
// Types
//==============================================================================
// Static global variables
//==============================================================================
// Static functions
//==============================================================================
// Global variables
//==============================================================================
// Global functions
/// HIFN What does your function do?
/// HIPAR x/What inputs does your function expect?
/// HIRET What does your function return?
int Your_Functions_Here (int x) //输出函数的定义体列于此处
{
return x;
}
//==============================================================================
// DLL main entry-point functions
int __stdcall DllMain (HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
{
switch (fdwReason) {
case DLL_PROCESS_ATTACH: //PROCESS ATTACH在启动时由系统触发 ,调用 InitCVIRTE 进行引擎机制的初始化
if (InitCVIRTE (hinstDLL, 0, 0) == 0)
return 0; /* out of memory */
break;
case DLL_PROCESS_DETACH: //PROCESS DETACH在调用结束时由系统触发 ,调用 CloseCVIRTE 释放动态链接库占用的内存。
CloseCVIRTE ();
break;
}
return 1;
}
int __stdcall DllEntryPoint (HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
{
/* Included for compatibility with Borland */
return DllMain (hinstDLL, fdwReason, lpvReserved);
}
(3)Dynamic-Link Library.h文件结构为:
//==============================================================================
//
// Title: Dynamic-Link Library
// Purpose: A short description of the interface.
//
// Created on: 2008-2-19 at 10:25:58 by yp.
// Copyright: nudt. All Rights Reserved.
//
//==============================================================================
#ifndef __DynamicLinkLibrary_H__
#define __DynamicLinkLibrary_H__
#ifdef __cplusplus
extern "C" {
#endif
//==============================================================================
// Include files
#include "cvidef.h"
//==============================================================================
// Constants
//==============================================================================
// Types
//==============================================================================
// External variables
//==============================================================================
// Global functions
int Your_Functions_Here (int x); //输出函数的声明
#ifdef __cplusplus
}
#endif
#endif /* ndef __DynamicLinkLibrary_H__ */
(4) 将hp8902a.c与hp8902a.h中的函数体及声明在上述文件中列出,即可Build出相应的dll文件。利用Dependency Walker可以查看其中的输出函数。
(5) 在C#/C++/VB中,可以采用静态调用以及动态调用LoadLibrary的方法,调用其中的仪器读写控制函数。
jizzll_617398179 2008-6-15 16:39
用户1322781 2008-6-12 21:08
用户165355 2008-3-14 10:59