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

Realtime Plot in GUI

 

Phil1988

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 28.01.2013, 16:42     Titel: Realtime Plot in GUI
  Antworten mit Zitat      
Hallo,

Ich versuche eine GUI zu erstellen, indem Daten von einem Simulink-Modell in Echtzeit geplottet werden. Mit Hilfe des Eventlisteners und einem M-File "updategui.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.

Nun versuche ich diese beiden Werte in einem GUI axes in Echtzeit zu plotten. Mit den folgenden Befehlen läuft es leider noch nicht:

guiplot=findobj('Tag','axesplot');
plot(XData,YData,guiplot);

Hoffentlich kann mir jemand bei dem Problem lösen, da ich schon sehr viel im Netz recherchiert habe, aber leider keine Lösung gefunden hab, welche ich auf mein Programm anwenden kann.

Das ist meine "updategui.m" function:

Code:
%
function varargout = updategui(varargin)

%create a run time object that can return the value of the gain block's
%output and then put the value in a string

rto1 = get_param('Beispiel4_sim/SinusOut','RuntimeObject');

% create str from rto1
str = num2str(rto1.InputPort(1).Data);

% get a handle to the GUI's 'current state' window
display = findobj('Tag','edit_display');

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

% Save Data to workspace
XData = get_param('Beispiel4_sim','SimulationTime');
YData = rto1.InputPort(1).Data;

assignin('base','XData',XData)
assignin('base','YData',YData)


guiplot=findobj('Tag','axesplot');
plot(XData,YData,guiplot);
 


Beispiel4_gui.fig
 Beschreibung:

Download
 Dateiname:  Beispiel4_gui.fig
 Dateigröße:  5.12 KB
 Heruntergeladen:  789 mal
Beispiel4_gui.m
 Beschreibung:

Download
 Dateiname:  Beispiel4_gui.m
 Dateigröße:  6.89 KB
 Heruntergeladen:  767 mal
Beispiel4_sim.mdl
 Beschreibung:

Download
 Dateiname:  Beispiel4_sim.mdl
 Dateigröße:  24.17 KB
 Heruntergeladen:  817 mal
updategui.m
 Beschreibung:

Download
 Dateiname:  updategui.m
 Dateigröße:  661 Bytes
 Heruntergeladen:  795 mal


Harald
Forum-Meister

Forum-Meister


Beiträge: 24.432
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 28.01.2013, 19:57     Titel:
  Antworten mit Zitat      
Hallo,

und wo liegt nun das Problem?
Wird zu schnell, zu langsam, falsch oder gar nicht geplottet?

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

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 29.01.2013, 12:02     Titel:
  Antworten mit Zitat      
Hallo Harald,

es wird nichts geplottet und ich bekomme folgende Fehlermeldung:

Warning: Error occurred while evaluating listener callback.
??? Error using ==> plot
Data must be a single matrix Y or a list of pairs X,Y

Error in ==> updategui at 28
plot(XData,YData,guiplot);
 
Harald
Forum-Meister

Forum-Meister


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

dann setze mal einen Haltepunkt in die Zeile und schau dir an, was der Inhalt der Variablen ist.

Meines Erachtens wäre folgendes intuitiver:
Code:
plot(guiplot,XData, YData)


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

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 29.01.2013, 17:06     Titel:
  Antworten mit Zitat      
In den Variablen befindet sich lediglich der aktuellste Wert der Simulation.

Wenn ich "plot(guiplot,XData,YData);" verwende, dann bekomm ich folgende Fehlermeldung.

Warning: Error occurred while evaluating listener callback.
??? Error using ==> plot
Vectors must be the same lengths.

Error in ==> updategui at 28
plot(guiplot,XData,YData);


Schon mal Danke für deine Hilfe.

mfg Philipp
 
Harald
Forum-Meister

Forum-Meister


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

ich habe es mal probiert. Beim ersten Mal wird ein Punkt gezeichnet, beim zweiten Mal wird aus mir auf Anhieb nicht ersichtlichen Gründen das Koordinatensystem nicht gefunden.
Für den Moment zumindest hilft es, guiplot als persistent zu definieren.
Code:

function varargout = updategui(varargin)

%create a run time object that can return the value of the gain block's
%output and then put the value in a string
persistent guiplot
rto1 = get_param('Beispiel4_sim/SinusOut','RuntimeObject');

% create str from rto1
str = num2str(rto1.InputPort(1).Data);

% get a handle to the GUI's 'current state' window
display = findobj('Tag','edit_display');

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



% Save Data to workspace
XData = get_param('Beispiel4_sim','SimulationTime');
YData = rto1.InputPort(1).Data;

assignin('base','XData',XData)
assignin('base','YData',YData)

if isempty(guiplot)
    guiplot=findobj(0, 'Tag','axesplot');
end
plot(guiplot,XData,YData);


Nun sollte noch die Skalierung des Koordinatensystems mit AXIS festgehalten werden, sonst gibts Augenschmerzen.

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

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 30.01.2013, 13:16     Titel:
  Antworten mit Zitat      
Hi Harald,
ich habe deinen Quelltext eingefügt, bekomme aber immer noch dieselbe Fehlermeldung:

Warning: Error occurred while evaluating listener callback.
??? Error using ==> plot
Vectors must be the same lengths.

Error in ==> updategui at 29
plot(guiplot,XData,YData);

Hier die function
Code:
%function varargout = updategui(varargin)

%create a run time object that can return the value of the outport block's
%input and then put the value in a string
persistent guiplot
rto1 = get_param('Beispiel4_sim/SinusOut','RuntimeObject');

% create str from rto1
str = num2str(rto1.InputPort(1).Data);

% get a handle to the GUI's 'current state' window
display = findobj('Tag','edit_display');

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


