使用python读取National Instrument USB 6211的两个通道

时间:2013-02-27 08:11:55

标签: python nidaqmx

如果是带有python的USB 6211,我正试图同时读出两个通道。为此,我尝试通过更改行

来调整http://www.scipy.org/Cookbook/Data_Acquisition_with_NIDAQmx中的示例
CHK(nidaq.DAQmxCreateAIVoltageChan(
        taskHandle,
        "Dev1/ai0",
        "", 
        DAQmx_Val_Cfg_Default, 
        float64(-10.0),
        float64(10.0), 
        DAQmx_Val_Volts,
        None))

CHK(nidaq.DAQmxCreateAIVoltageChan(
    taskHandle,
    "Dev1/ai0:1",
    "", 
    DAQmx_Val_Cfg_Default, 
    float64(-10.0),
    float64(10.0), 
    DAQmx_Val_Volts,
    None))

但是接着,我一直收到错误消息“nidaq调用失败,错误-200229:'缓冲区太小而不适合读取数据”。添加行CHK(nidaq.DAQmxCfgInputBuffer(taskHandle, uInt32(10000000)))或增加数据数组的长度没有帮助......

有人能指出我要改变的正确变量吗?

2 个答案:

答案 0 :(得分:2)

我在这里找到了答案:http://www.physics.oregonstate.edu/~hetheriw/whiki/py/topics/ni/files/ni-daq_ctypes_multichannel_adc_usb_6008.txt

简而言之,在taskHandle之后,nidaq.DAQmxReadAnalogF64()的参数需要附加参数“-1”。该行应该如下所示:

CHK(nidaq.DAQmxReadAnalogF64(taskHandle, -1,float64(1.0),
    DAQmx_Val_GroupByScanNumber,#DAQmx_Val_GroupByChannel,#DAQmx_Val_GroupByScanNumber
    data.ctypes.data,max_num_samples,
    ctypes.byref(read),None))

答案 1 :(得分:1)

这是我用USB-6009做A到D的对象。注意:底部是调用过程的示例。

#-------------------------------------------------------------------------------
# Name:       This is a object that takes data from the AtoD board
# Purpose:
#
# Author:      Carl Houtman
#
# Created:     12/10/2012
# Copyright:   (c) Carl Houtman 2012
# Licence:     none
#-------------------------------------------------------------------------------
from PyDAQmx import *
import numpy

class DAQInput:

    def __init__(self, num_data, num_chan, channel, high, low):
        """ This is init function that opens the channel"""
        # Declare variables passed by reference
        taskHandle = TaskHandle()
        read = int32()
        data = numpy.zeros((10000,),dtype=numpy.float64)
        sumi = [0,0,0,0,0,0,0,0,0,0]

        #Get the passed variables
        self.num_data = num_data
        self.channel = channel
        self.high = high
        self.low = low
        self.num_chan = num_chan

        # Create a task and configure a channel
        DAQmxCreateTask(b"",byref(self.taskHandle))
        DAQmxCreateAIVoltageChan(self.taskHandle,self.channel,b"",DAQmx_Val_Cfg_Default,
                                 self.low,self.high,DAQmx_Val_Volts,None)
        # Start the task
        DAQmxStartTask(self.taskHandle)

    def getData(self):
        """ This function gets the data from the board and calculates the average"""
        DAQmxReadAnalogF64(self.taskHandle,self.num_data,10.0,DAQmx_Val_GroupByChannel,
                           self.data,10000,byref(self.read),None)

        # Calculate the average of the values in data (could be several channels)
        i = self.read.value
        for j in range(self.num_chan):
            self.sumi[j] = numpy.sum(self.data[j*i:(j+1)*i])/self.read.value
        return self.sumi

    def killTask(self):
        """ This function kills the tasks"""
        # If the task is still alive kill it
        if self.taskHandle != 0:
            DAQmxStopTask(self.taskHandle)
            DAQmxClearTask(self.taskHandle)

if __name__ == '__main__':
    myDaq = DAQInput(100, 2, b"Dev1/ai0:1", 10.0, -10.0)
    result = myDaq.getData()
    print ("the average readings were {:.4f} and {:.4f} volts".format(result[0], result[1]))
    myDaq.killTask()