Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   
Bücher:

Studierende:
Praktikant Toolentwicklung Matlab (m/w)
Branche: Beratung, Expertise, Fahrzeugtechnik, Fahrzeugteile, Technische Dienstleistungen
MBtech Group GmbH & Co. KGaA - Fellbach

Abschlussarbeit / Praktikum: Entwicklung Matlab (m/w)
Branche: Informationstechnologie, Elektrotechnik, Elektronik
GIGATRONIK Technologies GmbH - Ulm

Studentische Mitarbeit - Fahrzeugmessungen
Branche: mehrere
IAV GmbH - Ingenieurgesellschaft Auto und Verkehr - Berlin

Werkstudent (m/w) High End GNSS Simulation mit modernsten Signalgeneratoren
Branche: Mess-, Regel-, Automatisierungstechnik, Telekommunikation, Nachrichtentechnik
ROHDE & SCHWARZ GmbH & Co. KG - München

Praktikant Testsystemaufbau (m/w)
Branche: Beratung, Expertise, Fahrzeugtechnik, Fahrzeugteile, Technische Dienstleistungen
MBtech Group GmbH & Co. KGaA - Sindelfingen

weitere Angebote

Partner:


Vermarktungspartner


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
Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 66
Anmeldedatum: 07.06.17
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 09.06.2017, 09:21     Titel: Das Problem von real time Plot bei GUI
  Antworten mit Zitat      
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.


Grüße
Jieshen

update_gui1.m
 Beschreibung:

Download
 Dateiname:  update_gui1.m
 Dateigröße:  682 Bytes
 Heruntergeladen:  27 mal
update_gui.m
 Beschreibung:

Download
 Dateiname:  update_gui.m
 Dateigröße:  1.1 KB
 Heruntergeladen:  26 mal
Beispiel4_sim.slx
 Beschreibung:

Download
 Dateiname:  Beispiel4_sim.slx
 Dateigröße:  18.76 KB
 Heruntergeladen:  24 mal
Beispiel4_gui.m
 Beschreibung:

Download
 Dateiname:  Beispiel4_gui.m
 Dateigröße:  7.16 KB
 Heruntergeladen:  31 mal
Beispiel4_gui.fig
 Beschreibung:

Download
 Dateiname:  Beispiel4_gui.fig
 Dateigröße:  34.58 KB
 Heruntergeladen:  26 mal
Private Nachricht senden Benutzer-Profile anzeigen


DAFeinfach
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 66
Anmeldedatum: 07.06.17
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 09.06.2017, 16:50     Titel:
  Antworten mit Zitat      
Kann jemand mir helfen ?

[EDITED, Jan, Bitte kein Bumping, und falls unbedingt nötig erst nach 24 Stunden - Danke!]
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 17.513
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2014a
     Beitrag Verfasst am: 09.06.2017, 19:11     Titel:
  Antworten mit Zitat      
Hallo,

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

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

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 66
Anmeldedatum: 07.06.17
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 09.06.2017, 19:25     Titel:
  Antworten mit Zitat      
Hallo Harald,

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!]
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 17.513
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2014a
     Beitrag Verfasst am: 09.06.2017, 20:38     Titel:
  Antworten mit Zitat      
Hallo,

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.

Grüße,
Harald

Bsp4.zip
 Beschreibung:

Download
 Dateiname:  Bsp4.zip
 Dateigröße:  41.91 KB
 Heruntergeladen:  24 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
DAFeinfach
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 66
Anmeldedatum: 07.06.17
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 09.06.2017, 21:29     Titel:
  Antworten mit Zitat      
Hallo Harald,

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.

Code:
function varargout = update_gui(varargin)

persistent plot_handle

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');

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

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


% save Data to workspace
assignin('base','XData',XData)
assignin('base','YData',YData)

% real-time plot

if isempty(plot_handle)||~ishandle(plot_handle)
    guiplot=findobj(0, 'Tag','axesplot1');
    plot_handle = plot(guiplot, XData, YData);
else
    XData_old = get(plot_handle, 'XData');
    YData_old = get(plot_handle, 'YData');
    XData = [XData_old, XData];
    YData = [YData_old, YData];
    set(plot_handle, 'XData', XData)
    set(plot_handle, 'YData', YData)
    %axis([0 20 0 10])
    drawnow
end


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.


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

Forum-Meister


Beiträge: 17.513
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2014a
     Beitrag Verfasst am: 09.06.2017, 21:47     Titel:
  Antworten mit Zitat      
