Profil de haoboLV≠Louis Vuitton∷LabVIEW...BlogListesRéseau Outils Aide

LV≠Louis Vuitton∷LabVIEW Style Life

LHB5883的LabVIEW感悟~
好东西要大家分享

haobo li

Occupation
Lieu

说明

本Blog内容欢迎转载,但请保留出处和链接。

对于LabVIEW代码,本人仅以现状提供,不做任何明示或暗示的保证,如有更改恕不另行通知,其中非本人所有的代码属于各自的所有人,本人不做任何的保证。

例程和代码一般是我使用的最新版本LabVIEW和驱动编写,缺少的可以从左边的软件列表下载。

代码截图一般是使用LabVIEW 2009生成的,使用IE浏览的可以直接点击代码截图,将大图拖动到LabVIEW 2009版本就可以转换为代码。使用其他浏览器需要右键保存到本地然后再拖到LabVIEW 2009。

5 décembre

流盘备忘录(7)-参考资料

参考资料:

Introduction to Streaming

http://zone.ni.com/devzone/cda/tut/p/id/6355

PXI Express Specification Tutorial

http://zone.ni.com/devzone/cda/tut/p/id/2876

PXI 系統中的資料串流架構

http://zone.ni.com/devzone/cda/tut/p/id/6135

高速数据流盘处理:编程与标定

http://zone.ni.com/devzone/cda/tut/p/id/6458

PCI Express简介

http://zone.ni.com/devzone/cda/tut/p/id/10228

PXI Express 常見問答集

http://zone.ni.com/devzone/cda/tut/p/id/6156

Streaming with PXI

http://zone.ni.com/devzone/cda/tut/p/id/7700

Stream to Disk Using Win32 File IO

http://zone.ni.com/devzone/cda/epd/p/id/5348

RF Record and Playback Reference Application

http://zone.ni.com/devzone/cda/epd/p/id/5894

NI磁盘阵列产品使用的驱动

http://digital.ni.com/public.nsf/allkb/5D08C51AF3C748BD86257560000F7E44

TDMS Direct Integration in NI-DAQmx Logging

http://zone.ni.com/devzone/cda/tut/p/id/9574

TDMS 2.0 FAQ

http://zone.ni.com/devzone/cda/tut/p/id/9995

TDMS File Improvements in LabVIEW 2009

http://zone.ni.com/devzone/cda/tut/p/id/9573

流盘备忘录(6)-程序架构

并行执行

采集和保存大量数据对计算机内存和CPU占用率都很高,如果使用单循环顺序结构很容易将CPU超载,所以我们有必要使用数据队列。

NI的RF流盘例程:

RF Streaming

一个比较合理的架构是使用采集-送入队列 同时并行取出队列-流盘,可以较为充分的利用双核CPU。

完成之后再提取数据进行处理。

 

对于使用DAQmx 9.0和LabVIEW2009平台,我们还有一个更优秀的选择:使用DAQmx TDMS2.0集成流盘

 

TDMS Streaming

这个API的好处是效率更高编程更简单,而且占用系统资源更少,直接由DAQ DMA到硬盘。而且最高速度可达1.8GBS/s

需要注意这个VI在Log模式效率最高,但是还需要读取数据做其他处理的话要选Log and Read。

image

存好的文件就是标准的TDMS2.0文件。

2 décembre

流盘备忘录(5)-文件读取

我们存好数据并不是大功告成了,我们还需要从流盘数据文件恢复各通道信号才能再做各种分析。

其中最关键的核心问题就是存盘的文件格式和数据解析。

上一篇我们已经解析了一个数据块的构成,这一篇我们来看看到底如何用LabVIEW实现:

LabVIEW read all channel data

这个在数据量较小时姑且还可以用一用,不过要想更灵活的解析出各个通道数据,还需要推导出采样在文件中的位置公式。

我们需要的参数有

  1. 通道所在的板卡编号 BoardID(从0开始)
  2. 通道在板卡上的编号 ChannelID(从0开始)
  3. 采样点的编号 SampleNum
  4. 一共有多少板卡 BoardNumber
  5. 每板卡使用几个通道 ChannelNumber
  6. 每个数据块每通道的采样点 SampleperChannel
  7. 每个采样占用的字节 SampleByte

我们需要得出的参数:

  1. 我们所需采样点在文件中的位置 SamplePosition

SamplePosition=

{

(SampleNum/SampleperChannel)*SampleperChannel*BoardNumber*ChannelNumber 数据块偏移
+
BoardID*SampleperChannel*ChannelNumber 板卡偏移
+
(mod(SampleNum,SampleperChannel))*ChannelNumber 采样偏移
+
ChannelID 通道偏移

}*SampleByte

image

另外要注意的是偏移量最好用U64,I32最多能寻址2GB,大于2GB就会溢出。

有了这个公式再配合设置偏移量,就可以很方便的取出每个通道的数据了。

 

其他要注意的是如果使用Win32API,那么读取数据的高低位是Windows格式的Little Endian而不是LabVIEW通常的Big Endian。

image

流盘备忘录(4)-存盘API

存盘接口

Windows写入文件有两种形式缓冲和非缓冲

http://msdn.microsoft.com/en-us/library/aa365747(VS.85).aspx

缓冲模式是Windows自动分配缓冲区将数据分割到硬盘的每个簇大小以便写入,而非缓冲模式是有我们程序员进行缓冲区 的分配,可以任意指定大小。(这个任意并不是绝对的,必须要是硬盘簇的整数倍)

XP系统默认的缓冲区应该不是很大,在Copy文件时效率比Windows7要低一些,而在我们操作巨型的文件时至少要4MB以上的缓冲区才能发挥出最大效能。

如下图所示,block size越大数据流盘速度就相对越快,读盘反而是缓冲区较小时效率较高。不过这张图使用的是RAMDISK,数据只能供参考,使用硬盘时可以再行测试。

image

在LabVIEW 2009里面支持非缓冲格式流盘的有TDMS,BINARY和Win32APIVIs三种

image

LabVIEW 2009 TDMS

TDMS

Lab VIEW 2009 Binary

LabVIEW 2009

Win32API

win32

这三种接口效率如何我们用RAMDISK分配一个内存盘以测试API本身的性能。

image

image

 

image

 

image

结果: TDMS 153.2MB/s LabVIEW2009 Bin 497MB/s Win32APIVIs 515.9MB/s

分析 因为三种API流盘的目标都是内存,数据量也相等,所以性能的差别应该是API本身造成的,观察CPU占用也可以看到TDMS最高,LabVIEW2009 bin和Win32基本持平,可见写入函数过于复杂也会影响存盘效率。