Seite 1 von 1

Visualisierung von Messdaten (Oszilloskop)

Verfasst: Montag 17. August 2020, 15:16
von neidhju
Hallo Forum,

ich habe ein USB Oszilloskop bei dem ich die Messdaten Visualisieren will. Zusätzlich will ich die Daten modifizieren und entsprechend graphisch darstellen. Für die Visualisierung nutze ich PYQT5 und Matplotlib. Bei der Initialisierung lassen sich die Messfenster erzeugen. Die Messkurven (simulierter Sinus und Cosinus) können dargestellt werden. Jedoch lassen sich die Daten über einen Timer nicht aktualisieren. In den entsprechenden Python Fachbüchern kann ich leider auch nichts zu dem Fehler finden. Ich erhalte die Fehlermeldung " object has no Attribute ´_ax1´". Hat jemand einen guten Rat wo mein Fehler liegt?
Vielen Dank für eure Unterstützung und Anmerkungen vorab!
Jürgen
---------------------------------------------------------------Begin CODE--------------------------------------
import time
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtWidgets import QMainWindow, QApplication, QWidget, QPushButton, QAction, QLineEdit, QMessageBox, QLabel
from matplotlib.figure import Figure
from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas
from matplotlib.backends.backend_qt5agg import NavigationToolbar2QT as NavigationToolbar
import numpy as np


class Window(QtWidgets.QWidget):
def __init__(self):
super(Window, self).__init__()

figure1 = Figure()
figure2 = Figure()
figure3 = Figure()
figure4 = Figure()
canvas1 = FigureCanvas(figure1)
canvas2 = FigureCanvas(figure2)
canvas3 = FigureCanvas(figure3)

ax1 = figure1.add_subplot(111)
ax2 = figure2.add_subplot(111)
ax3 = figure3.add_subplot(111)

toolbar1 = NavigationToolbar(canvas1, self)
toolbar2 = NavigationToolbar(canvas2, self)
toolbar3 = NavigationToolbar(canvas3, self)

mainLayout = QtWidgets.QGridLayout()
mainLayout.addWidget(toolbar1,0,0)
mainLayout.addWidget(toolbar2,0,1)
mainLayout.addWidget(toolbar3,2,0)

mainLayout.addWidget(canvas1,1,0)
mainLayout.addWidget(canvas2,1,1)
mainLayout.addWidget(canvas3,3,0)

ax1.set_title("Messsignal")
ax2.set_title("Analyse 1")
ax3.set_title("Analyse 2")

self.setLayout(mainLayout)
self.setWindowTitle("Signal Analye")

time = np.arange(0, 50, 0.1);
# Amplitude of the sine wave is sine of a variable like time
# Testsignal
amplitude = np.sin(time)
ax1.set_title("Messsignal")
ax1.plot(time,amplitude*10)

time2 = np.arange(0, 50, 0.1);
amplitude2 = np.cos(time2)
ax2.plot(time2,amplitude2)

amplitude3 = amplitude + amplitude2
ax3.plot(time2,amplitude3)

#---------------Timer------------
self._timer = canvas1.new_timer(100, [(self._update_canvas, (),{})])
self._timer.start()

#Aktualisierung des Messsignals
def _update_canvas(self):
self._ax1.clear()
t = nplinespace(0, 10, 0)
self._ax1.plot(t, np.sin(t + time.time()))
self._ax1.figure.canvas1.draw()


if __name__ == '__main__':

import sys

app = QtWidgets.QApplication(sys.argv)
mainWin = Window()
mainWin.show()
sys.exit(app.exec_())

----------------------------------------------------------Ende CODE---------------------------------------------------------------------------

Re: Visualisierung von Messdaten (Oszilloskop)

Verfasst: Dienstag 18. August 2020, 11:22
von tonikae
Also ich weiss zwar nicht wie dein USB-Oszilloskop funktioniert, aber
du hast in " def _update_canvas(self):" dreimal "_ax1" anstatt "ax1"
Den Unterstrich habe ich mal wegemacht und das Fenster mit
den drei Plots wurde fehlerfrei angezeigt(nur den Timerstart
habe ich auskommentiert, weil sonst das Fenster immer
geschlossen wurde)

