0

如果带有 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 call failed with error -200229: 'Buffer is too small to fit read data”。添加行CHK(nidaq.DAQmxCfgInputBuffer(taskHandle, uInt32(10000000)))或增加数据数组的长度没有帮助......

有人可以指出我要更改的正确变量吗?

4

2 回答 2

2

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

简而言之,nidaq.DAQmxReadAnalogF64() 的参数需要在taskHandle 之后附加参数“-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))
于 2013-02-28T07:46:47.527 回答
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()
于 2013-03-25T21:38:31.620 回答