WorldViz User Forum  

Go Back   WorldViz User Forum > Vizard

Reply
 
Thread Tools Rating: Thread Rating: 20 votes, 5.00 average. Display Modes
  #1  
Old 09-11-2012, 01:59 PM
mhead10 mhead10 is offline
Member
 
Join Date: Mar 2012
Posts: 40
Continuous DAQ with NI USB 6008 and DAQmx

Does anyone have any experience with continuous data acquisition using a NI-DAQ using the ctypes module to access the NI-DAQ family of libraries for NI instruments? I'm trying to use the "cookbook article" from here from SciPy which translates a sample C program for analog signal acquisition into Python.

I changed it to sample two channels continuosly by setting
Code:
Dev1/ai0"
to
HTML Code:
Dev1/ai0:1"
.

I also then changed the clock timing to continuous samples
HTML Code:
DAQmx_Val_ContSamps
.

I can obtain finite samples fine, however, if I change to "ContSamps", then my data values are read as zero.

If I go back to "FiniteSamps", and then use a timer, I typically only get one or two repeated data arrays, and then nothing else happens. Typically nothing else will happen after the "after stark task" print statement.

I will include all of my code in the hopes that others can benefit off of it because I think this would be a common task, and I have not found any similar complete code elsewhere.

HTML Code:
import ctypes
import numpy
nidaq = ctypes.windll.nicaiu # load the DLL
viz.go()

int32 = ctypes.c_long
uInt32 = ctypes.c_ulong
uInt64 = ctypes.c_ulonglong
float64 = ctypes.c_double
TaskHandle = uInt32
read = int32()

# constants
DAQmx_Val_Cfg_Default = int32(-1)
DAQmx_Val_Volts = 10348
DAQmx_Val_Rising = 10280
DAQmx_Val_FiniteSamps = 10178
DAQmx_Val_ContSamps = 10123
DAQmx_Val_GroupByChannel = 0
DAQmx_Val_GroupByScanNumber= 1 #interleaved

# initialize variables
taskHandle = TaskHandle(0)    
max_num_samples = 2
data = numpy.zeros((max_num_samples,),dtype=numpy.float64)

print 'before error check'
def CHK(err):
    if err < 0:
        buf_size = 100
        buf = ctypes.create_string_buffer('\000' * buf_size)
        nidaq.DAQmxGetErrorString(err,ctypes.byref(buf),buf_size)
        raise RuntimeError('nidaq call failed with error %d: %s'%(err,repr(buf.value)))

#def obtain_value():    
#Main Program
print 'entered main program'
CHK(nidaq.DAQmxCreateTask("",ctypes.byref(taskHandle)))
print 'after create task'
CHK(nidaq.DAQmxCreateAIVoltageChan(taskHandle,"Dev2/ai0:1","",DAQmx_Val_Cfg_Default,float64(-13.0),float64(13.0),DAQmx_Val_Volts,None))
print 'after create voltage'
CHK(nidaq.DAQmxCfgSampClkTiming(taskHandle,"",float64(2),DAQmx_Val_Rising,DAQmx_Val_ContSamps,uInt64(max_num_samples))); #(samples/sec/channel)  #ContSamps    
print 'after clk'
CHK(nidaq.DAQmxStartTask(taskHandle))
print 'after start task'
CHK(nidaq.DAQmxReadAnalogF64(taskHandle,-1,float64(-1),DAQmx_Val_GroupByScanNumber,data.ctypes.data,max_num_samples,ctypes.byref(read),None)) 
print 'after read'
print data
if taskHandle.value != 0:
    nidaq.DAQmxStopTask(taskHandle)
    nidaq.DAQmxClearTask(taskHandle)   
print 'after main program'        
 
#vizact.ontimer(1,obtain_value)

print 'end of loop'
Reply With Quote
  #2  
Old 09-13-2012, 09:49 AM
mhead10 mhead10 is offline
Member
 
Join Date: Mar 2012
Posts: 40
If I run a while loop (to obtain my DAQ data), the maximum number of times the loop will run is 4. After 4 times, "after start task" is displayed, but then nothing else. Therefore, it seems every time the loops gets stuck on the read function.

Any ideas?

I continue to move around what's inside of the function obtain_value, as well as change # of samples and sampling frequency.

Here is the code I'm referring to:

Code:
def obtain_value():
    print 'entered main program'
    CHK(nidaq.DAQmxCreateTask("",ctypes.byref(taskHandle)))
    print ' after create task'
    CHK(nidaq.DAQmxCreateAIVoltageChan(taskHandle,"Dev2/ai0:1","",DAQmx_Val_Cfg_Default,float64(-13.0),float64(13.0),DAQmx_Val_Volts,None))
    print '  after create voltage'
    CHK(nidaq.DAQmxCfgSampClkTiming(taskHandle,"",float64(50),DAQmx_Val_Rising,DAQmx_Val_FiniteSamps,uInt64(max_num_samples))); #(samples/sec/channel)  #ContSamps    
    print '   after clk'
    CHK(nidaq.DAQmxStartTask(taskHandle))
    print '    after start task'
    CHK(nidaq.DAQmxReadAnalogF64(taskHandle,-1,float64(-1),DAQmx_Val_GroupByChannel,data.ctypes.data,max_num_samples,ctypes.byref(read),None)) 
    print '     after read'
    print data
    if taskHandle.value != 0:
        nidaq.DAQmxStopTask(taskHandle)
        nidaq.DAQmxClearTask(taskHandle)   
    print '      end'

i = 0
while i < 5:
    i += 1
    print i
    obtain_value()
Reply With Quote
  #3  
Old 09-19-2012, 09:29 AM
mhead10 mhead10 is offline
Member
 
Join Date: Mar 2012
Posts: 40
I found I could obtain continuous sampling after I downloaded the newest NI MAX driver from NI. Furthermore, I discovered NI I/O (previously called NI Spy). This is an invaluable tool for obtaining real-time information of what your DAQ is doing.
Reply With Quote
Reply

Thread Tools
Display Modes Rate This Thread
Rate This Thread:

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off

Forum Jump


All times are GMT -7. The time now is 04:28 PM.


Powered by vBulletin® Version 3.8.7
Copyright ©2000 - 2024, vBulletin Solutions, Inc.
Copyright 2002-2023 WorldViz LLC