|
|
Real-Time-Workshop (RTW) - Ändern der stepSize zur Laufzeit |
|
EliteTUM |
Forum-Fortgeschrittener
|
|
Beiträge: 70
|
|
|
|
Anmeldedatum: 21.04.11
|
|
|
|
Wohnort: München
|
|
|
|
Version: ---
|
|
|
|
|
|
Verfasst am: 26.04.2011, 09:37
Titel: Real-Time-Workshop (RTW) - Ändern der stepSize zur Laufzeit
|
|
|
|
|
Hallo,
ich arbeite momentan mit einer Executable die aus C-Code compiliert wurde. Dieser wiederrum wurde mit Hilfe des Real-Time-Workshop aus einem komplexen Simulink-Modell erzeugt. Die Executable läuft über längere Zeit, die Simulation wird aber zwischendrin öfters auch mal pausiert. Um Rechenleistung zu sparen würden wir gerne, wenn die Simulation pausiert wurde, die Schrittweite vergrößern. Ist dies generell möglich? Hat da jemand Erfahrung mit? Meine bisherige Recherche ergab keine eindeutige zufriendstellende Antwort dazu.
Ungefähre Modellbeschreibung:
Es handelt sich um ein komplexes Modell mit einer festen Simulationsschrittweite von 2ms. Die erzeugte Executable steh über TCP/IP-Verbindung mit einer externen Software in Verbindung, deren Rechenschrittweite 40ms beträgt. Die externe Software steuert unsere Simulink-Executable. Intern innerhalb unseres Simulink-Modells wird die Simulation mit Hilfe einer S-Function gesteuert (d.h. Start, Stop, Pause der Simulation). Sobald die Simulation von extern pausiert wird, läuft die Simulink-Executable weiter mit einer Simulationsfrequenz von 2ms weiter ohne jedoch irgendwelche Berechnungen anzustellen. Dies ist eine unnötig hohe Belastung des Rechners (CPU-Lüfter läuft dauerhaft auf Maximum) und soll wenn möglich unterbunden werden indem während des Pausierens die Simulationsschrittweite auf 40ms (wie die externe Anwednung) angehoben wird. Sobald wir wieder einen Start-Befehl bekommen würden wir gerne zurück auf 2ms zurückschalten und weiter simulieren.
Mein bisherige Ansatz, der aber nicht funktionierte, war:
Die S-Function welche die externen Steuerbefehle (Start, Stop, Pause) erhält und intern die Simulink-Executable steuert ist in C geschrieben. Die Funktion mdlOutputs() ist dabei die Funktion welche zu jedem Simulationsschritt einmal aufgerufen wird und die S-Function-Blockausgänge errechnet. Sollten wir nun ein Pause-Signal erhalten, habe ich versucht einfach immer ein "sleep(...)"-Befehl einzubauen, so dass wir innerhalb dieser Funktion 40ms warten. Dies hatte jedoch keinerlei Wirkung. Anscheinend wird der Aufruf der Funktion "mdlOutputs()" extern jeweils nach Ablauf der stepSize() getriggert ohne auf die Beendigung des vorherigen Aufrufes zu warten. Jemand eine Idee, ob die Änderung der Stepsize wie gewollt möglich ist?
Bin für jede Hilfe und Anregung dankbar!
_________________
- EliteTUM
_____________________________________
|
|
|
|
|
Harald |
Forum-Meister
|
|
Beiträge: 24.492
|
|
|
|
Anmeldedatum: 26.03.09
|
|
|
|
Wohnort: Nähe München
|
|
|
|
Version: ab 2017b
|
|
|
|
|
|
Verfasst am: 26.04.2011, 10:21
Titel:
|
|
Hallo,
nach meinem Verständnis ist eine Änderung der Schrittweite während der Laufzeit nicht möglich.
Was funktionieren könnte: das ganze Modell in ein Enabled Subsystem einbauen, dessen Steuersignal:
- 1 ist, wenn normal simuliert wird.
- ein Puls-Signal ist, das alle 40 ms auf 1 geht, wenn die andere SW pausiert.
Das hätte meines Erachtens den gewünschten Effekt.
Grüße,
Harald
|
|
|
EliteTUM |
Themenstarter
Forum-Fortgeschrittener
|
|
Beiträge: 70
|
|
|
|
Anmeldedatum: 21.04.11
|
|
|
|
Wohnort: München
|
|
|
|
Version: ---
|
|
|
|
|
|
Verfasst am: 26.04.2011, 10:40
Titel:
|
|
argh, auf einen ähnlichen Vorschlag bin ich bei meiner Recherche auch gestoßen. Hätte gehofft, das ganze lediglich durch Abändern meiner S-Function oder schlimmstenfalls der RTW-Main-C-File zu erreichen. Am Simulink-Modell will ich nur ungern "rumpfuschen". Sollte zwar kein Problem sein weil ich im Endeffekt das ganze bisherige Modell in ein Sub-Modell eine Ebene tiefer packe, aber das Modell ist extrem komplex (mehr als tausend Blöcke). Mal schauen, zur Not muss halt unnötig Prozessor-Abwärme produziert werden
Danke für den Tipp!
_________________
- EliteTUM
_____________________________________
|
|
|
Harald |
Forum-Meister
|
|
Beiträge: 24.492
|
|
|
|
Anmeldedatum: 26.03.09
|
|
|
|
Wohnort: Nähe München
|
|
|
|
Version: ab 2017b
|
|
|
|
|
|
Verfasst am: 26.04.2011, 11:37
Titel:
|
|
Hallo,
du könntest auch mit einer Modell-Referenz arbeiten.
Damit würde das ursprüngliche Modell nicht angetastet.
Grüße,
Harald
|
|
|
EliteTUM |
Themenstarter
Forum-Fortgeschrittener
|
|
Beiträge: 70
|
|
|
|
Anmeldedatum: 21.04.11
|
|
|
|
Wohnort: München
|
|
|
|
Version: ---
|
|
|
|
|
|
Verfasst am: 26.04.2011, 11:44
Titel:
|
|
guter Tipp, ich versuchs mal. Danke!
Muss nur meine S-Functions durchgehen ob die von einer festen Simulationszeit ausgehen. Manche haben nämlich einen simplen Zeit-Counter integriert der bei jedem Simulationsschritt mitzählt (weshalb auch immer )und bei sich ändernder Schrittweite ist das natürlich sinnlos.
_________________
- EliteTUM
_____________________________________
|
|
|
Verschoben: 26.04.2011, 21:01 Uhr von _Peter_ Von Programmierung nach Simulink |
|
|
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
|
|
Impressum
| Nutzungsbedingungen
| Datenschutz
| FAQ
| 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.
|
|