Verfasst am: 09.06.2017, 09:21
Titel: Das Problem von real time Plot bei GUI
Hallo zusammen,
Ich versuche eine GUI zu erstellen, indem Daten von einem Simulink-Modell in Echtzeit geplottet werden. Mit Hilfe des Eventlisteners und einem M-File "update_gui.m" habe ich es schon hinbekommen, den aktuellen Wert der Simulation in ein Textfeld vom GUI zu übertragen, dass also der aktuelle Wert immer angezeigt wird. Die Simulationszeit kann ich auch auslesen.
Aber mit meiner Code kann ich nur bei erstem Mal erfolgreich simulieren und die Graph echtzeitfähig in Axes bei GUI bezeichnen. Aber für das zweite Mal bekomme ich immer eine Fehlermeldung, wie
Warning: Error occurred while evaluating listener callback.
??? Error using ==> plot
Error in ==> updategui at 28
plot_handle=plot(guiplot,XData,YData);
Kann jemand mir helfen ? Wie kann man dieses Problem lösen ?
Die Anlage sind alle mein relative Dokument.
ich habe auf deinen anderen Beitrag geantwortet. Die Fehlermeldung kann ich nicht nachvollziehen, anfangs blieb lediglich der Plot leer.
Wenn dir die Antwort nicht weitergeholfen hat, dann schreibe doch bitte, inwiefern nicht und wo die weiteren Probleme liegen. Zudem solltest du auch die MATLAB-Version angeben, mit der du arbeitest.
Mit dem Pushen von Beiträgen sollte im übrigen 24 Stunden gewartet werden.
http://www.gomatlab.de/der-kleine-gomatlab-de-knigge-t125.html
ich glaube, das Problem liegt bei update_gui.m und update_gui1.m. Meine eigene Meinung ist, die persistent Variable "plot_handle" und "plot_handle1" sind nach dem Simulation nicht gelöscht. Deshalb für das zweite Mal von Simulation bleibt die vorherige Werte noch. Deshalb gibt es Fehlermeldung. Aber was ich nicht weiß ist, wie kann man die Werte von persistent Variable nach der Simulation löschen bzw. die Erneuerung von persistent Variable ?
Ich denke , die Schlüssel ist die persistent Variable. Leider weiß ich nicht, wie kann man dieses Problem lösen.
Bitte hilf mir. Ich bedanke bei dir. Übrigens , meine Version ist R2016a.
Grüße
Jieshen
[EDITED, Jan, Bitte kein Top-Quoting der gesamten vorhergehenden Nachricht - Danke!]
welche update_gui1 denn?
Ich habe dir die Dateien nochmal angehängt. Funktioniert einwandfrei, auch unter R2016a.
Die Fehlermeldung konnte ich auch unter R2016a nicht reproduzieren.
wunderbar ! Die Dokumente, die du mir gegeben hast, lief durch wie du gesagt. Es keine Probleme bei deiner Dokument. Aber ich habe gefunden, es gibt noch einige Unterschiede zwischen dein update_gui.m und mein update_gui.m. Die Folgende sind meine Code in update_gui.m.
Die Unterschied ist die Befehl : guiplot=findobj(0, 'Tag','axesplot1'); (Das ist meine Code.)
Und deine Code ist : guiplot=findobj(0, 'Type', 'axes');
Bei deine Code gibt es keine Problem. Aber bei mir, wie gesagt, kann man bei erstem Mal erfolgreich simulieren. Leider für zweite bekommt man immer eine Fehlermeldung wie
Warning: Error occurred while evaluating listener callback.
??? Error using ==> plot
Error in ==> updategui at 28
plot_handle=plot(guiplot,XData,YData);
Kannst du mir erklären, was ist die Unterschiede zwischen diese Beiden. Ich verstehe nicht , wieso benutzen wir "Type" "axes", aber nicht "Tag" "axesplot" ("axesplot" habe ich schon bei guide als der "Tag" von axes eingestellt.) .
Eine andere Frage ist, z.B. wenn ich zwei axes bei GUI eingestellt. Dann wie kann ich mit der Befehl : guiplot=findobj(0, 'Type', 'axes'); die axeses unterscheiden, um die Daten in zugehörige Axes zu bezeichnen ?
Aber auf jeden Fall bedanke ich bei dir für deine große Hilfe.
Die Unterschied ist die Befehl : guiplot=findobj(0, 'Tag','axesplot1'); (Das ist meine Code.)
Und deine Code ist : guiplot=findobj(0, 'Type', 'axes');
Auf diesen Unterschied hatte ich dich hingewiesen.
Zitat:
aber nicht "Tag" "axesplot"
Weil das Tag "axesplot" bei dem Ablauf irgendwo verloren geht. Warum, ist mir nicht klar. Das Ergebnis von findobj ist dann jedenfalls ein leeres Objekt, und damit auch ein leerer Plot.
Zitat:
Eine andere Frage ist, z.B. wenn ich zwei axes bei GUI eingestellt. Dann wie kann ich mit der Befehl : guiplot=findobj(0, 'Type', 'axes'); die axeses unterscheiden, um die Daten in zugehörige Axes zu bezeichnen ?
Da wird's schwierig, insofern war das auch eher die schnelle Lösung. Die saubere Lösung ist, herauszufinden, wo das Tag verloren geht.
Weil das Tag "axesplot" bei dem Ablauf irgendwo verloren geht.
Ich glaube, das ist der Grund, wieso bei zweitem Verlauf bekomme ich immer eine Fehlermeldung, weil bei erstem Verlauf das Ergebnis von findobj zum ein leeren Objekt verändert. Deshalb bekomme ich immer Fehlermeldung wie
??? Error using ==> plot
Error in ==> updategui at 28
plot_handle=plot(guiplot,XData,YData);
Da mein Wunsch die Verlauf von einige Parameter gleichzeitig in axes bezeichnen. Deshalb würde ich nach dir fragen, ob es möglich wäre, für real-time-plot von mehrere Graph in GUI. Ich weiß nicht, mit welche Befehle kann man das verwirklichen. Ich glaube, diese Methode von Eventlistener ist sehr geeignet für echtzeitfähige Simulation zwischen GUI und Simulink. Leider ist real-time plot ehrlich ein Problem.
Kannst du mir noch einige relative Hinweise geben ? Oder kannst du mir einige wichtige Befehle wie guiplot=findobj(0, 'Tag','axesplot1'); guiplot=findobj(0, 'Type', 'axes'); mitteilen, weil ich nicht weiß, wie viele Eigenschaften ein Objekt hat? z.B. wie axes hat "Type" "Tag" etc. Wo kann man darüber wissen ?
Nochmal danke bei dir.
Grüße
Jieshen
[EDITED, Jan, Bitte kein Top-Quoting der gesamten vorhergehenden Nachricht - Danke!]
ich habe jetzt di Code in update_gui.m verändert. Und wenn ich die Simulation durchlaufe, habe ich nicht mehr die Fehlermeldung bekomme. Aber es scheint keine Graph bei axes in GUI. Wieso ? Bedeutet das, mit Befehl "plot(guiplot,XData,YData)" kann man nicht real-time-plot bei axes machen ? Oder man muss mit Befehl "set(plot_handle,'XData',XData,'YData',YData)" real-time-plot machen ?
Die Folgende ist die Code bei update_gui.m. Und die Anlage sind alle Dokument. Du kannst einmal bei R2016a durchlaufen.
%create a run time object that can return the value of the outport block's
%input and then put the value in a string
rto1 = get_param('Beispiel4_sim/simout','RuntimeObject');
% create str from rto1
str = num2str(rto1.InputPort(1).Data);
% get a handle to the GUI's 'edit_display' window display = findobj('Tag','edit_display');
wo die Probleme lagen, hatte ich ja geschrieben. Nun habe ich auch eine Lösung gefunden, die gewünschte Funktionalität ohne cla (setzt Tags zurück) umzusetzen.
Damit kann man auch verschiedene Koordinatensysteme ansteuern.
ist, um die Werte von persistent Variable "plot_handle" nach der Simulation zu löschen. Ist meine Meinung richtig ?
Jetzt habe ich eine neus Frage, wie kann man mehrere Graph in einem selben Koordinatensystem bezeichnen ? Wie wir wissen, mit der Befehl " set(plot_handle1, 'XData', XData1);set(plot_handle1, 'YData', YData1)" kann man ein Graph bei ein Axes bezeichnen. Aber wenn man gleichzeitig ein andere Graph in diese Axes bezeichnen, wird die erste Graph überschrieben. Weißt du wie kann man mehrere Graph in ein Axes bezeichnen ?
Die Anlage ist meine Dokumente. Du kannst einmal durchlaufen.
Auf jeden Fall bedanke ich bei dir. Vielen Danke.
Grüße
Jieshen
[EDITED, Jan, Bitte kein Top-Quoting der gesamten vorhergehenden Nachricht - Danke!]
werden zwei Datensätze geplottet. plot_handle1 ist entsprechend ein Array mit zwei Elementen. Nutze plot_handle1(k), um einen der beiden Plots später anzupassen.
persistent plot_handle1 plot_handle2
%create a run time object that can return the value of the outport block's
%input and then put the value in a string
rto1 = get_param('Beispiel4_sim/simout','RuntimeObject');
rto2 = get_param('Beispiel4_sim/Out1','RuntimeObject');
% create str from rto1
str = num2str(rto1.InputPort(1).Data);
% get a handle to the GUI's 'edit_display' window display = findobj('Tag','edit_display');
% get Data from Simulation
XData1 = get_param('Beispiel4_sim','SimulationTime');
YData1 = rto1.InputPort(1).Data;
XData2 = get_param('Beispiel4_sim','SimulationTime');
YData2 = rto2.InputPort(1).Data;
% save Data to workspace assignin('base','XData1',XData1) assignin('base','YData1',YData1) assignin('base','XData2',XData2) assignin('base','YData2',YData2)
kann ich noch nicht zwei Graph gleichzeitig in ein Axes bezeichnen.
Warum nicht?
Zitat:
Leider hat noch keine Funktion.
Was funktioniert nicht? Du kannst selbst den Debugger verwenden, um dem auf die Spur zu kommen. Etwas anderes würde ich auch nicht machen.
Zitat:
Das verstehe ich noch nicht, was meinst du über plot_handle1(k) ?
Bei meinem Vorschlag enthält plot_handle1 zwei Linien. Wenn du bei einer von beiden später die Daten verändern willst, musst du plot_handle(1) bzw. plot_handle(2) verwenden.
Du kannst Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen. Du kannst Dateien in diesem Forum posten Du kannst Dateien in diesem Forum herunterladen
MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.