1

我正在研究另一个数据采集项目,它已经变成了一个面向对象的编程问题。在代码底部的“main”中,我创建了 Object DAQInput 的两个实例。当我写这篇文章时,我认为我的方法 .getData 会引用特定实例的 taskHandle,但事实并非如此。当我运行时,代码使用第一个句柄执行 getData 任务两次,所以很明显我并不真正了解 Python 中的面向对象编程。很抱歉,如果没有连接 PyDAQmx 和 National Instruments 板,此代码将无法运行。

from PyDAQmx import *
import numpy

class DAQInput:
    # 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]

    def __init__(self, num_data, num_chan, channel, high, low):
        """ This is init function that opens the channel"""
        #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))
        DAQmxCreateAIThrmcplChan(self.taskHandle, self.channel, b"",
                                 self.low, self.high,
                                 DAQmx_Val_DegC,
                                 DAQmx_Val_J_Type_TC,
                                 DAQmx_Val_BuiltIn, 0, None)
        # Start the task
        DAQmxStartTask(self.taskHandle)

    def getData(self):
        """ This function gets the data from the board and calculates the average"""
        print(self.taskHandle)
        DAQmxReadAnalogF64(self.taskHandle, self.num_data, 10,
                           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__':
    myDaq1 = DAQInput(1, 4, b"cDAQ1Mod1/ai0:3", 200.0, 10.0)
    myDaq2 = DAQInput(1, 4, b"cDAQ1Mod2/ai0:3", 200.0, 10.0)
    result = myDaq1.getData()
    print (result[0:4])

    result2 = myDaq2.getData()
    print (result2[0:4])

    myDaq1.killTask()
    myDaq2.killTask()
4

1 回答 1

3

这些变量:

class DAQInput:
    # 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]

是类变量。它们属于类本身并在类的实例之间共享(即,如果您在 中进行修改self.dataInstance1Instace2'sself.data也会被修改)。

如果您希望它们成为实例变量,请在__init__.

于 2013-04-26T19:54:07.760 回答