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