[ctypes-users] Newbie trys to call nidaq32.dll
Brought to you by:
theller
From: Todd G. G. <pi...@ea...> - 2003-12-23 12:09:48
|
Hello all, int32 DAQmxCreateTask (const char taskName[], TaskHandle *taskHandle); I can see I am in way over my head. I am not sure where to start asking questions so I figured I would dive in and give this a shot. My goal is to be acquire an analog voltage using a data acquisition card from National Instruments and the python language. Pardon my ignorance as I am quite the newbie regarding python. Also, I have done minimal programming in "c". I have done 12 years or programming in LabVIEW. The card is a PCMCIA DacCard model 6062E. Currently I read this card using LabVIEW which inturn calls the nidaq32.dll. My newbie questions start with the dll function "DAQmxCreateTask()" and the following text details the codes successes and failures that I have been having. /* This next three lines of python code seem to work however, I am not sure if the result is correct. >>> from ctypes import * >>> ni = windll.nidaq32 >>> print ni <WinDLL 'nidaq32', handle 21000000 at a90e40> /* The nidaq32.dll manual shows the syntax to this call as. /* int32 DAQmxCreateTask (const char taskName[], TaskHandle *taskHandle); /* The following code might not even be close however, I am unsure what syntax I should use. /* This next two lines of python code seem to work... >>> taskHandle = c_void_p >>> print taskHandle <class 'ctypes.c_void_p'> /* This next line of python code does not work and generates the Traceback shown. >>> ptaskHandle = pointer(taskHandle) Traceback (most recent call last): File "<pyshell#6>", line 1, in -toplevel- ptaskHandle = pointer(taskHandle) File "C:\Python23\Lib\site-packages\ctypes\__init__.py", line 206, in pointer return POINTER(type(inst))(inst) File "C:\Python23\Lib\site-packages\ctypes\__init__.py", line 189, in POINTER {'_type_': cls}) TypeError: _type_ must have storage info >>> /* This next line of python code generates the Traceback error shown. /* What syntax should be used? >>> ni.DAQmxCreateTask("",taskHandle) Traceback (most recent call last): File "<pyshell#5>", line 1, in -toplevel- ni.DAQmxCreateTask("",taskHandle) File "C:\Python23\Lib\site-packages\ctypes\__init__.py", line 250, in __getattr__ func = self._StdcallFuncPtr(name, self) AttributeError: function 'DAQmxCreateTask' not found >>> /*************************************************** /* FYI: Below, I have copied the "ContAcq-IntClk-AnlgStart_Fn.c" written by National Instruments(see below). /* I don't understand all of this function however, I included it to lend some idea of what actually should be occuring. /* Every function call starting with "DAQmx..." is a call to a dll function call. /*************************************************** #include "NIDAQmx.h" #include "ContAcq-IntClk-AnlgStart_Fn.h" // Configures the task. // Recommended parameters: // chan = "Dev1/ai0" // min = -10.0 // max = 10.0 // samplesPerChan = 1000 // rate = 10000.0 // triggerSource = "PFI0" // triggerSlope = DAQmx_Val_Rising // triggerLevel = 0.0 int32 Configure_ContAcqIntClkAnlgStart(const char chan[], float64 min, float64 max, uInt32 samplesPerChan, float64 rate, const char triggerSource[], uInt32 triggerSlope, float64 triggerLevel, uInt32 *numChannels, TaskHandle *taskHandle) { int32 error=0; /********************************************************************* * 1. Create a task. * 2. Create an analog input voltage channel. * 3. Set the rate for the sample clock. Additionally, define the * sample mode to be finite. * 4. Define the parameters for an Analog Slope Start Trigger. *********************************************************************/ DAQmxErrChk (DAQmxCreateTask("",taskHandle)); DAQmxErrChk (DAQmxCreateAIVoltageChan(*taskHandle,chan,"",DAQmx_Val_Cfg_Default,min,max, DAQmx_Val_Volts,NULL)); DAQmxErrChk (DAQmxCfgSampClkTiming(*taskHandle,"",rate,DAQmx_Val_Rising,DAQmx_Val_ContSa mps,samplesPerChan)); DAQmxErrChk (DAQmxCfgAnlgEdgeStartTrig(*taskHandle,triggerSource,triggerSlope,triggerLev el)); if( numChannels ) DAQmxErrChk (DAQmxGetTaskAttribute(*taskHandle,DAQmx_Task_NumChans,numChannels)); Error: return error; } // Starts the task. int32 Start_ContAcqIntClkAnlgStart(TaskHandle taskHandle) { return DAQmxStartTask(taskHandle); } // Reads data into user allocated buffer. // Recommended parameters: // bufferSize = 1000 int32 Read_ContAcqIntClkAnlgStart(TaskHandle taskHandle, uInt32 sampsPerChan, float64 data[], uInt32 bufferSize, int32 *read) { return DAQmxReadAnalogF64(taskHandle,sampsPerChan,10.0,DAQmx_Val_GroupByScanNumber, data,bufferSize,read,NULL); } // Stops the task. int32 Stop_ContAcqIntClkAnlgStart(TaskHandle taskHandle) { int32 error=0; error = DAQmxStopTask(taskHandle); DAQmxClearTask(taskHandle); return error; } /*************************************************************************** ******************************* Any information or ideas would be greatly apprecieted! Thank you, Todd -- Todd Gardner San Jose, CA |