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!