Visualisierung von Messdaten (Oszilloskop)

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
neidhju
User
Beiträge: 3
Registriert: Freitag 14. August 2020, 18:57

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---------------------------------------------------------------------------
tonikae
User
Beiträge: 90
Registriert: Sonntag 23. Februar 2020, 10:27

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
neidhju
User
Beiträge: 3
Registriert: Freitag 14. August 2020, 18:57

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.
Benutzeravatar
sparrow
User
Beiträge: 4538
Registriert: Freitag 17. April 2009, 10:28

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.
neidhju
User
Beiträge: 3
Registriert: Freitag 14. August 2020, 18:57

Vielen Dank.
Antworten