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

文章目录

  • 一. DAQ数字量输出程序流程
  • 二. DAQ函数说明
    • 1. DAQmxCreateTask
    • 2. DAQmxCreateDOChan
    • 3. DAQmxStartTask
    • 4. DAQmxWriteDigitalLines
    • 5. DAQmxStopTask
    • 6. DAQmxClearTask
  • 三. 示例

一. 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);

你可能感兴趣的:(c++,c++)