使用NI-DAQmx进行数据采集和显示,你来你也行!

使用NI-DAQmx进行数据采集和显示,你来你也行!本文演示如何通过NI-DAQmx提供的API和配置式测控大师软件来控制National Instruments DAQ设备,实现数据采集和显示任务。

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”仿真设备,采集电压数据。

使用NI-DAQmx进行数据采集和显示,你来你也行!

使用NI-DAQmx进行数据采集和显示,你来你也行!

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软件。

本例子最终的效果图如下。

使用NI-DAQmx进行数据采集和显示,你来你也行!

2.1新建项目和创建变量

第一步,通过测控大师软件新建项目,在项目属性对话框中引用NI-DAQmx的库NationalInstruments.Common.dll和NationalInstruments.DAQmx.dll;

第二步,建立变量容器“电压测量”,并把缓存Capacity属性设置为10000;其下建立“电压”变量。

使用NI-DAQmx进行数据采集和显示,你来你也行!

2.2设计用户界面

本例子用户界面用到的控件:LineChart(曲线图)、TableGrid(数据表),ComboBox(通道列表),SpinEditBox(数字参数设置),Button(按钮)。

关键配置:

LineChart:ChartSeries属性(格式为“<系列名称 1>,<X变量名>,<Y变量名>;<系列名称 2>,<X变量名>,<Y变量名>;…“ ;本例子设置为:电压曲线图,序号,电压)

DataProvider属性:绑定“电压测量”

TableGrid:DataSeries属性(格式为“<变量1名>,<列1名称1>; <变量2名>,<列2名称>;…“ ;本例子设置为:电压,电压)

DataSource属性:绑定“电压测量”变量容器

使用NI-DAQmx进行数据采集和显示,你来你也行!

2.3编写采集脚本

“采集电压画面”设计完毕后,新建两个事件,分别是采集电压画面的Loaded事件和BtnStart按钮的Click事件。

采集电压画面的Loaded事件函数中初始化通道列表,BtnStart按钮的Click事件函数中执行数据采集。

脚本引用NI库的命名空间NationalInstruments和NationalInstruments.DAQmx,即可直接使用动态库中的类。

使用NI-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,已经能够把复杂的底层逻辑隐藏起来,提供一组易于使用的面向对象类库供开发者使用,让开发者在短短的十几行代码即可完成数据的采集。

另外,格西测控大师软件也是一个开放的测控软件开发平台,该软件能够对测试流程进行组态,能够自定义任意通信协议进行设备通信,能够开发漂亮的用户操作界面等,比较适合用于数据采集和监控、设备仿真、通信协议监听和分析、通信协议一致性测试等领域。

今天的文章使用NI-DAQmx进行数据采集和显示,你来你也行!分享到此就结束了,感谢您的阅读。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/14766.html

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注