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

Live Plot - Balken füllen + Text / Bild ergänzen

 

MaxMachtMatlab

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 19.01.2021, 12:12     Titel: Live Plot - Balken füllen + Text / Bild ergänzen
  Antworten mit Zitat      
Hi Smile ,

ich möchte während der Laufzeit eines Simulink Modells für den Nutzer eine grafische Ausgabe erzeugen.

Eine Form (siehe Bild anbei) soll kontinuierlich gefüllt werden, und zwar in Abhängigkeit eines Wertes (nicht zeitlich abhängig).
Außerdem soll z.B. bei x% Füllung ein zusätzlicher Text bzw. ein zusätzliches Bild ergänzend angezeigt werden.

Bisher habe ich immer Plots zur Auswertung verwendet, jedoch noch nie live während der Laufzeit. Wie geht man hier vor? Könntet ihr ein Beispiel posten?

Danke und herzliche Grüße
Max

Beispiel.png
 Beschreibung:

Download
 Dateiname:  Beispiel.png
 Dateigröße:  8.09 KB
 Heruntergeladen:  226 mal


MaxMachtMatlab

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 20.01.2021, 22:12     Titel:
  Antworten mit Zitat      
Hat niemand eine Idee, um einen Plot nach und nach zu füllen bzw. schrittweise erscheinen zu lassen?

Von der Grundidee würde sich ja eine Schleife anbieten, in welcher verschiedene Grafiken / Balken nach und nach angezeigt werden, oder?

Code:

% Schleife über den 1. Parameter (z.B. Zeit)
for i=1:10
    % Verschiedene Plots nacheinander anzeigen / überblenden?
    % Details siehe 1. Beitrag
    % - hier der Code -
end


Danke vorab! Smile
 
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.01.2021, 10:05     Titel:
  Antworten mit Zitat      
Hallo,

Vorschlag:
Code:
h = [0:0.05:1, fliplr(0:0.05:1)];
      % P1  P2     P3   P4  P1
xvec = [0, h(1), 2-h(1), 2, 0];
yvec = [0, h(1),   h(1), 0, 0];
plot([0 1 2 0], [0, 1, 0, 0], 'k', 'LineWidth', 3);
hold on
tri = fill(xvec, yvec, 'k');
rect = fill([1.5 1.5 2 2 1.5], [1.5 2 2 1.5 1.5], 'b');
hold off
rect.Visible = 'off';
axis([-0.5 2.5 0 2.5]);
for k = 1:numel(h)
    tri.XData = [0, h(k), 2-h(k), 2, 0];
    tri.YData = [0, h(k),   h(k), 0, 0];
    if h(k) > 0.7
        rect.Visible = 'on';
    else
        rect.Visible = 'off';
    end
    pause(0.2)
end


Die Daten für h müssen bei dir dann aus Simulink kommen. Zur Verknüpfung mit Simulink würde ich mal googeln.

Grüße,
Harald
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
MaxMachtMatlab

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 24.01.2021, 00:42     Titel:
  Antworten mit Zitat      
Harald hat Folgendes geschrieben:

Die Daten für h müssen bei dir dann aus Simulink kommen. Zur Verknüpfung mit Simulink würde ich mal googeln.

Grüße,
Harald


Danke für deine Antwort Harald!

In MATLAB läuft alles top. Zur Verknüpfung mit Simulink habe ich eine MATLAB Function verwendet.
Dabei wurde zusätzlich in der ersten Zeile
Zitat:
coder.extrinsic('fill');

verwendet.

Leider gibt es dennoch einige Fehlermeldungen, welche ich bisher nicht beheben konnte. Auch googeln brachte keine passende Lösung.
Code:

