c++调用NI DAQ API函数进行数字量通道的读写

一. DAQ数字量输出程序流程

步骤:

  • 1:调用DAQmxCreateTask函数创建任务。
  • 2:调用DAQmxCreateDOChan函数创建数字输出通道。
  • 3:调用DAQmxStartTask函数来启动任务。
  • 4:调用DAQmxWriteDigitalLines函数对数字端口进行数据写入。
  • 5:调用DAQmxStopTask函数来停止任务。
  • 6:调用DAQmxClearTask函数来清除任务。

二. DAQ函数说明

1. DAQmxCreateTask

int32 DAQmxCreateTask (const char taskName[], TaskHandle *taskHandle);

说明:
创建任务。如果使用此函数创建任务,则必须使用DAQmxClearTask来销毁它。如果在循环中使用此函数,NI DAQmx会在循环的每次迭代中创建一个新任务。完成任务后,请在循环中使用DAQmxClearTask函数,以避免分配不必要的内存。

参数:

  • taskName[]: 任务名称
  • taskHandle: 对此函数中创建的任务的引用

示例:

//创建任务task
TaskHandle	taskHandle=0;
DAQmxCreateTask("", &taskHandle);

2. DAQmxCreateDOChan

int32 DAQmxCreateDOChan (TaskHandle taskHandle, const char lines[], const char nameToAssignToLines[], int32 lineGrouping);

说明:
创建通道以生成数字信号,并将通道添加到使用taskHandle指定的任务中。您可以将数字线路分组为一个数字通道,也可以将它们分离为多个数字通道。如果使用端口物理通道名称在行中指定一个或多个完整端口,则无法将端口分隔为多个通道。要将端口分成多个通道,请多次使用此功能,每次使用不同的端口。

参数:

  • TaskHandle:对此函数中创建的任务的引用
  • lines[]:用于创建虚拟通道的数字线路的名称。可以指定行的列表或范围。指定一个端口而不指定行相当于按顺序指定该端口
    的所有行。因此,如果指定Dev1/port0,并且端口0有八行,则会扩展为Dev1/port0/line0:7。
  • nameToAssignToLines[]:创建的虚拟通道的名称。如果使用一个对此函数的调用创建多个虚拟通道,则可以指定一个用逗号分隔的名称列表。如果未指定名称,NI DAQmx将使用物理通道名称作为虚拟通道名称。如果为nameToAssignToLines指定自己的名称,则在其他NI DAQmx函数中引用这些通道时必须使用这些名称。
  • lineGrouping:指定是否将数字线路分组为一个或多个虚拟通道。如果在行中指定一个或多个完整端口,则必须将lineGrouping设置为DAQmx_Val_ChanForAllLines

示例:

DAQmxCreateDOChan(taskHandle, "Dev1/line0:71","",DAQmx_Val_ChanForAllLines);

3. DAQmxStartTask

int32 DAQmxStartTask (TaskHandle taskHandle);

说明:
将任务从提交状态转换为运行状态,从而开始测量或生成。使用此功能对于某些应用程序是必需的,对于其他应用程序则是可选的。如果不使用此功能,读取操作开始时,测量任务将自动启动。NI DAQmx Write函数的autoStart参数确定在使用NI DAQmx-Write函数时生成任务是否自动启动。如果在多次调用NI DAQmx Read函数或NI DAQmx Write函数时(例如在循环中)未调用DAQmxStartTaskDAQmxStopTask,则任务会重复启动和停止。重复启动和停止任务会降低应用程序的性能。

参数:

  • taskHandle: 对此函数中创建的任务的引用

示例:

DAQmxStartTask(taskHandle);

4. DAQmxWriteDigitalLines

int32 DAQmxWriteDigitalLines (TaskHandle taskHandle, int32 numSampsPerChan, bool32 autoStart, float64 timeout, bool32 dataLayout, uInt8 writeArray[], int32 *sampsPerChanWritten, bool32 *reserved);

说明:
将多个样本写入任务中的每个数字行

参数:

  • taskHandle: 对此函数中创建的任务的引用
  • numSampsPerChan:每个通道要写入的样本数。必须传入一个0或更大的值才能写入样本
  • autoStart:指定如果不启动任务,此函数是否自动启动该任务
  • timeout:等待此函数写入所有样本的时间(以秒为单位)
  • dataLayout :指定采样的排列方式,交错排列或非交错排列。DAQmx_Val_GroupByChannel :按通道分组(未插入),DAQmx_Val_GroupByScanNumber :按样本分组(交错)
  • writeArray :要写入的数据
  • reserved:保留以备将来使用。将NULL传递给此参数。

示例:

uInt8       data[71]={0, 0, 0, 0, 0, 0, 0, 0,
                          0, 0, 0, 0, 0, 0, 0, 0,
                          0, 0, 0, 0, 0, 0, 0, 0,
                          0, 0, 0, 0, 0, 0, 0, 0,
                          0, 0, 0, 0, 0, 0, 0, 0,
                          0, 0, 0, 0, 0, 0, 0, 0,
                          0, 0, 0, 0, 0, 0, 0, 0,
                          0, 0, 0, 0, 0, 0, 0, 0 };
DAQmxWriteDigitalLines(taskHandle,1,1,10.0,DAQmx_Val_GroupByChannel,data,NULL,NULL);

5. DAQmxStopTask

int32 DAQmxStopTask (TaskHandle taskHandle);

说明:
关闭任务

参数:

  • taskHandle: 对此函数中创建的任务的引用

示例:

DAQmxStopTask(taskHandle);

6. DAQmxClearTask

int32 DAQmxClearTask (TaskHandle taskHandle);

说明:
清除任务

参数:

  • taskHandle: 对此函数中创建的任务的引用

示例:

DAQmxClearTask(taskHandle);

三. 示例

TaskHandle	taskHandle=0;
uInt8       data[71]={0, 0, 0, 0, 0, 0, 0, 0,
                          0, 0, 0, 0, 0, 0, 0, 0,
                          0, 0, 0, 0, 0, 0, 0, 0,
                          0, 0, 0, 0, 0, 0, 0, 0,
                          0, 0, 0, 0, 0, 0, 0, 0,
                          0, 0, 0, 0, 0, 0, 0, 0,
                          0, 0, 0, 0, 0, 0, 0, 0,
                          0, 0, 0, 0, 0, 0, 0, 0 };

DAQmxCreateTask("", &taskHandle);
DAQmxCreateDOChan(taskHandle, "Dev1/line0:71","",DAQmx_Val_ChanForAllLines);
DAQmxStartTask(taskHandle);
DAQmxWriteDigitalLines(taskHandle,1,1,10.0,DAQmx_Val_GroupByChannel,data,NULL,NULL);
DAQmxStopTask(taskHandle);
DAQmxClearTask(taskHandle);
  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

AoDeLuo

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值