首页 > 其他分享 >NI-DAQmx-PCI4461

NI-DAQmx-PCI4461

时间:2024-05-14 10:30:45浏览次数:13  
标签:NI 函数 taskHandle PCI4461 DAQmx 任务 通道

一、什么是NI-DAQmx

NI ---National Instruments

DAQ --- Data AcQuisition

mx ---Measurement eXperience 

二、如何使用NI DAQ

DAQ----NI数据采集卡物理通道的概念和语法-面包板社区 (eet-china.com)

2.1、物理通道:

NI把物理通道号分成六个类别:

AI/AO:模拟量输入/输出

DI/DO:数字量输入/输出

CI/CO:计数器输入/输出

数字量输入/输出(DI/DO)比较特殊,有端口(PORT)和线(LINE)的概念,所谓端口,一般是8位的,读写端口就是同时对端口的8个位(线)同时操作,如果只操作相应端口的某一条线(实际就是某一位),可以通道物理通道控件选择线操作。

                   物理通道:设备号/通道号

1、物理通道由设备号(DEV1)和通道号(AI,AO等)两部分组成,中间是斜杠分隔符号。

2、物理通道号是在MAX配置板卡后自动分配的,第一块板卡是DEV0,第二块是DEV1。

3、对于AI,AO,CI,CO,通道号由通道形式(AI,AO)加上通道编号组成,比如AI0,AI5,AO1等等。

4、对于数字IO,通道号是端口(PORT0,PORT1。。)或者端口+线号组成(PORT0/LINE1等)

 

2.2、语法:

多通道的表示方法(可以混合):

连续方式:(用:分隔)

Dev0/ai0:4 或者 Dev0/ai0:Dev0/ai4 表示选择0--4五个AI通道。

列表方式:(用 ,分隔)

Dev0/ai1,Dev0/ai4 表示同时选择AI1和AI4两个物理通道。

2.3、8个主要流程函数

         正常调用流程:

 

 

2.3.1、创建任务

DAQmxCreateTask()函数可用于创建任务

TaskHandle  taskHandle=0;

DAQmxCreateTask("",&taskHandle);

 

2.3.2、创建虚拟通道

“NI-DAQmx创建虚拟通道”函数可创建一个虚拟通道并将其添加至任务, 也可用于创建多个虚拟通道并将其全部添加至任务。 如未指定任务,该函数将自动创建一个任务。 “NI-DAQmx创建虚拟通道”函数包含多个实例, 这些实例对应虚拟通道执行的具体测量或生成类型。

例如:DAQmxCreateAIVoltageChan()函数则用于创建模拟输入电压通道:

TaskHandle  taskHandle=0;
char        chan[256] = "Dev1/ai0";
float64     min = -10, max = 10;
DAQmxCreateTask("",&taskHandle);

DAQmxCreateAIVoltageChan(taskHandle, chan, "", DAQmx_Val_Cfg_Default, min, max, DAQmx_Val_Volts, NULL);

 

2.3.3、触发/定时

“NI-DAQmx触发”函数可用于对触发进行配置来执行指定操作。 常用的操作是开始触发和参考触发。 开始触发用于启动采集或生成, 参考触发则用于在一组采集样本中创建预触发数据结束后和后触发数据开始前的位置。 可对这两个触发进行配置,使其发生在数字边沿、模拟边沿、或模拟信号进入或离开窗口时。

“NI-DAQmx定时”函数用于对硬件定时的数据采集操作进行定时配置, 包括指定操作是连续执行还是有限执行、选择采集或生成的样本数量以进行有限操作、以及需要时创建缓冲区。
对于需要采样定时(模拟输入、模拟输出和计数器)的操作,“NI-DAQmx定时”函数的采样时钟实例可用于设置采样时钟源和采样速率,采样时钟源可以是内部也可以是外部的信号源。 采样时钟能够控制采集或生成样本的速率。 每个时钟脉冲将启动任务中每个虚拟通道的样本采集或生成。

例如:DAQmxCfgSampClkTiming函数用于配置C或C++中的任务定时

