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

 

DAFeinfach
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


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

dein Vorschlage habe ich schon verstanden. Mit der Befehl "plot_handle1 = plot(guiplot,XData1,YData1,XData2,XData2);" kann man zwei Line bekommen. Dann kann man mit "set(plot_handle1(1), 'XData', XData1, 'YData', YData1,'Color','red')" bzw. "set(plot_handle1(2), 'XData', XData1, 'YData', YData2,'Color','blue')" die zwei Graph in ein selben Axes bezeichnen. Aufgrund der Logik ist dieses Gedanke ganz richtig.

Aber wenn ich einmal durchlaufe, habe ich noch eine Fehlermeldung bekomme, wie

Warning: Error occurred while evaluating listener callback.
Error in ==>update_gui1 at Line 32.
if isempty(plot_handle1) || ~ishandle(plot_handle1)
The operands of the || and the && operator must be able to be converted to logical scalar values.

Hier ist meine Code
Code:
function varargout = update_gui(varargin)

persistent plot_handle1
%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');

% update the gui
set(display,'string',str);

% 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)

% real-time plot

if isempty(plot_handle1) || ~ishandle(plot_handle1)
    guiplot=findobj(0, 'Tag', 'axesplot1');
    plot_handle1 = plot(guiplot,XData1,YData1,XData2,YData2);
    grid on
else
    XData_old1 = get(plot_handle1(1), 'XData');
    YData_old1 = get(plot_handle1(1), 'YData');
    XData1 = [XData_old1, XData1];
    YData1 = [YData_old1, YData1];
     XData_old2 = get(plot_handle1(2), 'XData');
    YData_old2 = get(plot_handle1(2), 'YData');
    XData2 = [XData_old2, XData2];
    YData2 = [YData_old2, YData2];
    set(plot_handle1(1), 'XData', XData1, 'YData', YData1,'Color','red')
    set(plot_handle1(2), 'XData', XData2, 'YData', YData2,'Color','blue')
   % axis([0 20 0 10])
    drawnow
end
 


Meine Meinung ist, bedeutet das, mit der Code "plot_handle1 = plot(guiplot,XData1,YData1,XData2,YData2);" ist die Type von plot_handle1 schon verändert ?

Die Anlage ist die relative Dokumente.



Grüße
Jieshen

[EDITED, Jan, Bitte kein Top-Quoting der gesamten vorhergehenden Nachricht - Danke!]

Bsp4_neu(2).zip
 Beschreibung:

Download
 Dateiname:  Bsp4_neu(2).zip
 Dateigröße:  44.18 KB
 Heruntergeladen:  312 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: 11.06.2017, 20:30     Titel:
  Antworten mit Zitat      
Hallo Harald,

ist das ehrlich möglich, zwei Graph in ein Axes zu bezeichnen. Ich habe so viele Male versucht. Leider kann ich noch nicht erfolgreich erledigen. Kannst du meine letzte Nachricht einmal gucken. Hilf mir bitte. Danke dir. : )


Grüße
Jieshen

[EDITED, Jan, Bitte kein Top-Quoting der gesamten vorhergehenden Nachricht - Danke!]
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.448
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 11.06.2017, 20:39     Titel:
  Antworten mit Zitat      
Hallo,

bitte etwas Geduld. Ich bin auch nicht rund um die Uhr hier ;)

Ich kann nur immer wieder den Debugger empfehlen. Dann sieht man wirklich schnell, wo die Probleme liegen. Hier ist es eben das Array von Plots, also die Zeile mit der Fehlermeldung abändern zu
Code:
if isempty(plot_handle1) || any(~ishandle(plot_handle1))


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: 11.06.2017, 21:32     Titel:
  Antworten mit Zitat      
Hallo Harald,

vielen vielen Danke für deine Hilfe. Mit deiner Code kann man zwei Graph ehrlich gleichzeitig in ein Axes bezeichnen. Aber für das zweite Mal bekomme ich immer eine Fehlermeldung wie

