Nachdem ich Fahrzeugsimulationen mit unterschiedlichen Detaillierungsgraden mache, sind die Simulationszeiten je nach Strecke manchmal sehr lang.
Deshalb gebe ich mir in einem Display aktuell den Simulationsfortschritt an, den ich einfach über die 'gefahrene' Strecke berechne (Simulationszeit steht auf inf, Simulation wird bei Streckenende beendet).
Nun möchte ich auch die restliche Simulationszeit in einem Display anzeigen (die reale Zeit natürlich).
Ich würde das einfach so ausrechnen, dass ich aus dem prozentualen Fortschritt und der verstrichenen (realen) Simulationszeit die ungefähre Zeit bis Simulationsende berechne und mir diese in einem Display ausgebe.
Beispiel: Simulationsfortschritt ist 33 %, die Simulation lief bisher 30 min, dann kann man davon ausgehen, dass die Simulation etwa in einer Stunde fertig sein wird. Mir ist klar, dass das natürlich nicht zu 100 % passt, aber man kann zumindest abschätzen, ob man zum Mittagessen gehen kann oder vielleicht noch warten sollte, bevor man geht.
Mein Lösungsansatz wäre tic und toc gewesen. tic kann ich ja bei Simulationsstart (InitFcn) aufrufen und toc wollte ich mir in einem Constant-Block holen. Aber wie ich schon befürchtet habe, ändert Simulink toc während der Laufzeit nicht.
Weiß jemand, wie ich das Problem lösen kann?
Vielen Dank schon mal im Voraus für jede Antwort und viele Grüße,
Christian
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 ;)
danke für Deine Antwort.
Leider kann ich das Modell nicht öffnen, weil die Simulinkversion, mit der Du das Modell gespeichert hast, zu neu ist. Kannst Du mir das bitte noch einmal in Matlab 2015b abspeichern?
Ich habe mich übrigens über persistente Variablen schlau gemacht (kannte ich noch nicht). So, wie ich das verstehe, sind das lokale Variablen in einer Matlab-Funktion, oder?
Jedenfalls habe ich Deinen Gedanken aufgegriffen und selbst nochmal probiert, mein Problem zu lösen.
Dabei ist ein Modell herausgekommen, das zwar in 2019b funktioniert und genau das macht, was ich will, in 2015b funktioniert es leider aber nicht:
Code:
Function 'tic' is not supported for code generation. Consider adding coder.extrinsic('tic') at the top of the function to bypass code generation.
Function 'MATLAB Function' (#22.70.73), line6, column 5:
"tic"
Launch diagnostic report.
Component: MATLAB Function | Category: Coder error Function 'toc' is not supported for code generation. Consider adding coder.extrinsic('toc') at the top of the function to bypass code generation.
Function 'MATLAB Function' (#22.88.91), line9, column 9:
"toc"
Launch diagnostic report.
Component: MATLAB Function | Category: Coder error
Undefined function or variable 'dauer'. The first assignment to a local variable determines its class.
Function 'MATLAB Function' (#22.98.103), line11, column 5:
"dauer"
Launch diagnostic report.
Component: MATLAB Function | Category: Coder error
Errors occurred during parsing of MATLAB function 'MATLAB Function'
Component: MATLAB Function | Category: Coder error
Errors occurred during parsing of MATLAB function 'MATLAB Function'
Component: Simulink | Category: Block errorOpen
Error occurred in 'Test/MATLAB Function'.
Component: Simulink | Category: Block error
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 ;)
Weißt Du, was Simulink mir mit der Aussage 'Consider adding coder.extrinsic('tic') at the top of the function to bypass code generation.' sagen will?
Ich kapiere das leider nicht.
Ich habe mal ganz naiv für tic und toc die Zeilen eingefügt:
Simulink does not have enough information to determine output sizes for this block. If you think the errors below are inaccurate, try specifying types for the block inputs and/or sizes for the block outputs.
Component: MATLAB Function | Category: Coder error
Expected either a logical, char, int, fi, single, or double. Found an mxArray. MxArrays are returned from calls to the MATLAB interpreter and are not supported inside expressions. They may only be used on the right-hand side of assignments and as arguments to extrinsic functions.
Ich hatte dann den Gedanken, mittels Systemzeit die verstrichene Zeit zu berechnen. Dabei bin ich beim Googeln auf folgenden Code gestoßen:
Code:
function[Y, M, D, H, MN, S] = fcn()
eml.extrinsic('now');
eml.extrinsic('datevec');
Y = 0;
M = 0;
D = 0;
H = 0;
MN = 0;
S = 0;
[Y, M, D, H, MN, S] = datevec(now);
end
Nachdem ich ja aber auch etwas lernen will, nochmal drei Fragen an Dich, die Du vielleicht beantworten kannst:
Warum hat 'coder.extrinsic('tic');' nicht funktioniert?
Was ist der Unterschied zwischen coder.extrinsic und eml.extrinsic. Wenn man in der Matlabhilfe nach eml.extrinsic finde ich nichts.
Gibt es eine 'elegantere' Lösung, als meine? Mir scheint das sehr umständlich...
Das wirkt für MATLAB-Nutzer zwar kurios, sollte aber helfen, den Datentyp zu bestimmen.
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 ;)
neueres Release liegt leider nicht in meiner Macht... da bin ich Sklave
Der Tip mit y = 0; war super!
Jetzt funktioniert die Geschichte und sieht auch 'elegant' aus.
Danke nochmal für Deine Hilfe und Geduld!
Einen schönen Tag noch und viele Grüße aus München
Christian
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.