Mit PyVISA können Sie Daten vom Oszilloskop abrufen. Informationen zur Installationsmethode finden Sie unter VISA in Python - Qiita. In meinem Fall ist bei der Verwendung von PyVISA ein Fehler aufgetreten. [[Hinweis] pyvisa.errors.VisaIOError: VI_ERROR_INV_OBJECT (-1073807346): Die angegebene Sitzungs- oder Objektreferenz ist ungültig. --Qiita] Ich habe NI-VISA unter Bezugnahme auf (https://qiita.com/grinpeaceman/items/9a580c137f1cbbfe5ba7) installiert.
Unten finden Sie den Code und beschreibende Kommentare.
import numpy as np
import visa
rm = visa.ResourceManager()
#An diesem Ort, rm.list_resources()Von innen
#Wählen Sie das gewünschte Gerät und rm.open_resource()Bitte weitergeben an
inst = rm.open_resource(rm.list_resources()[0])
#Timeout-Einstellung
scope.timeout = 30000 #30 Sekunden
# Setting source as Channel 1
scope.write('DATA:SOU CH1')
scope.write('DATA:WIDTH 1')
scope.write('DATA:ENC ASCI')
#Es ist eine Einstellung, um Daten vom Oszilloskop auf VOLL zu erfassen
#In meiner Umgebung scheint das Auskommentieren dieses Speicherorts die Datenmenge zu verringern
scope.write('DATA:RESOLUTION FULL')
# Getting axis info
#Der Prozess des Abrufens von Daten ist
# How to save Data from Oscilloscope using Python in Linux - Tech For Curious
# <https://techforcurious.website/how-to-save-data-from-oscilloscope-using-python-in-linux/#more-348>Oder
# How do I get a waveform using the Instrument Control Toolbox in Matlab? | Tektronix
# <https://techforcurious.website/how-to-save-data-from-oscilloscope-using-python-in-linux/#more-348>
#Ich bezog mich auf
ymult = float(scope.query('WFMPRE:YMULT?')) # y-axis least count
yzero = float(scope.query('WFMPRE:YZERO?')) # y-axis zero error
yoff = float(scope.query('WFMPRE:YOFF?')) # y-axis offset
xincr = float(scope.query('WFMPRE:XINCR?')) # x-axis least count
xoff = float(scope.query('WFMP:PT_OFF?')) # x-axis offset
xzero = float(scope.query('WFMPRE:XZERO?')) # x-axis least count
#Holen Sie sich die Daten. In meiner Umgebung ca. 6.Es dauerte 5 Sekunden
ADC_wave = scope.query_ascii_values('CURV?', container=np.array)
#Daten
volts = (ADC_wave - yoff) * ymult + yzero
time = np.arange(xzero, xincr * len(Volts) - xoff + xzero, xincr)
Hier ist der obige Code, mit dem Sie Daten in Echtzeit erfassen, anzeigen und speichern können.
import numpy as np
import matplotlib.pyplot as plt
import visa
from matplotlib import _pylab_helpers
import tkinter
from tkinter import filedialog
import threading
import csv
#Flagge, die sagt, ob gespeichert werden soll
#Sperren Sie den Thread, wenn Sie diese Variable ändern
is_save_requested = False
def gui(lock):
global is_save_requested
def change_title():
global is_save_requested
lock.acquire()
is_save_requested = True
lock.release()
root = tkinter.Tk()
#Taste
button1 = tkinter.Button(
master=root,
text="Save", #Ursprünglicher Wert
width=30, #Breite
bg="lightblue", #Farbe
command=change_title #Funktion, die beim Klicken ausgeführt werden soll
)
button1.pack()
root.mainloop()
def get_data_from_inst(rm , scope):
scope.timeout = 30000
# Setting source as Channel 1
scope.write('DATA:SOU CH1')
scope.write('DATA:WIDTH 1')
scope.write('DATA:ENC ASCI')
scope.write('DATA:RESOLUTION FULL')
# Getting axis info
ymult = float(scope.query('WFMPRE:YMULT?')) # y-axis least count
yzero = float(scope.query('WFMPRE:YZERO?')) # y-axis zero error
yoff = float(scope.query('WFMPRE:YOFF?')) # y-axis offset
xincr = float(scope.query('WFMPRE:XINCR?')) # x-axis least count
xoff = float(scope.query('WFMP:PT_OFF?')) # x-axis offset
xzero = float(scope.query('WFMPRE:XZERO?')) # x-axis least count
ADC_wave = scope.query_ascii_values('CURV?', container=np.array)
Volts = (ADC_wave - yoff) * ymult + yzero
Time = np.arange(xzero, xincr * len(Volts) - xoff + xzero, xincr)
return (Time, Volts)
def main():
rm = visa.ResourceManager()
inst = rm.open_resource(rm.list_resources()[0])
#Einrichten einer GUI, die das Speichern auslöst
global is_save_requested
lock = threading.Lock()
t1 = threading.Thread(target=gui, args=(lock,))
t1.start()
data = get_data_from_inst(rm, inst)
x, y = data
x = x * 1e6 # sec to micro sec
y = y * 1e3 # V to mV
fig, ax = plt.subplots(1, 1)
ax.set_xlabel('time(μs)')
ax.set_ylabel('Intensity (mV)')
lines, = ax.plot(x, y)
while True:
manager = _pylab_helpers.Gcf.get_active()
if manager is None: break
#Plotdaten aktualisieren
data = get_data_from_inst(rm, inst)
x, y = data
x = x * 1e6 # sec to micro sec
y = y * 1e3 # V to mV
# data update
lines.set_data(x, y)
plt.pause(.01)
#Prozess speichern
lock.acquire()
if is_save_requested:
file = filedialog.asksaveasfilename(initialfile='', title = "Wählen Sie einen Speicherort",filetypes = [("CSV-Datei", ".csv")])
if file:
with open(file, mode='w',encoding="utf-8") as f:
writer = csv.writer(f, lineterminator='\n')
writer.writerows(np.array(data).T)
is_save_requested = False
lock.release()
if __name__ == "__main__":
main()
pyVISA ist sehr praktisch!