WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

Das Problem von real time Plot bei GUI

 

Harald
Forum-Meister

Forum-Meister


Beiträge: 24.495
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 21.06.2017, 15:36     Titel:
  Antworten mit Zitat      
Hallo,

mir ist die Frage nicht ganz klar, und auch nicht was die GUI nun machen soll.

Variable auf leer setzen: num = [];
Variable löschen: clear num

Eine Frage ist z.B. auch: wenn erst "Start First" und dann "Start Second" gedrückt wird, sollen dann beiden angezeigt werden?

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen


DAFeinfach
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 67
Anmeldedatum: 07.06.17
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 21.06.2017, 16:13     Titel:
  Antworten mit Zitat      
Hallo Harald,

mein Wunsch ist, wenn ich "Start1" drücke, dann bekomme ich nur die erste Graph. wenn "Start 2", dann nur die zweite Graph. wenn "Start Together",dann die beide Graph.

Wie folgende Code bei Function pushbutton_start1_Callback in easy_model.m
Code:
setappdata(handles.axes1,'num','Start1');


Dann mit folgende Code im update_easy.m
Code:
if isempty(wert)
fig_hdl = findobj(0,'Tag','axes1');
wert = getappdata(fig_hdl,'num');
end


kann man den Wert von "num" unter Function pushbutton_start1_Callback in easy_model.m zu der persistent Variable "wert" in update_easy.m geben.

Danach mit folgende Code
Code:

kann man nur die Graph über XData1 bzw. YData1 in axes1 beschrieben.

Aber wenn wir die Simulation stoppen(mit Druck von Knöpf "Stop") und den Knöpf "Start2" drücken , kann ich leider noch die erste Graph bekommen. Der Grund ist, die persistent Variable "wert" in update_easy.m ist noch nicht gelöscht. Deshalb kann die folgende Befehle nicht ausgeführt werden.
Code:
if isempty(wert)
fig_hdl = findobj(0,'Tag','axes1');
wert = getappdata(fig_hdl,'num');
end

Das heißt, wert = "Start1". Deshalb kann nur die Code
Code:

nochmal ausgeführt werden. Aber die Code
Code:

nicht ausgeführt werden.
Das heißt, ich kann nicht die zweite Graph sondern die erste Graph bekommen, obwohl ich schon den Knöpf "Start2" gedrückt habe.
Also, meine Frage ist, wie kann man die persistent Variable "wert" in update_easy.m nach der Simulation löschen ?

Die Anlagen sind relative Dokumente.

Übrigens, als ein Ausländer , es ist relative schwierig für mich ein kompliziertes Problem deutlich zu beschreiben. Ich bedanke dir bei deinem Geduld. Vielen Danke. Very Happy


Grüße
Jieshen

easy_model(4).zip
 Beschreibung:

Download
 Dateiname:  easy_model(4).zip
 Dateigröße:  41.05 KB
 Heruntergeladen:  342 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.495
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 21.06.2017, 18:44     Titel:
  Antworten mit Zitat      
Hallo,

dann sollte es doch reichen, die Abfrage
"if isempty(...)"
zu entfernen? Dann wird num eben in jeder Iteration abgefragt.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
DAFeinfach
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 67
Anmeldedatum: 07.06.17
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 21.06.2017, 23:00     Titel:
  Antworten mit Zitat      
Hallo Harald,

das habe ich auch zuerst gedacht und einmal probiert.
Code:
%if isempty(wert)
fig_hdl = findobj(0,'Tag','axes1');
wert = getappdata(fig_hdl,'num');
%end

Leider habe ich folgende Fehlermeldung bekommt.

Error in using getappdata
----> wert = getappdata(fig_hdl, 'num') (Linie 25)
The value must be a handle.

Bedeutet das, man kann nur am ersten Mal den Wert von "num" zu Variable "wert" geben. Deshalb denke ich, mit der Befehl "if - else" ist es richtig. Das Gedanke ist gleich wie die folgende Code für persistent Variable "plot_handle"
Code:
if isempty(plot_handle) || any(~ishandle(plot_handle))


Das Problem ist noch, wie kann man nach der Simulation den Wert von persistent Variable "wert" löschen. Ich denke, man soll ein Befehl für Löschen von dem Wert unter der Callback-Funktion-Stop schreiben. Aber weiß ich noch nicht wie kann man eine solche Befehl schreiben.


Grüße
Jieshen
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 22.06.2017, 11:51     Titel:
  Antworten mit Zitat      
Hallo DAFeinfach,

Irgendetwas läuft hier schief. Der Code ist kurz und übersichtlich und die Aufgabe im Grunde sehr einfach. Der Thread wird aber immer länger.