TaskHandle  taskHandle=0;
char        chan[256] = "Dev1/ai0";
float64     min = -10, max = 10;
DAQmxCreateTask("",&taskHandle);
DAQmxCreateAIVoltageChan(taskHandle, chan, "", DAQmx_Val_Cfg_Default, min, max, DAQmx_Val_Volts, NULL);

char        clockSource[256] = "";
float64     rate = 10000;
DAQmxCfgSampClkTiming(taskHandle, clockSource, rate, DAQmx_Val_Rising, DAQmx_Val_ContSamps, 1000);

 

2.3.4、开始任务

“NI-DAQmx开始任务”函数可以将一个任务显式转换成运行状态。 运行状态下,任务进行指定的采集和生成。 当“NI-DAQmx读取”函数运行而“NI-DAQmx开始任务”函数未运行时,任务将隐式转换成运行状态并自动启动。 这种隐式转换也会发生在“NI-DAQmx写入”函数在指定的自动开始输入驱动下运行但“NI-DAQmx开始任务”函数未运行时。

虽然不一定需要,但包含硬件定时的采集或生成的任务最好使用“NI-DAQmx开始任务”函数来显式启动。 而且,如果需要多次执行“NI-DAQmx读取”函数或“NI-DAQmx写入”函数(比如在一个循环中),则应使用“NI-DAQmx开始任务”函数。 否则任务会由于不断重复开始和停止而影响执行性能。

 例如:DAQmxStartTask()函数可用于开始任务:

DAQmxStartTask(taskHandle);

 

2.3.5、读/写

“NI-DAQmx读取”函数可从指定的采集任务中读取样本。 针对不同的函数实例可选择不同的采集类型(模拟、数字、或计数器)、虚拟通道数量、采样数量和数据类型。 指定的采样数量从DAQ板卡上的FIFO传输到RAM中的PC缓存后,“NI-DAQmx读取”函数再将样本从PC缓存转移到应用程序开发环境(ADE)内存中。

“NI-DAQmx写入”函数用于将样本写入指定的生成任务中。 针对不同的函数例程可选择不同的生成类型(模拟或数字)、虚拟通道数量、采样数量和数据类型。 “NI-DAQmx写入”函数将样本从应用程序开发环境(ADE)写入到PC缓存中。 然后这些样本从PC缓存传输到DAQ板卡FIFO以进行生成。

例如:DAQmxReadAnalogF64()函数用于读取C或C++中的模拟输入任务的模拟数据:

int numRead = 0;

//int32 DAQmxReadAnalogF64(TaskHandle taskHandle, int32 numSampsPerChan, float64 timeout, bool32 fillMode, float64 readArray[], uInt32 arraySizeInSamps, int32 *sampsPerChanRead, bool32 *reserved);
DAQmxReadAnalogF64(taskHandle, 1000, 10.0, DAQmx_Val_GroupByScanNumber, data, 1000, &numRead, NULL);

例如:DAQmxReadAnalogF64()函数用于写入模拟数据

int written = 0;

DAQmxWriteAnalogF64(taskHandle, 1000, 0, 10.0, DAQmx_Val_GroupByChannel, data, &written, NULL);

 

2.3.6、结束前等待

 “NI-DAQmx结束前等待”函数用于等待数据采集完毕后结束任务。 该函数可用于确保停止任务前已完成指定的采集或生成。 一般情况下,“NI-DAQmx结束前等待”函数用于有限操作。 一旦该函数执行完毕,则表示有限采集或生成已完成,任务可在不影响操作的情况下停止。 此外,超时输入可用于指定最长等待时间。 如果采集或生成没有在该时间内完成,则函数将退出并生成一个相应错误。

例如:DAQmxWaitUntilTaskDone()函数用于等待直至缓存区的所有样本均生成完毕。 该函数在写入或开始函数之后调用。

//int32 DAQmxWaitUntilTaskDone (TaskHandle taskHandle, float64 timeToWait);

//timeToWait:-1:无限期地等待,单位:秒
DAQmxWaitUntilTaskDone(taskHandle, -1);

 

2.3.7、结束任务

 例如:DAQmxStopTask()函数即可结束任务

