加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

转:数采达人LabVIEW编程讲座——第四讲

(2012-03-16 10:29:37)
标签:

labview

数据采集

杂谈

分类: Labview

原文地址:http://daq.pansino.com.cn/Support/DownLoad_Content.aspx?D_Id=97&D_CategoryId=1

—————————————————————————————————————————————————

       在前面的三期讲座中,我们主要涉及的都是DAQ 助手中的配置,俗话说磨刀不误砍柴工,熟悉了这其中具体参数的含义,其实对于我们后面学习LabVIEW DAQ API 函数是非常有帮助的。
        DAQ 助手配置完成后,点击右下角的“OK”键,即可自动在LabVIEW 中生成代码,我们可以在前面板放置一个Waveform Chart,将采集的结果实时显示出来(图1)。

        使用DAQ 助手非常方便快捷,但是想要做一个真正的LabVIEW 数采达人,需要注意它的2 个缺点。第一,作为Express VI,DAQ 助手所占内存比一般VI大,在做大型项目过多使用它时,会占据更多的内存。第二,DAQ 助手的灵活性较差且单一,如果我们要进行的采集任务比较复杂,比如每个通道都需要定义,或者需要将采集数据生成报表等等,这些功能都是DAQ 助手完成不了的,需要使用NI DAQmx 驱动提供的API 函数完成。
        我们打开LabVIEW,在程序框图中右击鼠标,在Measurement I/O 里面可以找到NI DAQmx 函数库(图2)。函数库包含了一些多态的API 函数和属性节点,所谓多态指同一个VI 可以完成多种不同的工作。这些VI 和属性节点通过组合,可以发挥出NI 数据采集卡所有的硬件性能。下面我们就来详细看看这些函数的用法。
        前面我们说了,在MAX 中可以创建任务或者全局通道,这些任务和全局通道可以通过DAQmx Task Name 和DAQmx Global Channel 调用,在LabVIEW 中使用(图3)。
        DAQmx Create Virtual Channel.vi 用于配置数据采集中硬件的通道信息,这是一个典型的多态VI,可以通过选择适用于各种任务,包括Analog Input/Output、Digital Input/Output、Counter Input/Output 等等。我们这里以Analog Input 中最为常见的Voltage 任务举例说明。Physical Channels指定用于采集的通道,此时该控件下拉框中包含了目前机器中安装的所有可用于Voltage 采集的通道。相应设备对应的设备号,我们可以在MAX 中进行查询,也可以重命名为便于识别的名称。假设我们想使用USB-6251 的通道0 来采集电压,可以打开MAX,查询到USB-6251 被命名为Dev1,则在Physical Channels 的下拉框中选择“Dev1/ai0”。如果需要做多通道采集任务,连续通道可以使用“:”,
 
图4 DAQmx Create Virtual Channel.vi
 
非连续则使用“,”分隔。比如当我们用到通道0、1、2、3、4 采集,则在Physical Channels 控件中写入“Dev1/ai0:4”,而用到通道1、3、5、7 时,则需要写“Dev1/ai1,Dev1/ai3,Dev1/ai5,Dev1/ai7”。在介绍DAQ 助手时已经讲过Input Terminal Configuration、Maximum/minimum Value 和Units 的定义,在DAQmx Create Virtual Channel.vi 中也有相应的接线端;Custom ScaleName 用于导入MAX 中创建的自定义换算,也可以直接新建。
        DAQmx Timing.vi 用于设置采集任务的时钟,这里我们主要介绍其中
Sample Clock(Analog/Counter/Digital)的功能,其他功能后面的讲座中可能会涉及。首先,Sample Mode 接线端用来指定连续采集还是有限点采集,如果是连续采集,Samples per Channel 接线端用来指定开辟的缓存区大小,采集到的数据都会先存进这个缓存区,再被软件读取出来。设置合适的缓存区大小可以避免数据溢出,通常在连续采集时并不需要我们指定缓存区大小,使用默认值即可,如果发生溢出再做适当微调。如果选择有限点采样模式,Samples per Channel 接线端指定的则是我们需要采集的总点数。Rate 引脚用于设置采样率,即每秒采集的样本,如果不连接Source 和Active Edge 引脚,则使用板卡的内部时钟分频定时,否则需要连接外部时钟信号到板卡PFI 引脚,并指定利用上升
沿或下降沿响应(图5)。

 http://daq.pansino.com.cn/FCK/Files/image/%E6%95%B0%E9%87%87%E8%BE%BE%E4%BA%BALabVIEW%E7%BC%96%E7%A8%8B%E8%AE%B2%E5%BA%A7%E2%80%94%E2%80%94%E7%AC%AC%E5%9B%9B%E8%AE%B25.jpg
 
图 5 DAQmx Timing.vi
 
         DAQmx Trigger.vi 用于配置采集任务的各种触发,关于触发我们已经在前一讲中做了详细的介绍,具体设置和DAQ 助手是相同的(图6)。

 http://daq.pansino.com.cn/FCK/Files/image/%E6%95%B0%E9%87%87%E8%BE%BE%E4%BA%BALabVIEW%E7%BC%96%E7%A8%8B%E8%AE%B2%E5%BA%A7%E2%80%94%E2%80%94%E7%AC%AC%E5%9B%9B%E8%AE%B26.jpg
 
