Error message here!

Hide Error message here!

忘记密码?

Error message here!

请输入正确邮箱

Hide Error message here!

密码丢失?请输入您的电子邮件地址。您将收到一个重设密码链接。

Error message here!

返回登录

Close

使用NI-DAQmx進行數據采集和顯示,你來你也行!

測控道 2021-08-16 21:29:25 阅读数:5436 评论数:0 点赞数:0 收藏数:0

1.概述

NI-DAQmx是National Instruments現階段的數據采集驅動,NI-DAQmx集成了全新的驅動架構和API,用於控制National Instruments DAQ設備。

本文演示如何通過NI-DAQmx提供的API來控制National Instruments DAQ設備,實現數據采集任務。

為了方便大家學習,我們使用模擬的NI-DAQmx設備來演示。它是使用NI Measurement and Automation Explorer(MAX)中的NI-DAQmx模擬設備選項創建的,其行為與真實設備相似。某些NI-DAQmx設備無法在MAX中進行仿真。在許多情况下,可以模擬相似的設備來代替無法模擬的設備。

1.1安裝NI-DAQmx和新建仿真設備

1)從National Instruments官網www.ni.com下載NI-DAQmx 20.0版本軟件並安裝;安裝完畢NI-DAQmx軟件驅動包,在目錄C:\Users\Public\Documents\National Instruments\NI-DAQ\Examples\DotNET4.5下,存放NI-DAQmx的常用例子,本例子項目的脚本基本上是參考這些例子編寫的。

2)運行NI MAX設備管理軟件,通過設備和接口節點,可以新建仿真設備。本演示使用“SimDev1”仿真設備,采集電壓數據。

1.2采集電壓的代碼框架

NI-DAQmx對於Microsoft .NetFramework平臺,提供了NationalInstruments.Common.dll和NationalInstruments.DAQmx.dll兩個動態鏈接庫,作為第三方使用NI-DAQmx控制National Instruments DAQ設備的應用程序接口。

其中NationalInstruments.Common.dll動態庫比特於C:\Program Files (x86)\National Instruments\Measurement Studio\DotNET\v4.0\AnyCPU\NationalInstruments.Common 19.0.40\NationalInstruments.Common.dll

NationalInstruments.DAQmx.dll動態庫比特於C:\Program Files (x86)\National Instruments\MeasurementStudioVS2012\DotNET\Assemblies (64-bit)\Current\NationalInstruments.DAQmx.dll。

代碼框架是C#版本的

// 創建采集任務
using(Task myTask= new Task())
{
// 創建虛擬通道
myTask.AIChannels.CreateVoltageChannel("SimDev1/ai0", // 物理通道

"",//物理通道的名稱
(AITerminalConfiguration)(-1), // -1錶示使用缺省值

-10, // 最小值

10, // 最大值
AIVoltageUnits.Volts);

// 配置時域參數
myTask.Timing.ConfigureSampleClock("",//外部時鐘源線或使用“”作為內部時鐘

1000, // 外部時鐘的預期速率或內部時鐘的實際速率

SampleClockActiveEdge.Rising, //上昇或下降邊緣獲取
SampleQuantityMode.FiniteSamples, // 連續或有限樣本

1000 // 要獲取或用於緩沖區大小(如果連續)的有限樣本數

);

// 校驗任務
myTask.Control(TaskAction.Verify);
//多通道讀取器,從任務中的一個或多個模擬輸入通道讀取樣本
AnalogMultiChannelReader myAnalogReader = new****AnalogMultiChannelReader(myTask.Stream);

// 讀取數據
for(int i=0; i<1000; i++)
{
//從通道讀取數據
double [] data = myAnalogReader.ReadSingleSample();
// TODO:賦值給相應的變量

}
}

2.構建采集項目

采集項目的開發環境可以用VisualStudio,NI-DAQmx軟件安裝後,在目錄C:\Users\Public\Documents\National Instruments\NI-DAQ\Examples\DotNET4.5下,存放NI-DAQmx的使用例子。本文采用格西測控大師來構建,該軟件可以快速構建用戶界面,方便把采集到的數據用圖錶顯示,類似LabView軟件。

本例子最終的效果圖如下。

2.1新建項目和創建變量

第一步,通過測控大師軟件新建項目,在項目屬性對話框中引用NI-DAQmx的庫NationalInstruments.Common.dll和NationalInstruments.DAQmx.dll;

第二步,建立變量容器“電壓測量”,並把緩存Capacity屬性設置為10000;其下建立“電壓”變量。

2.2設計用戶界面

本例子用戶界面用到的控件:LineChart(曲線圖)、TableGrid(數據錶),ComboBox(通道列錶),SpinEditBox(數字參數設置),Button(按鈕)。

關鍵配置:

LineChart:ChartSeries屬性(格式為“<系列名稱 1>,<X變量名>,<Y變量名>;<系列名稱 2>,<X變量名>,<Y變量名>;…“ ;本例子設置為:電壓曲線圖,序號,電壓)

