用python实现国家仪器usb6211的两路读出

2024-10-01 07:40:08 发布

您现在位置:Python中文网/ 问答频道 /正文

我试着用python同时读出usb6211的两个通道。为此,我试图修改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))

^{pr2}$

但随后,我不断收到错误消息“nidaq call failed with error-200229:“缓冲区太小,无法容纳读取数据”。添加CHK(nidaq.DAQmxCfgInputBuffer(taskHandle, uInt32(10000000)))行或增加数据数组的长度无助于。。。在

有人能告诉我要改变的变量吗?在


Tags: orghttpdatawwwwithvalscipyfloat64
2条回答

这是一个我用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()

我在这里找到了答案: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))

相关问题 更多 >