% Save Data to workspace
XData = get_param('Beispiel4_sim','SimulationTime');
YData = rto1.InputPort(1).Data;

assignin('base','XData',XData)
assignin('base','YData',YData)

if isempty(guiplot)
    guiplot=findobj(0, 'Tag','axesplot');
end
plot(guiplot,XData,YData);
 
 
Harald
Forum-Meister

Forum-Meister


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

ich hatte es mit der aktuellen MATLAB-Version getestet, und es lief durch. Welche MATLAB-Version verwendest du?

Bitte überprüfe selbst mit dem Debugger, was die Größe von XData und YData ist und ob sie die gewünschten Werte beinhalten. Bei mindestens einem von beiden wird das wohl nicht der Fall sein.

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

Forum-Newbie


Beiträge: 5
Anmeldedatum: 30.01.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 30.01.2013, 13:55     Titel:
  Antworten mit Zitat      
Hallo Harald,

Dank deiner Hilfe funktioniert nun alles bei mir. Dein Quelltext stimmt auch so wie er ist. Vielen Dank

Ich versuche jetzt noch die Anpassung für den Graphen zu machen. Ich versuche es erstmal alleine, ansonsten melde ich mich nochmal bei dir.
_________________

mfg Phil
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


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

eine kleine Korrektur:
Code:
if isempty(guiplot) || ~ishandle(guiplot)
    guiplot=findobj(0, 'Tag','axesplot');
end


Damit wird abgeprüft, ob guiplot ein gültiges Handle ist. Falls es guiplot noch nicht gibt oder es, weil die GUI geschlossen wurde, nicht mehr gültig ist, wird es neu erzeugt.

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

Forum-Newbie


Beiträge: 7
Anmeldedatum: 18.06.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 23.02.2013, 16:34     Titel:
  Antworten mit Zitat      
Hallo Phil,
ich bin auch derzeit dabei eine Echzeitausgabe zu realisieren, mithilfe des Eventlisteners. Ich hab mir dein Programm angeschaut und würde gerne wissen an welcher Stelle du dein Eventlistener im Simulink-Model erstellst.

Gruß,
Martin
Private Nachricht senden Benutzer-Profile anzeigen
 
Phil1988
Forum-Newbie

Forum-Newbie


Beiträge: 5
Anmeldedatum: 30.01.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 27.02.2013, 04:16     Titel:
  Antworten mit Zitat      
Hallo Martin,

Der eventlistener wird im Simulinkmodell unter Callbacks erstellt.
Hoffe da findest du den Eintrag. Wenn nicht dann schicke ich dir Bilder. Sag einfach Bescheid.
_________________

mfg Phil
Private Nachricht senden Benutzer-Profile anzeigen
 
David1988

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 08.02.2014, 13:59     Titel:
  Antworten mit Zitat      
Hey,

sorry wenn ich das Thema nochmal aufgreife, aber ich hab da noch ein kleines Problem Confused

Mein Ziel ist genau das gleiche wie das von Phil, allerdings hänge ich noch an der Stelle hier:

Phil1988 hat Folgendes geschrieben:

Warning: Error occurred while evaluating listener callback.
??? Error using ==> plot
Vectors must be the same lengths.

Error in ==> updategui at 29
plot(guiplot,XData,YData);


Mein Code sieht zur Zeit folgendermaßen aus:

Code:
%function varargout = updategui(varargin)

%create a run time object that can return the value of the gain block's
%output and then put the value in a string

persistent guiplot

Scope = get_param('Dreitanksystem/Scope','RuntimeObject');

% create str from rto1
h1 = num2str(Scope.InputPort(3).Data);

% get a handle to the GUI's 'current state' window
display = findobj('Tag','edit_display');

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

% Save Data to workspace
XData = get_param('Dreitanksystem','SimulationTime');
YData = Scope.InputPort(3).Data;

assignin('base','XData',XData)
assignin('base','YData',YData)

if isempty(guiplot) || ~ishandle(guiplot)
    guiplot=findobj(0, 'Tag','h1');
end

plot(guiplot,XData,YData);
 


Phil hatte leider nicht mehr erklärt, wie er dieses Problem lösen konnte und ich bin auch nicht der Erfahrenste was Matlab angeht... Vielleicht weiß ja noch jemand, wie das Problem zu beheben ist?! Laut Workspace haben XData sowie YData jeweils nur den aktuellen Wert gespeichert. So soll es ja auch sein...

Ich bin für jede Hilfe dankbar Smile

Gruß

David
 
Sp0b1e
Forum-Anfänger

Forum-Anfänger



Beiträge: 26
Anmeldedatum: 26.09.13
Wohnort: ---
Version: 2011a und 2013a
     Beitrag Verfasst am: 08.02.2014, 16:46     Titel:
  Antworten mit Zitat      
Der Set-Befehl wäre hier denke ich mal wesentlich angebrachter als den Plott über plot(....) immer wieder neu zu machen!
Private Nachricht senden Benutzer-Profile anzeigen
 
Phil1988
Forum-Newbie

Forum-Newbie


Beiträge: 5
Anmeldedatum: 30.01.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 08.02.2014, 18:25     Titel:
  Antworten mit Zitat      
Hallo,

ich konnte dass problem mit Haralds Vorschlag lösen. Ich musste nach der Änderung MatLab lediglich neu starten damit Werte aus dem cache gelöscht werden. Mit dem aktualisierten quelltext hat dann alles funktioniert.

Falls du trotzdem noch Hilfe brauchst kann ich dir bei Gelegenheit nochmal dass komplette Programm schicken. Aber wie gesagt, dürfte letztendlich nichts anders sein.

Gruß Phil
_________________

mfg Phil
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen

Gehe zu Seite 1, 2  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.