Requires one of the braces or dot index expressions, but the result is two.
Error in Beispiel4_gui>Startstopbutton_Callback (line 158)
ph1.XData = []

Error in gui_mainfcn (line 95)
feval(varargin{:})

Error in Beispiel4_gui (line 42)
gui_mainfcn(gui_State, varargin{:})

Meine eigene Meinung ist, wir sollen die Variable "ph1.XData" etwa verändern, weil die Eigenschaft von "plot_handle1" schon verändert ist (plot_handle1 verändert zu zwei Line plot_handle1(1) bzw. plot_handle1(2) ). Aber ich weiß nicht wie kann man diese Befehl "ph1.XData = []" verändern ?

Die Anlage sind relative Dokumente.



Grüße und vielen vielen Danke bei dir
Jieshen

[EDITED, Jan, Bitte kein Top-Quoting der gesamten vorhergehenden Nachricht - Danke!]

Bsp4_neu(3).zip
 Beschreibung:

Download
 Dateiname:  Bsp4_neu(3).zip
 Dateigröße:  44.14 KB
 Heruntergeladen:  314 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.448
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 11.06.2017, 23:10     Titel:
  Antworten mit Zitat      
Hallo,

statt der Zeile:
Code:
       for k = 1:2
        ph(k).XData = [];
        ph(k).YData = [];
        end


Ich kann nur wiederholen: Debugger verwenden und sich ansehen, was da los ist. Dann solltest du die Probleme eigentlich auch selber beheben können.

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: 12.06.2017, 11:22     Titel:
  Antworten mit Zitat      
Hallo Harald,

vielen Danke für deine große Hilfe. Jetzt funktioniert es. Ich bin jetzt ein Anfänger bei Matlab. Deshalb weiß ich nicht die Funktion von etwa Befehle, z.B. wie
Code:
if isempty(plot_handle1) || ~ishandle(plot_handle1)

zu
Code:
if isempty(plot_handle1) || any(~ishandle(plot_handle1))

verändern.

Damals weißte ich auch, wegen der Veränderung der Type von plot_handle1(plot_handle1 verändert zu plot_handle1(1) bzw. plot_handle1(2)) bekam ich die Fehlermeldung wie
Warning: Error occurred while evaluating listener callback.
Error in ==>update_gui1 at Line 32.
if isempty(plot_handle1) || ~ishandle(plot_handle1)
The operands of the || and the && operator must be able to be converted to logical scalar values.

Leider weiß ich nicht, mit was für ein Befehl kann man die Error löschen ? Also, wie du gesgat, mit Debugger kann man nicht nur finden, wo die Fehler liegt, sondern auch einige Vorschläge für die Veränderung von Code bekommen ?

Aber natürlich werde ich nächste Mal selbst mit Debugger selbst für die Lösung suchen. Nur wenn ich noch etwa andere Probelme habe, wende ich an dich nochmal.

Vielen Danke.



Grüße
Jieshen

[EDITED, Jan, Bitte kein Top-Quoting der gesamten vorhergehenden Nachricht - Danke!]
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.448
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 12.06.2017, 11:38     Titel:
  Antworten mit Zitat      
Hallo,

Zitat:
Also, wie du gesgat, mit Debugger kann man nicht nur finden, wo die Fehler liegt, sondern auch einige Vorschläge für die Veränderung von Code bekommen ?

Ich meinte eher, dass man sich dann die Situation (Datentyp und Dimension von Variablen) genauer ansehen kann. Hier ist das Problem ja, dass man statt einem Plot nun mehrere in den Variablen abgespeichert hat und die Abfragen entsprechend anpassen musste.

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: 14.06.2017, 12:35     Titel:
  Antworten mit Zitat      
Ni hao Harald,

