Считывание двух каналов National Instrument USB 6211 с питоном

Я пытаюсь считывать два канала одновременно, если 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))

to

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))) или увеличение длины массива данных не помогло...

Может ли кто-нибудь указать мне правильную переменную для изменения?


person Dzz    schedule 27.02.2013    source источник


Ответы (2)


Я нашел ответ здесь: http://www.physics.oregonstate.edu/~hetheriw/whiki/py/topics/ni/files/ni-daq_ctypes_multichannel_adc_usb_6008.txt

Короче говоря, аргументы nidaq.DAQmxReadAnalogF64() нуждаются в дополнительном аргументе «-1» после taskHandle. Тогда строка должна выглядеть так:

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))
person Dzz    schedule 28.02.2013

Вот объект, который я использую для преобразования A в D с помощью USB-6009. Примечание: внизу приведен пример вызывающей процедуры.

#-------------------------------------------------------------------------------
# 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()
person Carl Houtman    schedule 25.03.2013