原创 利用LabWindows/CVI生成DLL,在C#中进行调用

2008-6-7 09:40 8334 4 5 分类: 测试测量

        最近在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, 00== 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的方法,调用其中的仪器读写控制函数。

PARTNER CONTENT

文章评论1条评论)

登录后参与讨论

jizzll_617398179 2008-6-15 16:39

不错 的

用户1322781 2008-6-12 21:08

不错!

用户165355 2008-3-14 10:59

恩,功能还是比较全面的……很好
相关推荐阅读
用户1079303 2008-07-19 10:25
NAT9914学习笔记(1)
1.       发送GPIB数据消息的基本流程(from nat9914_rm):(1)    确认T1 delay已经被正确设置;(2)    等待NAT9914被编程(向auxcr寄存器写入0x...
用户1079303 2008-06-27 23:05
NIOS系统中Avalon从外设的时序关系匹配
    Avalon总线是一种同步总线,在连接外设接口(例如USB、Ethernet接口芯片)的过程中,不可避免涉及到外设的时序关系问题。在外设寄存器读写的过程中,如何使得Avalon总线提供的chi...
用户1079303 2008-06-15 10:46
***_time_limited.sof的困惑
    最近在调试有关Quartus6.0+NIOS II+LWIP的程序,发现了一个问题。   我的Quartus6.0之前使用一直正常,而且能生成sof与pof文件。可是最近工程在编译之后只能生成...
用户1079303 2008-06-08 10:03
DE2开发板:NiosII+LWIP环境下DM9000A的驱动程序分析(web_server.c)
在DE2的开发板上,利用NiosII软核与LWIP,可以实现web服务。Terasic公司提供的DE2_WEB_SERVER DEMO提供了一个很好的范本,可以作为很好的研究对象。NIOS IDE提供...
用户1079303 2008-06-08 09:59
GPIB Overview
  What Is GPIB?   GPIB is a standardized interface that allows you to connect and control multiple d...
EE直播间
更多
我要评论
1
4
关闭 站长推荐上一条 /3 下一条