Du kannst persistente Variablen löschen z.B. mit:
Code:


Code:
findobj(0,'Tag','axes1');

kann ziemlich zeitaufwändig sein, wenn mehrere Figures mit vielen Grafik-Objekten existieren. Die Suche auch 'Type', 'axes' zusätzlich einzuschränken wäre eine gute Idee.

Zitat:
Code:
if isempty(plot_handle) || any(~ishandle(plot_handle))

Das lässt sich vereinfachen:
Code:

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
DAFeinfach
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 67
Anmeldedatum: 07.06.17
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 22.06.2017, 12:32     Titel:
  Antworten mit Zitat      
Hallo Moderator,

du hast noch nicht meine Frage verstanden. Das Problem über mehrere Grafik gleichzeitig in ein gleich Axes habe ich schon mit Harald gelöscht.

Jetzt meine Frage ist, wie kann man mit Druck von unterschiedliche Knöpfe unterschiedliche Graph in ein selbe Axes bezeichnen ? Das heißt, wenn ich "Start1" drücke,dann bekomme ich erste Graph in Axes. Und wenn ich "Start2" drücke, dann bekomme ich zweite Graph in Axes.

Deshalb habe ich die Code
Code:
if isempty(wert)
fig_hdl = findobj(0,'Tag','axes1');
wert = getappdata(fig_hdl,'num');
end

in update_easy.m schreiben. Leider ich weiß nicht, wie kann man den Wert von persistent Variable "wert" nach der Simulation löschen. Das ist meine Frage.

Wie dein Vorschlag
Code:

geht es nicht.

Ich bitte deine Entschuldigung für einen so langen Thread. Aber wenn du ehrlich denkst, das ist so einfach. Bitte gib mir deine Lösung.

Die Anlage sind mein Dokumente.



Grüße
DAFeinfach

easy_model(4).zip
 Beschreibung:

Download
 Dateiname:  easy_model(4).zip
 Dateigröße:  41.05 KB
 Heruntergeladen:  330 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
DAFeinfach
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 67
Anmeldedatum: 07.06.17
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 22.06.2017, 18:35     Titel:
  Antworten mit Zitat      
Hallo Harald,

kannst du mir mitteilen, ist das möglich, den Wert von der Variable "wert" in update_easy.m nach der Simulation zu löschen ?

Ich habe auch die Code wie
Code:
rmappdata(handles.axes1,'num');

unter der pushbutton_stop_Callback Funktion geschrieben. Leider geht es noch nicht.

Bitte hilf mir. Danke.



Grüße
Jieshen
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.495
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 23.06.2017, 14:08     Titel:
  Antworten mit Zitat      
Hallo,

eine Möglichkeit ist, in update_easy diese Zeilen zu packen
Code:
if nargin == 0
    wert = [];
    return
end

und aus den Pushbutton-Callbacks heraus den Aufruf so zu machen:
Code:
update_easy % 0 inputs will set |wert| to empty


Das ist zwar nicht schön, aber eine andere Möglichkeit fällt mir nicht ein.

Zudem besteht gerade wieder das Problem des verlorengegangenen Tags, daher Änderung in update_easy
Code:
fig_hdl = findobj(0,'Type','axes');

Das kann leider bei mehreren Koordinatensystemen wieder zu Problemen führen, allerdings fällt mir auf die Schnelle keine bessere Lösung ein.

Angehängt als .zip.

@ Jan: ich gebe dir recht, dass dieser Thread zu lange geworden ist. Leider stellt die verwendete Schnittstelle mich vor Herausforderungen, und es kommen auch immer weitere Zusatzfragen hinzu.

@ Jieshen: ich habe hier schon sehr viel Zeit investiert. Ich hoffe, dass dir eine Kombination aus all den Vorschlägen hilft, bestehende und weitere kommende Probleme zu lösen. Ansonsten müsstest du wirklich mal jemanden zu Rate ziehen, dessen Aufgabe das ist, z.B. einen studentischen Betreuer oder den Technischen Support von MathWorks. Vielleicht gibt es auch eine viel elegantere Lösung als meine Vorschläge.

Grüße,
Harald

easy_model_mod.zip
 Beschreibung:

Download
 Dateiname:  easy_model_mod.zip
 Dateigröße:  41.03 KB
 Heruntergeladen:  330 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen

Gehe zu Seite Zurück  1, 2, 3

Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

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
.





 Impressum  | Nutzungsbedingungen  | Datenschutz | FAQ | goMatlab RSS Button RSS

Hosted by:


Copyright © 2007 - 2024 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks

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.