jetzt kann das Programm ganz genau durchlaufen. Nur habe ich noch eine Frage, die unabhängig von der Code ist. Wenn ich das Programm laufe, sind die Graph, die in GUI bezeichnet werden, nicht glatte Graph. (Siehe die Anlage "picture")
In meiner Meinung denke ich, das ist wegen des Abtastrates von Eingangsignal. Weil das Abtastrate nicht so hoch ist, scheint es in Axes bei GUI gebrochene Linie statt glatte Graph. Aber ich habe schon bei Eingangsignal "SineWave" die "Sample Time" als "0" eingestellt. Aufgrund der Logik glaube ich, die Graph sollen glatt sein. Leider bekomme ich die gebrochene Linie. Das verstehe ich noch nicht.
Oder soll man bei "update_gui1" die Type von Linie mit der Befehl "set" einstellen ? Aber es gibt keine Linietype wie "glatt" oder "gebrochen".
Die Anlage sind relative Dokumente.


Grüße
Jieshen

[EDITED, Jan, Bitte kein Top-Quoting der gesamten vorhergehenden Nachricht - Danke!]

picture.GIF
 Beschreibung:

Download
 Dateiname:  picture.GIF
 Dateigröße:  70.25 KB
 Heruntergeladen:  346 mal
Bsp4_neu(4).zip
 Beschreibung:

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

Forum-Meister


Beiträge: 24.448
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 15.06.2017, 10:46     Titel:
  Antworten mit Zitat      
Hallo,

das ist eine Einstellung im Simulink-Modell. Die Standardschrittweite bei Modellen ohne diskrete oder kontinuierliche Dynamik ist die Schrittweite auf t_stop/50 festgelegt, bei t_stop = inf anscheinend auf 0.2.

Du kannst unter Simulation --> Model Configuration Parameters eine andere maximale Schrittweite einstellen um eine feinere Auflösung zu bekommen.

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: 19.06.2017, 23:00     Titel:
  Antworten mit Zitat      
Hallo Harald,

Danke für deine sorgfältige Antwort. Jetzt kann man ein glatt Graph mit kleine Schrittweite bekommen.
Und ich habe eine neue Frage über die real-time Plot bei GUI. Bitte guck zuerste die Anlage. Die Fig. ist ganz einfach mit drei Start-Knöpfe "Start1", "Start2" bzw."Start Together". Und das Simulationsmodell hat nur zwei Output "Out1" bzw. "Out2". Meine Frage ist, ist es möglich, das Ergebnis von jeder Befehl nur in Axes1 beschrieben wird ? Das heißt, wenn ich "Start1" drücke, dann bekomme ich nur die Graph über "Out1". Und wenn ich "Start Together" drücke, dann bekomme ich gleichzeitig die Graphe über "Out1"bzw. "Out2".
Meine eigene Meinung ist, diese solche Anforderung ist wie ein Auswahl mit der Befehl "if-else". Das heißt, wenn ich den Knöpf "Start1" drücke, soll ich die spezielle Eigenschaften von Knöpf "Start1" behalten, um nur die Befehle mit Bezeichnung von "Out1" zu auszuführen.
Deshalb habe ich noch eine persistent Variable "num" in update_easy einstellen.

Code:
persistent plot_handle  num
 


Und mein Ziel ist, das Eigenschaft "String" von "Start1" zu Variable "num" gegeben wird. Dann kann man mit die Code

Code:

Code:

Code:
elseif strcmp(num,'Start Together')


unterschiedliche Befehle ausführen.

Aber wie kann man das Eigenschaft "String" von "Start1" zu Variable "num" geben ist das Problem.
Ich denke, man soll bei easy_model.m etwa Befehle wie "set" oder "set_param" unter die Button-Callback Funktion schreiben.
Aber ich weiß nicht,was für eine Befehl soll ich schreiben? Dann kann ich diese Anforderung verwirklichen. Natürlich weiß ich auch nicht, ob mein Gedanke richtig oder nicht ist.
Deshalb hoffe ich, dass du einmal gucken kannst und mir einige Hinweise und Vorschläge geben kannst. Vielen Danke.



Grüße
Jieshen

