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

(reale) Simulationszeit anzeigen

 

christian_2
Forum-Anfänger

Forum-Anfänger


Beiträge: 29
Anmeldedatum: 16.04.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 28.09.2020, 07:29     Titel: (reale) Simulationszeit anzeigen
  Antworten mit Zitat      
Hallo zusammen!

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
Private Nachricht senden Benutzer-Profile anzeigen


christian_2
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 29
Anmeldedatum: 16.04.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 28.09.2020, 11:47     Titel:
  Antworten mit Zitat      
hatte ich vergessen.... Rolling Eyes

Matlab 2015b, 64 bit, Windows 10.

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

Forum-Meister


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

ich würde das mit einer MATLAB Function mit einer persistent-Variable machen, siehe Anhang.

Grüße,
Harald

timerTestModel.slx
 Beschreibung:

Download
 Dateiname:  timerTestModel.slx
 Dateigröße:  24.59 KB
 Heruntergeladen:  315 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
 
christian_2
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 29
Anmeldedatum: 16.04.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 29.09.2020, 06:59     Titel:
  Antworten mit Zitat      
Hallo Harald,

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), line 6, 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), line 9, 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), line 11, 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
 



Meine Matlab-Funktion sieht so aus:
Code:

function y = fcn (sim_zeit)

persistent dauer

if sim_zeit < 0.01
    tic;
end

dauer = toc;

y = dauer;
 


Das Simulinkmodell, das in 2019b funktioniert, habe ich angehängt.
Kannst Du mir bitte nochmal helfen?

Viele Grüße
Christian

reale_Simulationszeit_2019b.slx
 Beschreibung:

Download
 Dateiname:  reale_Simulationszeit_2019b.slx
 Dateigröße:  23.64 KB
 Heruntergeladen:  271 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


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

hier die hoffentlich 15b-kompatible Version.

Grüße,
Harald

timerTestModel_15b.slx
 Beschreibung:

Download
 Dateiname:  timerTestModel_15b.slx
 Dateigröße:  15.12 KB
 Heruntergeladen:  279 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
 
christian_2
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 29
Anmeldedatum: 16.04.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 29.09.2020, 09:11     Titel:
  Antworten mit Zitat      
Hallo,

du hast das fast genauso gemacht, wie ich; nur ein klein wenig eleganter Smile
Leider funktioniert das in 2015b nicht.

Ich erhalte die gleiche Fehlermeldung, wie mit 'meinem' Modell:

Code:

Function 'tic' is not supported for code generation. Consider adding coder.extrinsic('tic') at the top of the function to bypass code generation.
 


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:

Code:

function y = fcn(distance)

coder.extrinsic('tic');
coder.extrinsic('toc');


persistent tStart
if isempty(tStart)
    tStart = tic; % first time
end
timeElapsed = toc(tStart);
y = timeElapsed / (distance/10) - timeElapsed; % hier: finale Distanz = 10
 



Jetzt kommt die Fehlermeldung:

Code:

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
 


Quelle: https://de.mathworks.com/matlabcent.....te-and-time-into-simulink


Hier gibt es auch wieder den Befehl 'extrinsic'.

Ich habe mir dann folgendes gebastelt, was zumindest schon mal das macht, was ich will. Mein Problem wäre also erstmal gelöst und ich bin glücklich Very Happy


Code:

function dauer = fcn()

persistent tStart

    eml.extrinsic('now');
    eml.extrinsic('datevec');

    Jahr     = 0;
    Monat    = 0;
    Tag      = 0;
    Stunden  = 0;
    Minuten  = 0;
    Sekunden = 0;
    [Jahr, Monat, Tag, Stunden, Minuten, Sekunden] = datevec(now);
   
    if isempty(tStart)
       tStart = Sekunden + 60 * Minuten + 3600 * Stunden;
    end
   
    dauer = Sekunden + 60 * Minuten + 3600 * Stunden - tStart;
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...

Viele Grüße
Christian

Datum_und_Uhrzeit.slx
 Beschreibung:

Download
 Dateiname:  Datum_und_Uhrzeit.slx
 Dateigröße:  22.2 KB
 Heruntergeladen:  285 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


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

eine elegante Lösung: immer neueres Release verwenden ;)

eml.extrinsic ist mir noch nicht untergekommen.

Um die "Simulink does not have enough information..." - Meldung zu addressieren, versuche mal vor der Belegung von y
Code:

einzufügen.

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 ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
christian_2
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 29
Anmeldedatum: 16.04.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 29.09.2020, 09:29     Titel:
  Antworten mit Zitat      
Hallo Harald,

neueres Release liegt leider nicht in meiner Macht... da bin ich Sklave Wink

Der Tip mit y = 0; war super!
Jetzt funktioniert die Geschichte und sieht auch 'elegant' aus. Very Happy

Danke nochmal für Deine Hilfe und Geduld!

Einen schönen Tag noch und viele Grüße aus München
Christian
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.