LabVIEW是NI公司的数据采集设备的标准平台,在其上调用NI-DAQmx驱动和接口函数能够高效的开发数据采集和控制程序。但作为一种图形化的开发语言,使用LabVIEW开发涉及算法和流程控制的大型应用程序还是显得力不从心。因此在C#和VB等.net开发工具中实现NI-DAQmx驱动的灵活调用,对于数据采集设备的广泛应用意义重大,常见的方法有:

1、使用NI公司为Visual Studio提供的集成式开发套件Measurement Studio,它带有的ActiveX和.NET控件,以及面向对象的数据采集硬件接口。但由于Measurement Studio属于付费软件,成本较高,且进一步造成Measurement Studio的开发资源不多见,开发难度较大。

2、LabVIEW具有创建.NET的DLL的功能,可以把LabVIEW下开发的数据采集卡驱动软件打包成可供Visual Studio .NET方便调用的动态链接库,大大降低数据采集软件开发的难度和成本。

在使用这一功能的同时,我还意外的发现在LabVIEW环境下使用MathScript RT节点,通过Matlab的M语言开发的算法也能够封装在DLL中,为.NET下的算法开发提供一种“捷径”。以下内容欢迎转载,但请注明出处: https://www.cnblogs.com/helesheng

一、在LabVIEW中开发DLL

打开LabVIEW,创建一个项目。

在弹出的项目浏览器窗口中重命名项目名称为“测试DLL项目”,右键单击项目浏览器中的“我的电脑”顺序选择“新建”->“VI”,创建一个名为“单次采集有限样本数.vi”的VI。

在该VI的程序框图界面输入以下数据采集卡采集数据的程序。实现用10KSPS的速度,从DEV1设备的通道0(ai0)连续采集指定点数的数据,并将之显示在波形图控件上。其中采集数据点数通过数值输入控件“samples per channel”在前面板输入得到。为方便实现DLL输出接口,下图的程序框图还将采样结果输出到了名为data的显示控件数组中。

右键单击前面板窗口中单击右上角的连线端子图标,在弹出菜单中选择“模式”,以及一个输入端子和一个输出端子的模式(输入和输出端子的数量可以根据需要DLL封装的函数的需要确定)。

在工具选板中选择“连线”工具将连线端子图标左侧的输入端子连接到前面板上的数值输入控件“samples per channel”,图标右侧的输出端子连接到前面板上的数字显示控件“data”。连线端子的颜色将随所连接控件的数据类型发生改变。

在项目浏览器中右键单击“程序生成规范”选择新建->.NET互操作程序集。

在弹出的互操作程序集属性页面中选择左侧类别中的“信息”,填写DLL相关信息,这些命名将在C#调用DLL时用到。

在左侧类别中选择 “源文件”,并在项目文件中选择需要封装为DLL的VI,单击下图中向右的蓝色箭头,将其搬移到右侧的“导出”窗口中。

在随即弹出的定义VI原型窗如下图所示。

将采集结果data作为returnvalue返回,同时删去左侧参数框中的data,配置后定义VI原型窗口变为下图所示的样子。

在“预览”窗口单击生成预览可以预览将要生成的DLL文件,检查路径配置正确后,单击下方的生成按钮,即可在指定目录生成可供调用的DLL库。

二、在C#中调用LabVIEW生成的DLL

在VS的C#开发环境中新建一个工程。右键单击“解决方案资源管理器”中的“引用”条目,选择“添加引用”。

添加之前在LabVIEW中创建的DLL文件。

在“解决方案资源管理器”中双击DLL,可以查看该DLL中的方法。

在窗体代码中添加之前在LabVIEW中指定的命名空间。

之后就可以在C#代码中调用DLL中的数据采集设备控制函数了。

下图是我用USB-6009采集的LED灯泡工作时的电流。其中使用了Measurement Studio中的波形显示控件WaveformGraph控件(实际使用时,不一定要安装Measurement Studio)。

三、在LabVIEW中封装带有Matlab脚本的DLL

突发奇想,LabVIEW的MathScript RT节点可以包括Matlab的M脚本算法,那是否可以通过LabVIEW将Matlab开发的算法打包到可供C#调用的DLL中呢?试了一下,还真可以!

如下图所示,在LabVIEW程序框图中插入一个MathScript RT节点,对采集到的信号计算快速傅里叶变换FFT,结果同样作为VI的输出。

更新LabVIEW项目浏览器中的互操作程序集和C#中的引用,不修改之前的代码,就看到了上面电流信号的FFT幅频特性图。