Hallo,

Zitat:
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.

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

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 66
Anmeldedatum: 07.06.17
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 09.06.2017, 22:09     Titel:
  Antworten mit Zitat      
Hallo Harald,

danke für deine Antwort.
Zitat:
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!]
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 17.513
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2014a
     Beitrag Verfasst am: 10.06.2017, 06:54     Titel:
  Antworten mit Zitat      
Hallo,

die Eigenschaften kannst du sehen, wenn du das Element in GUIDE doppelklickst.

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

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 66
Anmeldedatum: 07.06.17
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 10.06.2017, 09:30     Titel:
  Antworten mit Zitat      
Hallo Harald,

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.

Code:
function varargout = update_gui(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
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');

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

% get Data from Simulation
XData = get_param('Beispiel4_sim','SimulationTime');
YData = rto1.InputPort(1).Data;


% save Data to workspace
assignin('base','XData',XData)
assignin('base','YData',YData)


% real-time plot

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




Grüße
Jieshen

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

Bsp4_neu.zip
 Beschreibung:

Download
 Dateiname:  Bsp4_neu.zip
 Dateigröße:  41.87 KB
 Heruntergeladen:  21 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 17.513
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2014a
     Beitrag Verfasst am: 10.06.2017, 09:41     Titel:
  Antworten mit Zitat      
Ni hao,

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.

Grüße,
Harald

Bsp4_2.zip
 Beschreibung:

Download
 Dateiname:  Bsp4_2.zip
 Dateigröße:  41.96 KB
 Heruntergeladen:  28 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
DAFeinfach
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 66
Anmeldedatum: 07.06.17
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 10.06.2017, 17:10     Titel:
  Antworten mit Zitat      
Ni hao Harald,

vielen Danke für deine Dokument. Jetzt kann man mehrere Parameter in verschiedene Koordinatensysteme ansteueren. Und ich denke, die Funktion der Code

Code:
ph1 = handles.axesplot1.Children;
    if ishandle(ph1)
        ph1.XData = [];
        ph1.YData = [];
    end


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!]

Bsp4_neu.zip
 Beschreibung:

Download
 Dateiname:  Bsp4_neu.zip
 Dateigröße:  55.97 KB
 Heruntergeladen:  22 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 17.513
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2014a
     Beitrag Verfasst am: 10.06.2017, 19:01     Titel:
  Antworten mit Zitat      
Ni hao,

mit
Code:
plot_handle1 = plot(guiplot, XData1, YData1, XData2, YData2);

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.

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

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 66
Anmeldedatum: 07.06.17
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 10.06.2017, 21:53     Titel:
  Antworten mit Zitat      
Ni hao Harald,

mit deinem Vorschlag
Code:
plot_handle1 = plot(guiplot, XData1, YData1, XData2, YData2);

kann ich noch nicht zwei Graph gleichzeitig in ein Axes bezeichnen.

Deshalb habe ich die neu Code wie Folgende geschrieben.
Code:
function varargout = update_gui(varargin)

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');

% 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);
    grid on
else
    XData_old1 = get(plot_handle1, 'XData');
    YData_old1 = get(plot_handle1, 'YData');
    XData1 = [XData_old1, XData1];
    YData1 = [YData_old1, YData1];
    set(plot_handle1, 'XData', XData1,'YData', YData1,'Color','red')
   % axis([0 20 0 10])
    drawnow
end

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


Leider hat noch keine Funktion. Kannst du mir erklären, was bedeutet
Zitat:
Nutze plot_handle1(k), um einen der beiden Plots später anzupassen.

Das verstehe ich noch nicht, was meinst du über plot_handle1(k) ?
Die Anlage sind die relative Dokument.


Grüße
Jieshen

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

Bsp4_neu(1).zip
 Beschreibung:

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

Forum-Meister


Beiträge: 17.513
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2014a
     Beitrag Verfasst am: 11.06.2017, 09:07     Titel:
  Antworten mit Zitat      
Hallo,

Zitat:
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.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen

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


goMatlab ist ein Teil des goForen-Labels
goForen.de goMATLAB.de goLaTeX.de goPCB.de


 Impressum  | Nutzungsbedingungen  | Datenschutz  | Werbung/Mediadaten | Studentenversion | FAQ | goMatlab RSS Button RSS


Copyright © 2007 - 2017 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks
Partner: LabVIEWforum.de

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.