https://drive.google.com/file/d/1hwWoTY ... T5AcM/view

Re: Visualisierung von Messdaten (Oszilloskop)

Verfasst: Dienstag 18. August 2020, 12:35
von neidhju
Vielen Dank für Deine Info. Der Timer ist aber genau das Problem, genaugenommen dass was in der Funktion steht. Über den Timer soll das 1ste Messfenster mit Messdaten aktualisiert werden. Der Timer wird auch ordnungsgemäß aufgerufen. Jedoch gibt es eine Fehlermeldung "'Window' object has no attribute 'ax1'" bzw. wenn ax1 anders definiert ist mit "'Window' object has no attribute '_ax1'" und das 1ste Fenster wird nicht aktualisiert.

Re: Visualisierung von Messdaten (Oszilloskop)

Verfasst: Dienstag 18. August 2020, 12:49
von sparrow
Ich bin mal so frei, deinen Code in Code-Tags zu setzen, damit man ihn lesen kann:

Code: Alles auswählen

import time 
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtWidgets import QMainWindow, QApplication, QWidget, QPushButton, QAction, QLineEdit, QMessageBox, QLabel
from matplotlib.figure import Figure
from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas
from matplotlib.backends.backend_qt5agg import NavigationToolbar2QT as NavigationToolbar
import numpy as np


class Window(QtWidgets.QWidget):
    def __init__(self):
        super(Window, self).__init__()
                
        figure1 = Figure()
        figure2 = Figure()
        figure3 = Figure()
        figure4 = Figure()
        canvas1 = FigureCanvas(figure1)
        canvas2 = FigureCanvas(figure2)
        canvas3 = FigureCanvas(figure3)
        
        ax1 = figure1.add_subplot(111)
        ax2 = figure2.add_subplot(111)
        ax3 = figure3.add_subplot(111)
        
        toolbar1 = NavigationToolbar(canvas1, self)
        toolbar2 = NavigationToolbar(canvas2, self)
        toolbar3 = NavigationToolbar(canvas3, self)
        
        mainLayout = QtWidgets.QGridLayout()
        mainLayout.addWidget(toolbar1,0,0)
        mainLayout.addWidget(toolbar2,0,1)
        mainLayout.addWidget(toolbar3,2,0)
        
        mainLayout.addWidget(canvas1,1,0)
        mainLayout.addWidget(canvas2,1,1)
        mainLayout.addWidget(canvas3,3,0)
        
        ax1.set_title("Messsignal")                                                               
        ax2.set_title("Analyse 1")
        ax3.set_title("Analyse 2")
        
        self.setLayout(mainLayout)
        self.setWindowTitle("Signal Analye")
        
        time = np.arange(0, 50, 0.1);                                 
        # Amplitude of the sine wave is sine of a variable like time
        # Testsignal
        amplitude = np.sin(time)                                       
        ax1.set_title("Messsignal")                                                               
        ax1.plot(time,amplitude*10)
        
        time2 = np.arange(0, 50, 0.1);                                 
        amplitude2 = np.cos(time2)
        ax2.plot(time2,amplitude2)
        
        amplitude3 = amplitude + amplitude2
        ax3.plot(time2,amplitude3)

        #---------------Timer------------
        self._timer = canvas1.new_timer(100, [(self._update_canvas, (),{})])
        self._timer.start()
        
    #Aktualisierung des Messsignals
    def _update_canvas(self):
        self._ax1.clear()
        t = nplinespace(0, 10, 0)
        self._ax1.plot(t, np.sin(t + time.time()))
        self._ax1.figure.canvas1.draw()
        

if __name__ == '__main__':

    import sys

    app = QtWidgets.QApplication(sys.argv)
    mainWin = Window()
    mainWin.show()
    sys.exit(app.exec_())
Das offensichtliche Problem ist, dass alle deine Variablen in der Klasse als Klassen- und nicht als Instanzvariablen angelegt sind. Also alles, was in __init__ angelegt wird.
figure1 ist also self.figure1, etc. Deshalb wird auch self.ax1 nicht gefunden, wenn man versucht darauf zuzugreifen.

Re: Visualisierung von Messdaten (Oszilloskop)

Verfasst: Donnerstag 27. August 2020, 10:15
von neidhju
Vielen Dank.