图6 DAQmx Trigger.vi
 
        DAQmx Read.vi 用于将采集的数据从缓存区中读取出来,这个VI 也是典型的多态VI,无论是模拟信号、数字信号还是计数器信号,都可以通过其读取。我们在其下拉框选择合适的任务,读取通道数以及每次读取的样本数,再将结果送入到LabVIEW 中的控件中进行显示或存入到文件中(图7)。Number of Samples per Channel 引脚指每次读取多少样本,在有限点采样模式中,可以不用连接,其默认为-1,表示将DAQmx Timing.vi 开辟的缓冲区内所有数据全部读取出来;在连续采样模式中,因为不停有数据存储到缓存区中,所以也需要不断读取出来。因此连续采样模式的线程,需要将DAQmx Read.vi 放入到While循环中。为了避免溢出,必须有以下关系:每次读取的样本数(Number of Samples per Channel 引脚的值)×每秒钟While 循环运行的次数(While 循环中设置延时的倒数)=每秒钟采集的样本数(采样率)。另外需要注意的是,由于我们大多使用的是毫秒级的Windows 的操作系统,且很多时候需要处理其他响应,所以While 循环每秒钟运行的次数不应过快,通常设置在10 到20 次之间为宜。Timeout 引脚需要给入多久未响应自动超时停止的时间,可以避免死线程。Timeout 设置为-1,为无限期等待不做超时处理;而设置为0,VI 仅做一次读取,未响应即为超时。
 
        DAQmx Write.vi 可以将需要采集卡生成的数据写入到任务中,这个VI 通常用于Analog/Digital Output 等线程。与DAQmx Read.vi 类似,通过设定合适的任务和用于数据生成的通道数即可。我们将采集卡向外生成数据的速度称为更新率,即每秒钟向外生成多少个样本,这个值也是DAQmx Timing.vi 进行设定。线程中实际成功写入的样本数可以在Number of Samples Written per Channel 引脚中读出,关于DAQmx Write.vi 的详细使用,我们在后面的Analog Output 部分会进行深入探讨(图8)。
        DAQmx Start Task.vi 在通道、定时、触发等硬件配置完成后,开始采集任务,也就是线程一旦流过DAQmx Start Task.vi,采集卡硬件就开始按照前面的配置执行。DAQmx 线程的信息都是通过“task in/out”引脚进行传递,需要结束时,可以放置DAQmx Stop Task.vi,但是这个VI 仅仅是将任务停止,并
没有将内存(可以直观地理解为“task in/out”数据线)中的任务信息清除掉,所以在DAQmx Stop Task.vi 后面如果再放置一个DAQmx Start Task.vi,不需要进行硬件配置,又可以运行之前的任务。这样久而久之,会占去很多内存资源,所以如果任务信息不需要保留,可以选择放置DAQmx Clear Task.vi,这个VI会将线程中的任务信息从内存中清除,如果需要重复之前的任务,则要重新配置。所以DAQmx Clear Task.vi 也不提供task out 引脚(图9)。
 
        DAQmx 的API 函数就先介绍到这里,下面我们来搭一个之前用DAQ 助手实现过的采集任务。使用USB-6251 的通道0,差分的测量方式采集板卡自带的5V 输出,采样率设为1000KS/s,使用Digital Edge 方式的Start Trigger,外部触发信号连接至PFI0,最后将采集到的数据显示在Waveform Chart 中。硬件的连接方式不需要变化,下面我们看看LabVIEW 中如何用DAQmx API 函数搭建这个任务(图10)。

 http://daq.pansino.com.cn/FCK/Files/image/%E6%95%B0%E9%87%87%E8%BE%BE%E4%BA%BALabVIEW%E7%BC%96%E7%A8%8B%E8%AE%B2%E5%BA%A7%E2%80%94%E2%80%94%E7%AC%AC%E5%9B%9B%E8%AE%B210.jpg
 
图10 DAQmx API 函数搭建的采集线程
 
        在这个线程中,我们可以看到除了任务线,还有一根黄色的错误线连接,这根错误线被称为错误簇,里面包含3 个数据类型:布尔量status,一旦出现错误,这个值变为真,这样后面的VI 便不会运行,一直流到最后,保证系统不会出现死机和崩溃;数值类型code,每一个错误都会对应一个code,我们可以通过LabVIEW 工具栏“Help”选项中的“Explain Error...”查询错误信息,也可以在NI 网站上输入这个代码,查找相应解决办法;字符串source,这里面包含了对出现的错误的解释,可以在线程最后放置Simple Error Handle.vi 将其读取出来,但是也可能出现没有解释的错误,需要我们用code 去网站查询或电话求助(图11)。我们注意While 循环中也将错误簇连接到停止端,和停止按键一起控制任务的停止。
 

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有