04-22-2014 12:45 PM
Hi,
I am trying to use the NI 9401 in an NI cDAQ-9174 to do both digital input and output reads and writes.
I am using the following code, and added calls to unreserve the channels after using them - but I still get the -200022 failure.
Thanks,
Wael Hemdan
MathWorks
#include <stdio.h>
#include <NIDAQmx.h>
#define DAQmxErrChk(functionCall) if( DAQmxFailed(error=(functionCall)) ) goto Error; else
int main(void)
{
int error=0;
TaskHandle taskHandleDI=0;
TaskHandle taskHandleDO=0;
uInt8 data;
char errBuff[2048]={'\0'};
/*********************************************/
// DAQmx Configure Code
/*********************************************/
DAQmxErrChk (DAQmxCreateTask("",&taskHandleDI));
DAQmxErrChk (DAQmxCreateTask("",&taskHandleDO));
DAQmxErrChk (DAQmxCreateDIChan(taskHandleDI,"cdaq1mod1/port0/line0","",DAQmx_Val_ChanForAllLines));
DAQmxErrChk (DAQmxCreateDIChan(taskHandleDI,"cdaq1mod1/port0/line1","",DAQmx_Val_ChanForAllLines));
DAQmxErrChk (DAQmxCreateDIChan(taskHandleDI,"cdaq1mod1/port0/line2","",DAQmx_Val_ChanForAllLines));
DAQmxErrChk (DAQmxCreateDIChan(taskHandleDI,"cdaq1mod1/port0/line3","",DAQmx_Val_ChanForAllLines));
DAQmxErrChk (DAQmxCreateDOChan(taskHandleDO,"cdaq1mod1/port0/line4","",DAQmx_Val_ChanForAllLines));
DAQmxErrChk (DAQmxCreateDOChan(taskHandleDO,"cdaq1mod1/port0/line5","",DAQmx_Val_ChanForAllLines));
DAQmxErrChk (DAQmxCreateDOChan(taskHandleDO,"cdaq1mod1/port0/line6","",DAQmx_Val_ChanForAllLines));
DAQmxErrChk (DAQmxCreateDOChan(taskHandleDO,"cdaq1mod1/port0/line7","",DAQmx_Val_ChanForAllLines));
/*********************************************/
// DAQmx Start Code
/*********************************************/
DAQmxErrChk (DAQmxStartTask(taskHandleDI));
DAQmxErrChk (DAQmxStartTask(taskHandleDO));
printf("Continuously polling. Press Ctrl+C to interrupt\n");
while( 1 ) {
/*********************************************/
// DAQmx Read Code
/*********************************************/
DAQmxErrChk (DAQmxTaskControl(taskHandleDI, DAQmx_Val_Task_Commit));
DAQmxErrChk (DAQmxReadDigitalLines(taskHandleDI,1,10,DAQmx_Val_GroupByScanNumber,&data,2048,0,0,0));
DAQmxErrChk (DAQmxTaskControl(taskHandleDI, DAQmx_Val_Task_Unreserve));
DAQmxErrChk (DAQmxTaskControl(taskHandleDO, DAQmx_Val_Task_Commit));
DAQmxErrChk (DAQmxWriteDigitalLines(taskHandleDO,1,1,10,DAQmx_Val_GroupByScanNumber,&data,0,0));
DAQmxErrChk (DAQmxTaskControl(taskHandleDO, DAQmx_Val_Task_Commit));
printf("\rCount: %d",data);
fflush(stdout);
}
Error:
puts("");
if( DAQmxFailed(error) )
DAQmxGetExtendedErrorInfo(errBuff,2048);
if(( taskHandleDI!=0 ) && (taskHandleDO!=0)) {
/*********************************************/
// DAQmx Stop Code
/*********************************************/
DAQmxStopTask(taskHandleDI);
DAQmxStopTask(taskHandleDO);
DAQmxClearTask(taskHandleDI);
DAQmxClearTask(taskHandleDO);
}
if( DAQmxFailed(error) )
printf("DAQmx Error: %s\n",errBuff);
printf("End of program, press Enter key to quit\n");
getchar();
return 0;
}
DAQmx Error: Resource requested by this task has already been reserved by a different task.
Device: cDAQ1Mod1
Task Name: _unnamedTask<0>
Status Code: -200022
End of program, press Enter key to quit
04-24-2014 06:27 PM
Hi Wael,
Did you check where the code errors? I bet it's the second start. The reserves need to happen before any task is started.
I think what you're trying to do is something like this:
DI reserve
DO reserve
DI start
DO start
while loop
DI read
DO write
DI stop
DO stop
DI clear
DO clear