[EDITED, Jan, Bitte kein Top-Quoting der gesamten vorhergehenden Nachricht - Danke!]

easy_model.zip
 Beschreibung:

Download
 Dateiname:  easy_model.zip
 Dateigröße:  40.92 KB
 Heruntergeladen:  306 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: 20.06.2017, 21:02     Titel:
  Antworten mit Zitat      
Hallo Harald,


bitte guck einmal my Dokumente, wenn du Ziet hast. Und bitte gib mir einige Hinweise darüber, ob es möglich unterschiedliche Bedienungen mit dem zugehörigen Betätigen in ein selben Axes zu bezeichnen ist.

Vielen Danke.



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

Forum-Meister


Beiträge: 24.448
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 20.06.2017, 21:32     Titel:
  Antworten mit Zitat      
Hallo,

du könntest die Information in der GUI abspeichern, z.B.
Code:
setappdata(handles.figure1, 'num', 'Start1');


In der Update-Funktion müsstest du dir die Infos dann wieder holen:
Code:
fig_hdl = findobj(0, 'Tag', 'figure1');
num = getappdata(fig_hdl, 'num');


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, 13:08     Titel:
  Antworten mit Zitat      
Hallo Harald,

danke für deine Vorschlage. Das ist einfach mit der Befehl "setappdata" eine neue Variable bei handles.axes1 einstellen. Dannach wird der Wert von "num" zu Variable "num" in Update-Funktion mit der Befehl "getappdata" geführt. Aber ich weiß nicht wie kann man den Wert von "num" in Update-Funktion nach der Simulation löschen, um nächste Mal ein andere Simulation zu durchlaufen. (z.B. in erste Mal mit "Start1" und in zweite Mal mit "Start2")

ich habe gedacht, wahrscheinlich soll man nach der Verlauf den Wert von "num" in GUI.m File löschen. Deshalb habe ich ein Befehl unter Stop_callback_function geschrieben.

Code:
handles.axes1.num = [];


Leider wenn ich den Knöpf "Stop" drücke, bekomme ich die Folgende Fehler.

error in line 142
---->handles.axes1.num = []
Class matlab.graphics.axis.Axes does not exist public property num.

Ich weiß, das bedeutet, die Variable "num" ist nicht das eigentliche Eigentum von handles.axes1. Dann wie kann man den Wert löschen ? Eine andere Frage ist, wenn man den Wert von "num" in GUI.m File gelöscht hat, bedeutet das, der Wert von "num" in Update-Funktion auch gelöscht wird ?

Die Anlage sind relative Dokumente.



Grüße
Jieshen

easy_model(2).zip
 Beschreibung:

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

Forum-Meister


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

fürs Löschen gibt es rmappdata .

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, 15:32     Titel:
  Antworten mit Zitat      
Hallo Harald,

für das Löschen von Wert der Variable "num" in easy_model.m kann man die Befehl "rmappdata" benutzen.

wie
Code:
rmappdata(handles.axes1,'num');


Aber das kann den Wert von "num" in update_easy.m nicht gleichzeitig löschen. wie deine vorherige Vorschläge
Code:
fig_hdl = findobj(0, 'Tag', 'figure1');
num = getappdata(fig_hdl, 'num');


habe ich in update_easy.m die folgende Code geschrieben.
Code:
if isempty(num)
fig_hdl = findobj(0,'Tag','axes1');
num = getappdata(fig_hdl,'num');
end


Ich weiß nicht wie kann man den Wert von "num" nach der Simulation löschen. Du weißt, wenn den Wert schon gelöscht geworden ist, kann man in nächster Simulation die obgenannten Code nochmal laufen.

Die Anlagen sind die relative Dokumente.




Grüße
Jieshen

easy_model(3).zip
 Beschreibung:

Download
 Dateiname:  easy_model(3).zip
 Dateigröße:  41.05 KB
 Heruntergeladen:  312 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen

Gehe zu Seite Zurück  1, 2, 3  Weiter

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.