Attempt to extract field 'Visible' from 'mxArray'. Function 'MATLAB Function1' (#801.322.326), line 12, column 1: "rect" Launch diagnostic report.
Component:MATLAB Function | Category:Coder error
Attempt to extract field 'XData' from 'mxArray'. Function 'MATLAB Function1' (#801.391.394), line 15, column 5: "tri" Launch diagnostic report.
Component:MATLAB Function | Category:Coder error
Attempt to extract field 'YData' from 'mxArray'. Function 'MATLAB Function1' (#801.432.435), line 16, column 5: "tri" Launch diagnostic report.
Component:MATLAB Function | Category:Coder error
Attempt to extract field 'Visible' from 'mxArray'. Function 'MATLAB Function1' (#801.495.499), line 18, column 9: "rect" Launch diagnostic report.
Component:MATLAB Function | Category:Coder error
Attempt to extract field 'Visible' from 'mxArray'. Function 'MATLAB Function1' (#801.533.537), line 20, column 9: "rect" Launch diagnostic report.
Component:MATLAB Function | Category:Coder error
Errors occurred during parsing of MATLAB function 'untitled1/MATLAB Function1'
Component:MATLAB Function | Category:Coder error
Errors occurred during parsing of MATLAB function 'untitled1/MATLAB Function1'


Hast du dazu Tipps oder weißt, was es mit 'mxArray'auf sich hat?
 
Harald
Forum-Meister

Forum-Meister


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

durch Googeln der Fehlermeldung bin ich auf dies gestoßen:
https://de.mathworks.com/matlabcent.....-field-value-from-mxarray

Kurz gesagt ist die Empfehlung dort, nicht nur "fill" etc. als extrinsisch zu deklarieren, sondern aus dem Code eine separate Funktion zu machen und die gesamte Funktion als extrinsisch zu deklarieren.

Um die Handles tri und rect von einem Aufruf zum anderen abzuspeichern, dürfte persistent nützlich sein.

Grüße,
Harald
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
MaxMachtMatlab

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 24.01.2021, 21:57     Titel:
  Antworten mit Zitat      
Harald hat Folgendes geschrieben:
Hallo,

durch Googeln der Fehlermeldung bin ich auf dies gestoßen:
https://de.mathworks.com/matlabcent.....-field-value-from-mxarray

Kurz gesagt ist die Empfehlung dort, nicht nur "fill" etc. als extrinsisch zu deklarieren, sondern aus dem Code eine separate Funktion zu machen und die gesamte Funktion als extrinsisch zu deklarieren.


Danke Harald. Auf diesen Link bin ich auch gestoßen, konnte es jedoch leider nicht umsetzen. Ich habe versucht, alles nach
Code:
h = [0:0.05:1, fliplr(0:0.05:1)];
in eine Funktion in der Funktion zu packen, quasi:
Code:

[] = fcn()
xvec = [0, h(1), 2-h(1), 2, 0];
yvec = [0, h(1),   h(1), 0, 0];
plot([0 1 2 0], [0, 1, 0, 0], 'k', 'LineWidth', 3);
hold on
tri = fill(xvec, yvec, 'k');
rect = fill([1.5 1.5 2 2 1.5], [1.5 2 2 1.5 1.5], 'b');
hold off
rect.Visible = 'off';
axis([-0.5 2.5 0 2.5]);
for k = 1:numel(h)
    tri.XData = [0, h(k), 2-h(k), 2, 0];
    tri.YData = [0, h(k),   h(k), 0, 0];
    if h(k) > 0.7
        rect.Visible = 'on';
    else
        rect.Visible = 'off';
    end
    pause(0.2)
end

end


Wo ist der Fehler im Ansatz?

Harald hat Folgendes geschrieben:
Um die Handles tri und rect von einem Aufruf zum anderen abzuspeichern, dürfte persistent nützlich sein.

Grüße,
Harald


Das würde ich so umsetzen:
Code:

jedoch habe ich wohl oben schon einen falsche Umsetzung?
 
Harald
Forum-Meister

Forum-Meister


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

Zitat:
Wo ist der Fehler im Ansatz?

Woher weißt du denn, dass es einen Fehler gibt?
Wenn du Fehlermeldungen oder ein unerwartetes Verhalten bekommst, dann poste das bitte; am besten auch ein reproduzierbares Beispiel.

Was mir auffällt: Die Funktion muss auf jeden Fall das aktuelle h annehmen. Das Schlüsselwort function fehlt.

Zudem musst du den Code mit einer if-Abfrage in die Initialisierung (tri und rect werden erstellt) und die Aktualisierung aufteilen, siehe auch die Doku von persistent.

Grüße,
Harald
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
MaxMachtMatlab

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 01.02.2021, 14:57     Titel:
  Antworten mit Zitat      
Harald hat Folgendes geschrieben:
Hallo,

Zitat:
Wo ist der Fehler im Ansatz?

Woher weißt du denn, dass es einen Fehler gibt?
Wenn du Fehlermeldungen oder ein unerwartetes Verhalten bekommst, dann poste das bitte; am besten auch ein reproduzierbares Beispiel.

Danke Harald, ich werde nachfolgend konkret mit Fehlern und Beispiel:

Variante 1:
Code:
function fcn()
h = [0:0.05:1, fliplr(0:0.05:1)];
coder.extrinsic('fcn1');
function fcn1(h)
persistent tri rect
      % P1  P2     P3   P4  P1
xvec = [0, h(1), 2-h(1), 2, 0];
yvec = [0, h(1),   h(1), 0, 0];
plot([0 1 2 0], [0, 1, 0, 0], 'k', 'LineWidth', 3);
hold on
tri = fill(xvec, yvec, 'k');
rect = fill([1.5 1.5 2 2 1.5], [1.5 2 2 1.5 1.5], 'b');
hold off
rect.Visible = 'off';
axis([-0.5 2.5 0 2.5]);
for k = 1:numel(h)
    tri.XData = [0, h(k), 2-h(k), 2, 0];
    tri.YData = [0, h(k),   h(k), 0, 0];
    if h(k) > 0.7
        rect.Visible = 'on';
    else
        rect.Visible = 'off';
    end
    pause(0.2)
end
end
end
 


Eingefügt in eine MATLAB Function in Simulink läuft die Simulation ohne Fehlermeldungen, allerdings wird nichts geplottet. Daher kann ich keine genauere Fehlerbeschreibung geben, es ist zum Test jedoch einfach Copy & Paste für dich.

Variante 2:

Code:
function fcn1()
coder.extrinsic('fill');
persistent tri rect
h = [0:0.05:1, fliplr(0:0.05:1)];
xvec = [0, h(1), 2-h(1), 2, 0];
yvec = [0, h(1),   h(1), 0, 0];
plot([0 1 2 0], [0, 1, 0, 0], 'k', 'LineWidth', 3);
hold on
tri = fill(xvec, yvec, 'k');
rect = fill([1.5 1.5 2 2 1.5], [1.5 2 2 1.5 1.5], 'b');
hold off
rect.Visible = 'off';
axis([-0.5 2.5 0 2.5]);
for k = 1:numel(h)
    tri.XData = [0, h(k), 2-h(k), 2, 0];
    tri.YData = [0, h(k),   h(k), 0, 0];
    if h(k) > 0.7
        rect.Visible = 'on';
    else
        rect.Visible = 'off';
    end
    pause(0.2)
end
 


Liefert die folgende Fehlermeldung:

Code:
Attempt to extract field 'Visible' from 'mxArray'. Function 'MATLAB Function' (#556.315.319), line 14, column 1: "rect" Launch diagnostic report.
Component:MATLAB Function | Category:Coder error
Attempt to extract field 'XData' from 'mxArray'. Function 'MATLAB Function' (#556.384.387), line 17, column 5: "tri" Launch diagnostic report.
Component:MATLAB Function | Category:Coder error
Attempt to extract field 'YData' from 'mxArray'. Function 'MATLAB Function' (#556.425.428), line 18, column 5: "tri" Launch diagnostic report.
Component:MATLAB Function | Category:Coder error
Attempt to extract field 'Visible' from 'mxArray'. Function 'MATLAB Function' (#556.488.492), line 20, column 9: "rect" Launch diagnostic report.
Component:MATLAB Function | Category:Coder error
Attempt to extract field 'Visible' from 'mxArray'. Function 'MATLAB Function' (#556.526.530), line 22, column 9: "rect" Launch diagnostic report.
Component:MATLAB Function | Category:Coder error
Errors occurred during parsing of MATLAB function 'untitled/MATLAB Function'
Component:MATLAB Function | Category:Coder error
Errors occurred during parsing of MATLAB function 'untitled/MATLAB Function'
Component:Simulink | Category:Model error
 


Dies war der ursprüngliche Versuch, welcher dann mit Variante 1 verbessert / behoben werden sollte.



quote="Harald"]Was mir auffällt: Die Funktion muss auf jeden Fall das aktuelle h annehmen. Das Schlüsselwort function fehlt.

Zudem musst du den Code mit einer if-Abfrage in die Initialisierung (tri und rect werden erstellt) und die Aktualisierung aufteilen, siehe auch die Doku von persistent.

Grüße,
Harald[/quote]
function als Schlüsselwort ist ergänzt. Das mit der if-Abfrage und Ínitialisierung wird mir trotz Doku nicht ganz klar. Meinen Versuch findest du oben in Variante 1.


Wäre echt super, wenn du mir mit einer "funktionierenden" Version helfen könntest. Dabei bitte nicht einfach die Lösung posten, sondern gerne erklären.

Liebe Grüße Smile
 
Harald
Forum-Meister

Forum-Meister


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

Variante 1 war auf dem richtigen Weg. Allerdings wird dort ja durch oranges Unterringeln signalisiert, dass fcn1 gar nicht verwendet wird. Zudem sollte die MATLAB-Function h als Input haben.
Wenn man das behebt und fcn1 in eine separate Funktion packt, funktioniert das wunderbar.

Grüße,
Harald

plotEx.slx
 Beschreibung:

Download
 Dateiname:  plotEx.slx
 Dateigröße:  25.83 KB
 Heruntergeladen:  208 mal
fcn1.m
 Beschreibung:

Download
 Dateiname:  fcn1.m
 Dateigröße:  573 Bytes
 Heruntergeladen:  207 mal

_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
MaxMachtMatlab

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 01.02.2021, 22:10     Titel:
  Antworten mit Zitat      
Harald hat Folgendes geschrieben:
Hallo,

Variante 1 war auf dem richtigen Weg. Allerdings wird dort ja durch oranges Unterringeln signalisiert, dass fcn1 gar nicht verwendet wird. Zudem sollte die MATLAB-Function h als Input haben.
Wenn man das behebt und fcn1 in eine separate Funktion packt, funktioniert das wunderbar.

Grüße,
Harald

Danke für die schnelle Antwort! Bin froh, dass ich zumindest nah dran war Smile

Könntest du die .slx für R2016a zur Verfügung stellen? Das neue Dateiformat kann ich leider nicht öffnen.
 
Harald
Forum-Meister

Forum-Meister


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

siehe Anhang.
Bitte immer mit angeben, wenn du mit einem deutlich älteren Release arbeitest. Oft ist dort eine komplett andere Herangehensweise notwendig.
Darf ich fragen, was dich noch auf dem alten Release hält?

Grüße,
Harald

plotEx_R2016a.slx
 Beschreibung:

Download
 Dateiname:  plotEx_R2016a.slx
 Dateigröße:  15.79 KB
 Heruntergeladen:  190 mal

_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
MaxMachtMatlab

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 02.02.2021, 22:13     Titel:
  Antworten mit Zitat      
Harald hat Folgendes geschrieben:
Hallo,

siehe Anhang.
Bitte immer mit angeben, wenn du mit einem deutlich älteren Release arbeitest. Oft ist dort eine komplett andere Herangehensweise notwendig.
Darf ich fragen, was dich noch auf dem alten Release hält?

Grüße,
Harald

Danke dir Harald. Ein vorhandenes Model, auf dem ich aufbaue, wurde in R2016a erstellt. Das mit der Angabe merke ich mir für die Zukunft.
 
Harald
Forum-Meister

Forum-Meister


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

schon mal probiert, das Modell in einem aktuelleren Release zu öffnen? Geht oft recht problemlos.

Grüße,
Harald
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
MaxMachtMatlab
Forum-Newbie

Forum-Newbie


Beiträge: 3
Anmeldedatum: 03.02.21
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 03.02.2021, 23:01     Titel:
  Antworten mit Zitat      
Harald hat Folgendes geschrieben:
Hallo,

schon mal probiert, das Modell in einem aktuelleren Release zu öffnen? Geht oft recht problemlos.

Grüße,
Harald

Hallo Harald, das ist mir neu, versuche ich jedoch gleich morgen. Danke für den Tipp.
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: 04.02.2021, 14:25     Titel:
  Antworten mit Zitat      
Hallo,

mir ist bewusst geworden, dass ich die Funktion ungünstig programmiert hatte: das Grafik-Objekt wurde jedes Mal neu erzeugt, was man ja gerade nicht will. So ist's besser:

Code:
function fcn1(h)
persistent tri rect

if isempty(tri) || ~ishandle(tri)
    plot([0 1 2 0], [0, 1, 0, 0], 'k', 'LineWidth', 3);
    hold on
    tri = fill(NaN, NaN, 'k');
    rect = fill([1.5 1.5 2 2 1.5], [1.5 2 2 1.5 1.5], 'b');
    hold off
    axis([-0.5 2.5 0 2.5]);
end

      % P1 P2  P3 P4 P1
xvec = [0, h, 2-h, 2, 0];
yvec = [0, h,   h, 0, 0];
tri.XData = xvec;
tri.YData = yvec;
if h > 0.7
    rect.Visible = 'on';
else
    rect.Visible = 'off';
end
pause(0.1)
end


Grüße,
Harald
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen



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.