Verfasst am: 19.01.2021, 12:12
Titel: Live Plot - Balken füllen + Text / Bild ergänzen
Hi ,
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?
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
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 ;)
MaxMachtMatlab
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 24.01.2021, 00:42
Titel:
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), line12, 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), line15, 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), line16, 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), line18, 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), line20, 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'
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 ;)
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
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 ;)
MaxMachtMatlab
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 01.02.2021, 14:57
Titel:
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([0120], [0, 1, 0, 0], 'k', 'LineWidth', 3);
hold on
tri = fill(xvec, yvec, 'k');
rect = fill([1.51.5221.5], [1.5221.51.5], 'b');
hold off
rect.Visible = 'off';
axis([-0.52.502.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([0120], [0, 1, 0, 0], 'k', 'LineWidth', 3);
hold on
tri = fill(xvec, yvec, 'k');
rect = fill([1.51.5221.5], [1.5221.51.5], 'b');
hold off
rect.Visible = 'off';
axis([-0.52.502.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
Attempt to extract field 'Visible' from 'mxArray'. Function 'MATLAB Function' (#556.315.319), line14, 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), line17, 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), line18, 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), line20, 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), line22, 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.
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.
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 ;)
MaxMachtMatlab
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 01.02.2021, 22:10
Titel:
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
Könntest du die .slx für R2016a zur Verfügung stellen? Das neue Dateiformat kann ich leider nicht öffnen.
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?
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 ;)
MaxMachtMatlab
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 02.02.2021, 22:13
Titel:
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.
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 ;)
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:
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 ;)
Einstellungen und Berechtigungen
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
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.