LabVIEW生成.NET的DLL——C#下调用NI数据采集设备功能的一种方法 [原创www.cnblogs.com/helesheng]的更多相关文章

  1. WPF编程,指定窗口图标、窗口标题,使得在运行状态下任务栏显示窗口图标的一种方法。

    原文:WPF编程,指定窗口图标.窗口标题,使得在运行状态下任务栏显示窗口图标的一种方法. 版权声明:我不生产代码,我只是代码的搬运工. https://blog.csdn.net/qq_4330793 ...

  2. Shell脚本中引用、调用另一个脚本文件的2种方法

    Shell脚本中引用.调用另一个脚本文件的2种方法 http://www.jb51.net/article/67903.htm

  3. 痞子衡嵌入式:MCUXpresso IDE下设置代码编译优化等级的几种方法

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是MCUXpresso IDE下设置代码编译优化等级的几种方法. 最近公司芯片设计团队正在开发一款全新的基于 Cortex-M33 内核的 ...

  4. Qt下存储读写应用程序设置的三种方法

    一.简介 用户对应用程序经常有这样的要求:要求它能记住它的settings,比如窗口大小.位置和密码等等.有三种方法可以实现: 使用注册表: 使用配置文件(.ini): 使用自定义文件(例如.txt) ...

  5. Linux系统下修改环境变量PATH路径的三种方法

    这里介绍Linux的知识,比如把/etc/apache/bin目录添加到PATH中有三种方法,看完之后你将学会Linux系统下如何修改环境变量PATH路径,需要的朋友可以参考下 电脑中必不可少的就是操 ...

  6. wordpress调用置顶文章sticky_posts的三种方法

    有时我们在开发wordpress时需要调用置顶文章sticky_posts,怎么调用呢?几种写法,有用到query_post的,有用到WP_Query,也有用到is_sticky(),下面随ytkah ...

  7. 查找linux系统下的端口被占用进程的两种方法 【转】

    在linux下开发时,你的软件可能要使用某一个端口,或者想查找某一个端口是否被占用.需要怎么做呢??这的确是一个比较烦恼的问题,我也此为这个苦恼过.但是通过查找man手册,还是同事的交流.总结出来两种 ...

  8. C#写好的类库dll在别人调用的时候也能看到注释的方法

    1.用///的方法添加注释 2.项目的属性里面,要选上"生成XML注释文档" 菜单 Project -> 'xxxx' Properties -> Build -> ...

  9. 在电脑主机(MainFrame)中只需要按下主机的开机按钮(on()),即可调用其它硬件设备和软件的启动方法,如内存(Memory)的自检(check())、CPU的运行(run())、硬盘(Hard

    欢迎大家加入我的社区:http://t.csdn.cn/Q52km 社区中不定时发红包 文章目录 1.UML类图 2.源码 3.优缺点 1.UML类图 2.源码 package com.zheng; ...

随机推荐

  1. 背包问题-C语言实现

    转自:http://blog.csdn.net/tjyyyangyi/article/details/7929665 0-1背包问题 参考: http://blog.csdn.net/liwenjia ...

  2. Hibernate框架使用之环境搭建

    第一步:引入所需的jar包 第二步:创建实体类,配置实体类与数据表的映射关系 创建实体类 User.java package cn.hao.entity; public class User { /* ...

  3. netcore XmlDocument 使用Load和Save方法

    string path ="C://xxx/file" XmlDocument xmlDoc = new XmlDocument(); #if NET462 xmlDoc.Load ...

  4. ACwing02.01背包问题

    有\(N\)件物品和一个容量是\(V\)的背包.每件物品只能使用一次. 第\(i\)件物品的体积是\(v_i\),价值是\(w_i\). 求解将哪些物品装入背包,可使这些物品的总体积不超过背包容量,且 ...

  5. JAVA通过正则匹配html里面body标签的内容,去掉body标签

    /** * 获取html中body的内容 包含body标签 * @param htmlStr html代码 * @return */ public static String getBody(Stri ...

  6. 7、滑动窗口套路算法框架——Go语言版

    前情提示:Go语言学习者.本文参考https://labuladong.gitee.io/algo,代码自己参考抒写,若有不妥之处,感谢指正 关于golang算法文章,为了便于下载和整理,都已开源放在 ...

  7. c++设计模式概述之访问者

    代码写的不够规范,目的是为了缩短篇幅,实际中请注意. 参看: http://c.biancheng.net/view/1397.html 1.概述 类比生活中的场景,购物商场中的商品.顾客.收营员.商 ...

  8. 【LeetCode】385. Mini Parser 解题报告(Python)

    [LeetCode]385. Mini Parser 解题报告(Python) 标签: LeetCode 题目地址:https://leetcode.com/problems/mini-parser/ ...

  9. 【LeetCode】334. Increasing Triplet Subsequence 解题报告(Python)

    [LeetCode]334. Increasing Triplet Subsequence 解题报告(Python) 标签(空格分隔): LeetCode 题目地址:https://leetcode. ...

  10. hdu 5592 ZYB's Premutation(线段树优化)

    设f_if​i​​是第ii个前缀的逆序对数,p_ip​i​​是第ii个位置上的数,则f_i-f_{i-1}f​i​​−f​i−1​​是ii前面比p_ip​i​​大的数的个数.我们考虑倒着做,当我们处理 ...