DataProvider屬性:綁定“電壓測量”

TableGrid:DataSeries屬性(格式為“<變量1名>,<列1名稱1>; <變量2名>,<列2名稱>;…“ ;本例子設置為:電壓,電壓)

DataSource屬性:綁定“電壓測量”變量容器

2.3編寫采集脚本

“采集電壓畫面”設計完畢後,新建兩個事件,分別是采集電壓畫面的Loaded事件和BtnStart按鈕的Click事件。

采集電壓畫面的Loaded事件函數中初始化通道列錶,BtnStart按鈕的Click事件函數中執行數據采集。

脚本引用NI庫的命名空間NationalInstruments和NationalInstruments.DAQmx,即可直接使用動態庫中的類。

主界面代碼

using System;
using System.Linq;
using System.Windows;
using System.Windows.Controls;
using Genesis;
using Genesis.Scripting;
using Genesis.Workbench;
using Genesis.Workbench.Schema;
using Genesis.Windows.Controls;
using NationalInstruments;
using NationalInstruments.DAQmx;
public class Schema_FDA16E3EDD1843278B9C31574BF2A0A7
{
public ProjectContext Context { get; set; }
//
public void BtnStart_Click(Object sender, System.Windows.RoutedEventArgs e)
{
try
{
// 清除變量緩存
this.Context.Variants["電壓測量"].Purge();
this.Context.GetSchemaElement<Chart>(sender,"ChartCurve").Clear();
this.Context.GetSchemaElement<TableGrid>(sender,"TgData").Clear();
//
double minValue = (double)this.Context.GetSchemaElement<SpinEditBox>(sender,"SbMinValue").Value;
double maxValue = (double)this.Context.GetSchemaElement<SpinEditBox>(sender,"SbMaxValue").Value;
string channel = this.Context.GetSchemaElement<ComboBox>(sender,"CmbChannels").SelectedItem.ToString();
double sampleRate = (double)this.Context.GetSchemaElement<SpinEditBox>(sender,"SbSampleRate").Value;
int samplesPerChannel = (int)this.Context.GetSchemaElement<SpinEditBox>(sender,"SbSamplesPerChannel").Value;
// 創建采集任務
using(Task myTask= new Task())
{
// 創建虛擬通道
myTask.AIChannels.CreateVoltageChannel(channel,"",
(AITerminalConfiguration)(-1),minValue, maxValue,
AIVoltageUnits.Volts);
// 配置時域參數
myTask.Timing.ConfigureSampleClock("", sampleRate, SampleClockActiveEdge.Rising,
SampleQuantityMode.FiniteSamples, samplesPerChannel);
// 校驗任務
myTask.Control(TaskAction.Verify);
AnalogMultiChannelReader myAnalogReader = new AnalogMultiChannelReader(myTask.Stream);
// 讀取數據
for(int i=0; i<samplesPerChannel; i++)
{
//從通道讀取數據
double [] data = myAnalogReader.ReadSingleSample();
this.Context.Variants["電壓測量/電壓"].Value = data.Length > 0 ? data[0] : 0;
}
}
}
catch(DaqException exception)
{
// Display Errors
SystemContext.ShowMessageBox("DAQmx",exception.Message,System.Windows.MessageBoxButton.OK,System.Windows.MessageBoxImage.Error);
}
}
//
public void 采集電壓畫面_Loaded(Object sender, RoutedEventArgs e)
{
ComboBox cmb = this.Context.GetSchemaElement<ComboBox>(sender,"CmbChannels");
string[] channels = DaqSystem.Local.GetPhysicalChannels(PhysicalChannelTypes.AI, PhysicalChannelAccess.External);
cmb.ItemsSource = channels;
cmb.SelectedIndex = channels.ToList().IndexOf("SimDev1/ai0");
}
}
複制代碼

3.總結

儀器廠商都會針對自己的儀器設備提供動態鏈接庫,供第三方軟件控制自家的儀器設備,類似NI這樣的大廠更是有一整套完善的驅動庫,NI-DAQmx即是NI的全新的驅動架構和API,已經能够把複雜的底層邏輯隱藏起來,提供一組易於使用的面向對象類庫供開發者使用,讓開發者在短短的十幾行代碼即可完成數據的采集。

另外,格西測控大師軟件也是一個開放的測控軟件開發平臺,該軟件能够對測試流程進行組態,能够自定義任意通信協議進行設備通信,能够開發漂亮的用戶操作界面等,比較適合用於數據采集和監控、設備仿真、通信協議監聽和分析、通信協議一致性測試等領域。

版权声明
本文为[測控道]所创,转载请带上原文链接,感谢

编程之旅,人生之路,不止于编程,还有诗和远方。
阅代码原理,看框架知识,学企业实践;
赏诗词,读日记,踏人生之路,观世界之行;

支付宝红包,每日可领