Real-Time Plot von Bewegungskurve

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
web277p9
User
Beiträge: 1
Registriert: Dienstag 26. Juni 2012, 12:38

Hey,
ich arbeite an einer Motorsteuerung, die mir während des Verfahrens Zeit und Position im Fenster ausgibt. Ich würde aus diesen Daten nun allerdings gerne einen Real-Time Plot erzeugen.
Ich habe viel im Internet und in diesem Forum gesuch und auch die beiden folgenden Beispiele gefunden. Link 1 und Link 2

Beide habe ich versucht, in mein Programm zu implemtieren, aber das hat nicht wirklich funktioniert.
Hier ist ein Auzug aus meinem Programm mit dem Beispiel aus Link 2.

Code: Alles auswählen

#Dabei sind:
d.SdoRd(0x3850, 0)        # aktuelle Zeit
d.SdoRd(0x3762, 0)        # aktuelle Position
# Welche geplottet werden sollen

Code: Alles auswählen

from pylab import *
import matplotlib.pyplot as plt
fig = plt.figure() 


from mc.dsa import *                      # Modul mc.dsa mit der Klasse Dsa importieren
import time                               # Modul time importieren
import math                               # Modul math importieren

####
#Code und Berechnungen
####

def test(neuxwert, neuywert):         # Komplett nur übernommen
    global background
    # restore the clean slate background
    fig.canvas.restore_region(background)
    # update the data
    t = neuxwert
    y = neuywert
    xdata.append(t)
    ydata.append(y)
    xmin, xmax = ax.get_xlim()
    if t>=xmax:
        ax.set_xlim(xmin, 2*xmax)
        fig.canvas.draw()
        background = fig.canvas.copy_from_bbox(ax.bbox)

    line.set_data(xdata, ydata)

    # just draw the animated artist
    ax.draw_artist(line)
    print "zeichne!"
    # just redraw the axes rectangle
    fig.canvas.blit(ax.bbox)

 
fig.canvas.draw()    # Richtige Position?

while 1:                                                                      # unendliche Schleife

            mc.Delay(1)                                                       # 1ms Verzögerung

            # Verfahren
            if Step==0:                                                       # Wenn
               d.SdoWr( 0x3790, 0, Sollpos)                             # Starte Positionierung nur einmalig
               mc.Delay(1)                                                    # 1ms Verzögerung
               Step=1                                                         #
            elif Step==1:
               status=d.SdoRd(0x3002, 0)                                      # Status lesen
               if status & 0x10:                                   # Warte bis Zielpos erreicht Bit 4 = target reached ?
                  mc.Delay(1)                                                 # 1ms Verzögerung
                  Step=0
                  if Sollpos==Ende:                                           # Sollposition umschalten
                     Sollpos=Start                                            # Jetzt Reinfahren
                  else:
                     Sollpos=Ende                                             # Jetzt Rausfahren
            
            # Ausgaben
            print d.SdoRd(0x3850, 0)-StartZeit , "," , d.SdoRd(0x3762, 0)     # Ausgabe der Zeit[ms] | Position [incr]         
            xWert = d.SdoRd(0x3850, 0)-StartZeit	        # x-Wert (aktuelle Zeit)
            yWert = d.SdoRd(0x3762, 0)        		       # y-Wert (aktuelle Position)
    

            test(xWert , yWert )                                 # Ausführen
           
Das Programm läuft ohne Fehlermedung, es passiert aber nichts :)
Geht das ganze vielleicht sogar einfacher, oder seht ihr den Fehler?

Vielen Dank schoneinmal!
Grüße,
web
Benutzeravatar
Sr4l
User
Beiträge: 1091
Registriert: Donnerstag 28. Dezember 2006, 20:02
Wohnort: Kassel
Kontaktdaten:

irgendwie fehlt dir ein draw() nach jedem aufruf von test().


Minimales Beispiel aus dem matplotlib doku:

Code: Alles auswählen

from matplotlib import pylab

pylab.ion()
x = pylab.arange(0,2*pylab.pi,0.01)
line, = pylab.plot(x,pylab.sin(x))

i = 0
while True:
    line.set_ydata(pylab.sin(x+i/10.0))
    pylab.draw()
    i += 1
Antworten