一、硬件:
笔记本电脑Windows 10系统
NI USB-6000
二、软件:
(1)Python版本3.7如下
(2)NI DAQmx16.0
查看板卡对应的设备名称;
(3)安装Python下的DAQmx,使用pip install DAQmx进行安装。
三、参考链接:
NI DAQmx Python API说明参考:
https://nidaqmx-python.readthedocs.io/en/latest/index.html
Control NI DAQ Device with Python and NI DAQmx
https://knowledge.ni.com/KnowledgeArticleDetails?id=kA00Z0000019Pf1SAE&l=zh-CN
四、代码示例
import nidaqmx
import pprint
import numpy as np
from matplotlib import pyplot as plt
pp = pprint.PrettyPrinter(indent=4)
with nidaqmx.Task() as task:
task.ai_channels.add_ai_voltage_chan("Dev1/ai0")
print('1 Channel 1 Sample Read: ')
data = task.read()
pp.pprint(data)
data = task.read(number_of_samples_per_channel=1)
pp.pprint(data)
print('1 Channel N Samples Read: ')
data = task.read(number_of_samples_per_channel=10)
x=np.arange(0,len(data))
pp.pprint(data)
plt.plot(x,data)
task.ai_channels.add_ai_voltage_chan("Dev1/ai1")
print('N Channel 1 Sample Read: ')
data = task.read()
pp.pprint(data)
print('N Channel N Samples Read: ')
data = task.read(number_of_samples_per_channel=2)
pp.pprint(data)
执行结果如下:
五、示例2:
import nidaqmx
import tkinter as tk
from tkinter import ttk
import matplotlib
matplotlib.use("TkAgg")
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
from matplotlib.figure import Figure
class voltageContinuousInput(tk.Frame):
def __init__(self, master):
tk.Frame.__init__(self, master)
#Configure root tk class
self.master = master
self.master.title("Voltage - Continuous Input")
self.master.iconbitmap("Voltage - Continuous Input.ico")
self.master.geometry("1100x600")
self.create_widgets()
self.pack()
self.run = False
def create_widgets(self):
#The main frame is made up of three subframes
self.channelSettingsFrame = channelSettings(self, title ="Channel Settings")
self.channelSettingsFrame.grid(row=0, column=1, sticky="ew", pady=(20,0), padx=(20,20), ipady=10)
self.inputSettingsFrame = inputSettings(self, title="Input Settings")
self.inputSettingsFrame.grid(row=1, column=1, pady=(20,0), padx=(20,20), ipady=10)
self.graphDataFrame = graphData(self)
self.graphDataFrame.grid(row=0, rowspan=2, column=2, pady=(20,0), ipady=10)
def startTask(self):
#Prevent user from starting task a second time
self.inputSettingsFrame.startButton['state'] = 'disabled'
#Shared flag to alert task if it should stop
self.continueRunning = True
#Get task settings from the user
physicalChannel = self.channelSettingsFrame.physicalChannelEntry.get()
maxVoltage = int(self.channelSettingsFrame.maxVoltageEntry.get())
minVoltage = int(self.channelSettingsFrame.minVoltageEntry.get())
sampleRate = int(self.inputSettingsFrame.sampleRateEntry.get())
self.numberOfSamples = int(self.inputSettingsFrame.numberOfSamplesEntry.get()) #Have to share number of samples with runTask
#Create and start task
self.task = nidaqmx.Task()
self.task.ai_channels.add_ai_voltage_chan(physicalChannel, min_val=minVoltage, max_val=maxVoltage)
self.task.timing.cfg_samp_clk_timing(sampleRate,sample_mode=nidaqmx.constants.AcquisitionType.CONTINUOUS,samps_per_chan=self.numberOfSamples*3)
self.task.start()
#spin off call to check
self.master.after(10, self.runTask)
def runTask(self):
#Check if task needs to update the graph
samplesAvailable = self.task._in_stream.avail_samp_per_chan
if(samplesAvailable >= self.numberOfSamples):
vals = self.task.read(self.numberOfSamples)
self.graphDataFrame.ax.cla()
self.graphDataFrame.ax.set_title("Acquired Data")
self.graphDataFrame.ax.plot(vals)
self.graphDataFrame.graph.draw()
#check if the task should sleep or stop
if(self.continueRunning):
self.master.after(10, self.runTask)
else:
self.task.stop()
self.task.close()
self.inputSettingsFrame.startButton['state'] = 'enabled'
def stopTask(self):
#call back for the "stop task" button
self.continueRunning = False
class channelSettings(tk.LabelFrame):
def __init__(self, parent, title):
tk.LabelFrame.__init__(self, parent, text=title, labelanchor='n')
self.parent = parent
self.grid_columnconfigure(0, weight=1)
self.xPadding = (30,30)
self.create_widgets()
def create_widgets(self):
self.physicalChannelLabel = ttk.Label(self, text="Physical Channel")
self.physicalChannelLabel.grid(row=0,sticky='w', padx=self.xPadding, pady=(10,0))
self.physicalChannelEntry = ttk.Entry(self)
self.physicalChannelEntry.insert(0, "Dev1/ai0")
self.physicalChannelEntry.grid(row=1, sticky="ew", padx=self.xPadding)
self.maxVoltageLabel = ttk.Label(self, text="Max Voltage")
self.maxVoltageLabel.grid(row=2,sticky='w', padx=self.xPadding, pady=(10,0))
self.maxVoltageEntry = ttk.Entry(self)
self.maxVoltageEntry.insert(0, "10")
self.maxVoltageEntry.grid(row=3, sticky="ew", padx=self.xPadding)
self.minVoltageLabel = ttk.Label(self, text="Min Voltage")
self.minVoltageLabel.grid(row=4, sticky='w', padx=self.xPadding,pady=(10,0))
self.minVoltageEntry = ttk.Entry(self)
self.minVoltageEntry.insert(0, "-10")
self.minVoltageEntry.grid(row=5, sticky="ew", padx=self.xPadding,pady=(0,10))
class inputSettings(tk.LabelFrame):
def __init__(self, parent, title):
tk.LabelFrame.__init__(self, parent, text=title, labelanchor='n')
self.parent = parent
self.xPadding = (30,30)
self.create_widgets()
def create_widgets(self):
self.sampleRateLabel = ttk.Label(self, text="Sample Rate")
self.sampleRateLabel.grid(row=0, column=0, columnspan=2, sticky='w', padx=self.xPadding, pady=(10,0))
self.sampleRateEntry = ttk.Entry(self)
self.sampleRateEntry.insert(0, "1000")
self.sampleRateEntry.grid(row=1, column=0, columnspan=2, sticky='ew', padx=self.xPadding)
self.numberOfSamplesLabel = ttk.Label(self, text="Number of Samples")
self.numberOfSamplesLabel.grid(row=2, column=0, columnspan=2, sticky='w', padx=self.xPadding, pady=(10,0))
self.numberOfSamplesEntry = ttk.Entry(self)
self.numberOfSamplesEntry.insert(0, "100")
self.numberOfSamplesEntry.grid(row=3, column=0, columnspan=2, sticky='ew', padx=self.xPadding)
self.startButton = ttk.Button(self, text="Start Task", command=self.parent.startTask)
self.startButton.grid(row=4, column=0, sticky='w', padx=self.xPadding, pady=(10,0))
self.stopButton = ttk.Button(self, text="Stop Task", command=self.parent.stopTask)
self.stopButton.grid(row=4, column=1, sticky='e', padx=self.xPadding, pady=(10,0))
class graphData(tk.Frame):
def __init__(self, parent):
tk.Frame.__init__(self, parent)
self.create_widgets()
def create_widgets(self):
self.graphTitle = ttk.Label(self, text="Voltage Input")
self.fig = Figure(figsize=(7,5), dpi=100)
self.ax = self.fig.add_subplot(1,1,1)
self.ax.set_title("Acquired Data")
self.graph = FigureCanvasTkAgg(self.fig, self)
self.graph.draw()
self.graph.get_tk_widget().pack()
#Creates the tk class and primary application "voltageContinuousInput"
root = tk.Tk()
app = voltageContinuousInput(root)
#start the application
app.mainloop()
运行结果如下:
六、其他代码参见以下:
在本论坛搜索:nidaqmx-python-master.zip