流盘备忘录(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文件。

流盘备忘录(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)SampleperChannelBoardNumberChannelNumber 数据块偏移
+
BoardID
SampleperChannel*ChannelNumber 板卡偏移
+
(mod(SampleNum,SampleperChannel))*ChannelNumber 采样偏移
+
ChannelID 通道偏移

}*SampleByte

image

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

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

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

![image](https://aftv2q.bay.livefilestore.com/y1mIS2FZksrhqxtsgC3tXJ_mDvez4ehbPJQh2c4DopAAVhWZx9aFCtp5rWsN7AX-LTKlTQ_THRfpctxWDI8ybrE5bq3TmZA7DELe4rdb84tsO3lSinX9Q7dix3gBzcWOBZsNy1qAbfkMacqMZvik6bJ-A/image[3] 4EFCFDF4.png “image”)

[](https://aftv2q.bay.livefilestore.com/y1m_jcU-aepq8aD9tZ4T2IdyzWPI43xpwNF3eQWd6zishWaHJyvXioh4tjQLDf882YIIUQszfI1azwrP1t1gec6R-lUwUOSyGE-3KzE_IBtQO2LP9tGCSpkOLg2J-zUNcXzJPuzEYtFrBIIfGPVlpoVmg/LabVIEW read all channel data[5].png)

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

存盘接口

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

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

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

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

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

![image](https://aftv2q.bay.livefilestore.com/y1mmJSZHqeg1_dNBpTc6Djg73HIE-DyBZiWejBXbE3B9Jg78ilPCO3f9Xmx9x4CMddw6Q-paX_XTIcQ2Y3E7yOi0lewNzyomXKE4vp9-n7JchgCiE17yaEMP8Ux_HMMH1CrCCuTNwtubzvN43O_65mUKA/image_thumb 763FDADC.png “image”)

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

![image](https://aftv2q.bay.livefilestore.com/y1m4CV566wf7PJgi97WlOxgGH0Wo06tB9RxB7f_jJOr7OXVIePxxEWGB_1CTjM1sMQ-1TF7lxUUg7HOMqixnY_6dmjJASUsBc3AcILPmT_T6wrsnNMQmbcPL2zwdp9vechREimzqj5lR8v7ApbXeOu09Q/image[5] 0B448D74.png “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基本持平,可见写入函数过于复杂也会影响存盘效率。

流盘备忘录(3)-数据格式

数据保存格式注意事项

2D I32 数据换算.

以DAQmx读取为例,我们读取数据可以用以下三种格式:

image 

image

image

其中I16占用内存最小,每一个采样使用2Byte内存,DBL会占用8个Byte,在采集大量数据时使用RawData可以大量减少内存和CPU的使用。

binary data格式

二进制表示的是AD芯片转换的原始信息,如何换算为电压呢?

直接 Volt=bin data/(2^ADbits)*Range理论是可行的 ,但是实际上是不准确的,因为通道还有校准信息我们没有得到。

DAQmx提供了通道的标定信息,结合多项式函数就可以简单的得出实际电压。

convert data

交织还是非交织;

对于RawData来说,单通道的结构比较简单就是一个数组,但是多通道时读回来的还是一个1D Array,如何找出每个通道所对应的数据呢?这就牵扯到交织和非交织了。

Raw Data

Raw data is in the native format and organization of the device, read directly from the device or buffer without scaling or reordering. The native format of a device can be an 8-, 16-, or 32-bit integer, signed or unsigned.

If you use a different integer size than the native format of the device, one integer can contain multiple samples or one sample can stretch across multiple integers. For example, if you use 32-bit integers, but the device uses 8-bit samples, one integer contains up to four samples. If you use 8-bit integers, but the device uses 16-bit samples, a sample might require two integers. This behavior varies from device to device. Refer to your device documentation for more information.

NI-DAQmx does not separate raw data into channels. It returns data in an interleaved or non-interleaved 1D array, depending on the raw ordering of the device. Refer to your device documentation for more information.

Interleaving

Interleaved samples prioritize samples before channels, such that the array lists the first sample from every channel in the task, then the second sample from every channel, up to the last sample from every channel.

Channel 0—Sample 1

Channel 1—Sample 1

Channel 2—Sample 1

Channel 0—Sample 2

Channel 1—Sample 2

Channel 2—Sample 2

...

Channel 0—Sample _N_

Channel 1—Sample _N_

Channel 2—Sample _N_

Non-interleaved samples prioritize channels before samples, such that the array lists all samples from the first channel in the task, then all samples from the second channel, up to all samples from the last channel.

Channel 0—Sample 1

Channel 0—Sample 2

...

Channel 0—Sample _N_

Channel 1—Sample 1

Channel 1—Sample 2

...

Channel 1—Sample _N_

Channel 2—Sample 1

Channel 2—Sample 2

...

Channel 2—Sample _N_

最简单的例子6124采集到的数据卡内通道是交织的,卡间又是非交织的,

一个使用两块6124每块使用2个通道连续采集每次采集3个点的数据应该如下:

Broad0CH0Sample1

Broad0CH1Sample1

Broad0CH0Sample2

Broad0CH1Sample2

Broad0CH0Sample3

Broad0CH1Sample3

Broad1CH0Sample1

Broad1CH1Sample1

Broad1CH0Sample2

Broad1CH1Sample2

Broad1CH0Sample3

Broad0CH1Sample3

Broad0CH0Sample4

Broad0CH1Sample4

Broad0CH0Sample5

Broad0CH1Sample5

Broad0CH0Sample6

Broad0CH1Sample6

Broad1CH0Sample4

Broad1CH1Sample4

Broad1CH0Sample5

Broad1CH1Sample5

Broad1CH0Sample6

Broad0CH1Sample6

抽象一下应该如下图,SampleBlock包含了所有通道这一次采集的N点

SampleBlock1

SampleBlock2

SampleBlock3

….

然后每个SampleBlock里面包含BroadSample

Broad0sample

Broad1sample

Broadsample包含着N次采样

Sample1

Sample2

Sample3

SampleN

每个Sample里含有这块板卡上的通道各一个点

CH1

CH2

CH3

CH4

所以一定要分析清楚数据结构才能正确解析出各通道数据

deInterleaving

流盘备忘录(2)-软件选择

对于流盘来说软件也是很重要的,其中会影响到我们流盘性能的有以下几点:

驱动是否高效

是否成功启用了DMA传输采集到的数据以减少系统资源占用。以NI的数据采集卡为例,传统DAQ不使用DMA和中断的方式采集数据其CPU占用率长时间飙升在100%,使用DAQmx默认使用DMA方式可以大大减小CPU的占用率。

软件架构是否合理

我们需要实现的三个主要任务:采集、处理、保存占用率合理分配,数据存储格式应该在保证精度的前提下减小内存占用。

存盘API性能

系统处理文件操作的API分配的缓冲区太小,在读写大文件上性能较低。

关键点:

1 驱动一定要支持DMA,减小CPU占用.提供RAWdata格式和转换公式,减小数据内存占用

2 能否合适的将负载分配到各个CPU上.支持并行和多线程

3 支持底层的无缓冲模式API,避免软件流盘速度瓶颈.

解决方案

1 使用NI DAQmx驱动和NI MI驱动,并启用DMA。

image image

采集原始数据减小内存占用

image image image

2 使用LabVIEW或者其他多线程开发软件,启用并行循环和队列。

 RF Streaming

3 使用Win32API,直接调用底层函数并分配较大的缓冲区

image

C++

BOOL WINAPI WriteFile(
  __in         HANDLE _hFile_,
  __in         LPCVOID _lpBuffer_,
  __in         DWORD _nNumberOfBytesToWrite_,
  __out_opt    LPDWORD _lpNumberOfBytesWritten_,
  __inout_opt  LPOVERLAPPED _lpOverlapped_
);

流盘备忘录(1)-流盘概览

流盘概览

我们经常会看到一个总线速度比较的图表,可以看到在通常的情况下同一时代内总线最高速度是远远高于外总线的,不过对于硬盘来说,尽管应该也可以算是内总线上的设备,硬盘读写速度一直是一个令人无奈的瓶颈,远远落后于计算机技术和测控技术的发展速度.当我们的示波器数据量已经迈入GB/s的量级,硬盘的速度还是在MBS/s级徘徊.

造成这种现状的原因:

1.机械式硬盘本身的局限:

需要通过寻道等机械动作之后才能实现读写动作,如果使用SSD固态硬盘,单块硬盘速度可以提高到100MBSs以上,

传统硬盘通过组成Raid0阵列也可以提高写入速度,目前最高性能已经可以到G级。

2.总线接口:

SATA和IDE接口挂接到PCI总线上就要受到PCI总线133MS/s的限制,只有使用PCI-E的高带宽接口,才能适合大流量的数据读写,PCIe带宽最高4G。

目前PXIe的系统带宽在3~4G,板卡带宽最高1G。

3.计算机性能:

在处理大量数据时大数组的读写、转置、队列都会给CPU大量的压力,数据量的增大对内存大小也提出了更高的要求。

对于目前PXI平台比较成熟的方案就是使用PXI-E板卡+RAID流盘阵列这种架构.最高数据吞吐量在400M~600MB/s左右。

PXI控制器系统备份软件选择

虽然NI的控制器质量非常稳定可靠,不过如果使用Windows而非RealTimeOS的话,系统备份恢复软件就是一个值得考虑的问题了。

为了找到一个好用的恢复软件给我们的8176上个保险,来来回回测试了多种备份软件。

系统备份与恢复软件厂商目前主要是Symantic赛门铁克和Acronis两大厂商。其中Symantic以GHOST系列强大的功能闻名,在收购了PowerQuest之后其实力不可小视。Acronis以True Image系列软件的方便易用与稳定可靠被NI作为系统默认的硬盘恢复方案。

我初步的目标是找到一个能在Windows7下备份和恢复整个分区的软件,取代我一直使用的DriveImage。不过该方法需要拆开控制器,所以要是能做成多启动这种方案也不错。

下表是一个简单的比较

控制器型号 Norton Save&Restore/
Symantec Backup Exec System
双启动GHOST 光盘/U盘版GHOST

Acronis True Image OEM

Acronis True Image 2010 Power Quest Drive Image 2002
PXI-817X/818X(Intel8系列芯片组) OK OK Fail OK 不支持Windows2000 OK
PXI-819X/810X/8130(Intel9系列芯片组/Nvidia N-Force) OK OK OK OK OK OK
PXI-8108/8110(IntelG系列芯片组) OK 未知 Fail OK OK OK
功能            
在Windows下备份和恢复分区(用于在PC机上恢复系统,适用于硬盘数据完全丢失无法启动等情况) 只能用于系统盘 / / OK OK OK
在非windows下备份和恢复分区 OK 不适用老控制器 OK OK
操作系统支持 XP/VISTA / / 2000/XP XP/VISTA/Windows7 2000/XP

目前GHOST的二次封装而成的USB GHOST,光盘GHOST、一键GHOST等等版本极多,不过能兼容NI大部分控制器的GHOST版本并不多。而企业版GHOST套装使用和配置极其复杂,操作简单的Windows下备份和恢复的软件在系统崩溃后就没有什么用了。所以值得考虑的就是系统恢复光盘里自带的Acronis True Image OEM版,是一个简单可靠的一键恢复系统,不过一旦恢复就会使系统恢复到出厂状态。需自由备份和恢复就需要完整版的软件才行。

不过我们其实需要的功能往往也没有那么复杂,只需要能恢复系统到一个安装调试好所有软件的状态,那么这时候就可以用到下面这个小技巧了 。

1。正常安装Windows,注意不要选择安装F4一键恢复。

2。分区、安装软件、配置程序。。。

3。将系统恢复盘的CDROM:OSPXI_VXI$OEM$$1SYSPREP目录下的ACRONIS.XML,ACRONIS8199_ENABLE.BAT,ACRONISTRUEIMAGE_8199.MSI三个文件复制到c:Sysprep目录下

4。运行c:SysprepACRONIS8199_ENABLE.BAT,重启系统后就会自动备份操作系统,完成之后在系统启动时按F4就可以一键恢复了。

关于示波器的触发灵敏度(Trigger Sensitivity)

示波器板卡有一项参数叫Edge Trigger Sensitivity

NI PXI/PCI-5152 Specifications(P11)

这一项指标翻译过来应该是触发敏感度,有什么意义呢?

当我们用示波器高速采集一个高频脉冲信号时,往往会混入很多噪声信号,如果没有触发敏感度,直接按边沿触发往往不能得到一个稳定的示波器图形。

图输入200mVpp锯齿波时的情况。

触发灵敏度就是用来滤除噪声对触发的影响,使之能够正确被有效信号而非噪声触发,获得稳定波形的一个参数。

TEK网站的定义如下:

Trigger Sensitivity

Trigger sensitivity is a critical attribute when capturing high-speed digital signals. An oscilloscope‘s trigger sensitivity determines its ability to react to specified edge trigger conditions over a range of frequencies. The specification takes the following form: power-line hum interference.

Trigger System Sensitivity, Internal DC Coupled:
0.35 div DC to 50 MHz, increasing to 1.5 div at 3 GHz
(guaranteed); 2.7 div at 4 GHz (typical)
(from TDS7404 DPO data sheet)

The oscilloscope will trigger on a signal of 0.35 divisions amplitude p-p in the range of frequencies from DC to 50 MHz. As the frequency goes beyond 50 MHz, the signal must be larger (higher in amplitude) to trigger the instrument. At 3 GHz, the signal must be at least 1.5 divisions in amplitude. Trigger sensitivity is specified with a sine wave input.

灵敏度
在捕获高速数字信号时,触发灵敏度是一个关键指标。示波器的触发灵敏度决定着在某个频率范围内示波器对规定边沿触发条件的反应能力。这一指标采用下述形式:电源线噪声干扰。
       触发系统灵敏度、内部DC耦合:
DC - 50 MHz, 0.35格;3 GHz时提高到1.5格(保障值); 4 GHz时2.7格 (典型值)(摘自TDS7404 DPO技术数据)
示波器将在DC到50 MHz 的频率范围内,在0.35格的p-p幅度上触发。在频率超过50MHz时,信号必须更大(幅度更高),以触发仪器。在3 GHz时,信号的幅度必须在1.5格上。可以使用正弦波输入指定触发灵敏度。

开头图中的指标就是说使用通道触发时灵敏度是满量程的10%,而使用外部触发时灵敏度是固定的0.5V峰峰值。小于灵敏度的毛刺都会被示波器忽略,不认为是触发。

参考链接:

http://www.ed-china.com/ART_8800024153_400013_500015_TS_f6dcb05a.HTM

http://www.tek.com/Measurement/scopes/selection/performance/trigger.html

触发扫盲:

http://www2.tek.com/cmsreplive/tirep/4394/55C-17291-2_2009.05.27.00.56.45_4394_ZH.pdf

[code share]使用命令行打开网页

![Open Web Page use LabVIEW](http://lhb5883.files.wordpress.com/2009/09/openwebpageuselabview5b25d.png?w=158 "Open Web Page use LabVIEW")or ![open web page with CMD](http://lhb5883.files.wordpress.com/2009/09/openwebpagewithcmd5b85d.png?w=243 "open web page with CMD") 

如图,这样就可以调用系统默认浏览器打开网页。

Certified LabVIEW Developer 认证小结

LabVIEW中级认证考试的主要目的就是考察受试者的LabVIEW编程水平,程序风格,文档注释三个方面.详细可以查看下面的文档 

ftp://ftp.ni.com/pub/devzone/tut/cld_exam_preparation_guide.pdf

下面这个链接已经列举了一些注意事项,我再补充几条:

http://cygnus-wei.spaces.live.com/blog/cns!CD5F4D351CB23EC!1406.entry

1. 善于利用LabVIEW自带的模板和VI,例如定时迅捷VI,读写电子表格文件VI,状态机模板,子VI模板几个都要熟练掌握.

2. 最好使用LabVIEW英文版开发环境.这样无论是模板还是控件名字都是默认英文,可以减小工作量.

3. 不要忘记在状态机模板里加上错误处理.

4. 写完程序一定要留调试和注释的时间.

5. 尽量将状态机Case结构里的代码封装为子VI.

6. 能用TypeDefine控件的尽量都用TypeDefine控件,方便程序维护.

7. 不需要用户交互的前面板控件最好隐藏掉.

细节:

1. 框图和前面板大小:根据考试要求最好限定为1024x768,要扩展尽量水平扩展.现在显示器以宽屏居多,方便观察整个程序.

2. LabVIEW配置,如果你到手的机器配置修改太多,例如字体等要改回来很麻烦.最简单的办法就是删除LabVIEW的INI文件.然后在工具->属性里取消前面板控件:显示为图标.

3. 状态机里面的等待函数一定要修改,设置为1是个不错的选择.

4. 使用Ctrl+鼠标拖拽扩展程序框图时一定要慎重,避免程序连线错位.