DAQmxStopTask(taskHandle);

 

2.3.8、清理任务

 “NI-DAQmx清除任务”函数用于清除指定的任务。 如果任务正在运行,则函数将先停止任务,然后释放任务所有的资源。 一旦任务被清除后,除非再次创建,否者该任务无法再使用。 因此,如果需要再次使用任务,则应使用“NI-DAQmx停止任务”函数来停止任务,而不是将其清除。

对于连续操作,应使用“NI-DAQmx清除任务”函数来停止实际的采集或生成。

例如:DAQmxClearTask()函数即可清除任务

DAQmxClearTask(taskHandle);

标签:NI,函数,taskHandle,PCI4461,DAQmx,任务,通道
From: https://www.cnblogs.com/wuyuan2011woaini/p/18190776

相关文章

  • skipped: maximum number of running instances reached (1)
    Python的 apscheduler今天出现skipped:maximumnumberofrunninginstancesreached(1)问题产生的原因:设置了大量的任务,而APScheduler无法同时处理所有任务解决方法:调整APScheduler使用的线程池大小来增加并发处理任务的能力fromapscheduler.schedulers......
  • c++ union
    在C++中,`union`是一种特殊的数据结构,它允许在同一内存空间中存储不同类型的数据。`union`允许您定义一个变量,但这个变量可以存储多种不同类型的值,而不是只能存储一种类型的值。在任何给定时间,`union`中只有一个成员可以有值,所有其他成员都将保持未定义的状态。`union`的声......
  • uni-app实现上拉加载
     参考文档代码:1<template>2<view>3<!--省略其他内容-->4<viewv-for="itemindataList":key="item.id">{{item.title}}</view>5</view>6</template>78<script>9e......
  • Docker执行命令报错:Cannot connect to the Docker daemon at unix:///var/run/docker.
    1、问题说明Docker执行重新启动命令重启成功。命令如下:重新加载配置systemctldaemon-reload重启docker服务systemctlrestartdocker.service查看启动状态systemctlstatusdocker.service显示启动成功使用docker-v命令查看版本号输出正常但是使用dockerps......
  • requestAnimationFrame模拟定时器
    const{ myInterval,clearMyInterval}=(function(){ //存放系统中的定时器id lettimerIdMap={num:0} functionmyInterval(callback,interval){ //每设置一次定时器,num++代表系统中有num个自定义的定时器 ......
  • Q-learning 玩maze游戏
     importpygameimportnumpyasnpimportrandomimportsys#定义迷宫环境classMaze:def__init__(self):self.size=10self.maze=np.zeros((self.size,self.size))self.start=(0,0)self.goal=(9,9)self.m......
  • uniapp自定义input清除按钮
    uniapp小程序,引入uni-ui库后,观察到其他组件,有的默认有清除按钮,比如: 在写内置组件input框,查看文档没有此属性,官方示例在这里:https://github.com/dcloudio/hello-uniapp/blob/master/pages/component/input/input.nvue 还需自行复制对应的css,试了下效果不太好。我需要和级联......
  • 夜莺监控(Nightingale)上线内置指标功能
    Prometheus生态里如果要查询数据,需要编写promql,对于普通用户来说,门槛有点高。通常有两种解法,一个是通过AI的手段做翻译,你用大白话跟AI提出你的诉求,让AI帮你写promql,另一种是平台里内置现成的promql,覆盖常用场景开箱即用。夜莺监控(Nightingale)最近上线了内置指标功能,可以......
  • Go语言异常处理:自定义错误【errors.New+panic】
    程序本身抛出的异常信息不是太友好,我们可以自定义错误或者异常的信息,需要使用errors包中的New函数来包装一下异常或错误信息;在使用内置函数panic(err),把异常信息后面的程序执行终止掉,因为再执行后面的程序也没有意义了。 packagemainimport"fmt"import"errors"funcma......
  • uniapp循环请求接口之后跳转
    if(this.model.caseWorkPartyModelList.length>0){letpromises=[];//用于存储所有异步操作的Promiseletthat=thisthis.model.caseWorkPartyModelList.forEach(async(item,index)=>{......