Verfasst am: 09.12.2015, 19:55
Titel: Simulink-Modell aus function starten
Hallo Leute,
ich habe ein Simulink-Modell aufgebaut, das mit immer wechselnden Variablen durchgeführt werden soll.
Derzeit habe ich für jede relevante Variable einen Vektor mit unterschiedlichen Werten.
In einem Skript sind Schleifen für die Variablen, damit der gesamte Variablen-Raum durchlaufen wird. Das Ganze sieht dann vom Prinzip her so aus:
Code:
for i = 1:length(Variable_1) for j = 1:length(Variable_2) sim('Simulink_Modell')
Ergebnis(i,j) = max(Betrachtete_Variable_in_Simulink) end end
Im Simulink-Modell werden die Variablen entsprechend des gerade aktuellen Zählers gewählt, also Variable_1(i) und Variable_2(j).
Am Ende speichere ich in der Matrix 'Ergebnis' den Maximalwert einer in der Simulation betrachteten Variablen.
Soweit funktioniert das ganze auch sehr gut.
Jetzt möchte ich mein Skript allerdings erweitern: Die Simulation bleibt unangetastet, allerdings gibt es jetzt zwei Sets von Variablen.
Version1.Variable_1 und Version2.Variable_1.
Entsprechend muss auch das Ergebnis jetzt als Version1.Ergebnis bzw. Version2.Ergebnis gespeichert werden.
Am liebsten würde ich mir eine Function aufbauen, sodass die Variablen für die Simulation sozusagen vorsortiert sind:
Code:
function[Ergebnis] = Simulationsfunktion(var1, var2) sim('Simulink_Modell')
Ergebnis = max(Betrachtete_Variable_in_Simulink) end
switchVersion case1 for i = 1:length(Version1.Variable_1) for j = 1:length(Version1.Variable_2)
Version1.Ergebnis(i,j) = Simulationsfunktion(Version1.Variable_1, Version1.Variable_2);
end end case2 for i = 1:length(Version2.Variable_1) for j = 1:length(Version2.Variable_2)
Version2.Ergebnis(i,j) = Simulationsfunktion(Version2.Variable_1, Version2.Variable_2);
end end end
Damit könnte ich dann in Simulink immer auf die "einfachen" Variablen 'var1' und 'var2' zugreifen.
Ist es irgendwie möglich, das umzusetzen? Derzeit funktioniert das nämlich nicht.
Vielen Dank schonmal und beste Grüße!
August
Nachtrag:
Der Fehler, den ich erhalte, ist folgender:
Error using Simulationsfunktion (line 2)
Invalid setting in 'Simulink_Modell/From Workspace' for parameter 'VariableName'.
Error in Skript (line 3)
Result = Simulationsfunktion(Eingangsvariable);
Caused by:
Error using Simulationsfunktion (line 2)
Error evaluating parameter 'VariableName' in 'Simulink_Modell/From Workspace'
Error using Simulationsfunktion (line 2)
Undefined function or variable 'var1'.
ja, das hilft mir schonmal weiter. Die Simulation läuft durch.
Allerdings kann ich jetzt nicht mehr das Ergebnis der Simulation speichern:
Undefined function or variable 'simout'.
Error in Simulationsfunktion (line 3)
Ergebnis = max(simout);
Ich habe folgendes probiert: im Command Window var1 = 1 festgelegt und Simulation per Hand durchgeführt. Funktioniert, im Workspace sind nun "var1", "simout" und "tout". Die zweite Variable ist genau das, deren maximalen Wert ich will.
Führe ich allerdings das ganze durch die Funktion aus:
Code:
function[Ergebnis] = Simulationsfunktion(var1) sim('TestSimulation', 'SrcWorkspace', 'current')
Ergebnis = max(simout);
end
und setze einen Debug-Punkt in Zeile 3, so führt er die Simulation zwar aus, danach sind aber die Variablen "simout" und "tout" nicht mehr im Workspace. Nur das "var1" steht noch drin.
meine Vermutung wäre, dass die Ausgabe im falschen Workspace landet. Da sollte die Option DstWorkspace helfen - oder sich die Rückgabeargumente von sim holen.
bei einem neuen Projekt bin ich auf ein sehr ähnliches Problem gestoßen. Daher füge ich es hier an, anstatt ein neues Thema aufzumachen.
Vor der Weiterverarbeitung einiger Signale möchte ich mehrere Transformationen durchführen. Dabei liegen sehr viele Messungen (mehrere Wiederholungen, Fahrmanöver sowie Fahrzeugmodelle) vor.
Zur Transformation habe ich mir ein Simulink-Modell aufgebaut.
Da ich das eine Modell über alle Wiederholungen, Fahrmanöver, Fahrzeugmodelle anwenden kann, habe ich die Simulation in eine function gepackt.
Diese function rufe ich aus meinem Hauptverzeichnis auf:
stop = length(phi_time)*(phi_time(end)-phi_time(end-1)); % 'stop' ist im Simulink-Modell als Ende der Simulation eingetragen.
options = simset('SrcWorkspace','current');
sim('Sim_Transformation', options) end
Wenn ich einen BrakePoint vor den Aufruf der Simulation setze, werden im Workspace alle relevanten Variablen korrekt angezeigt (und auch nur die in der function). Die Simulation liefert jedoch einen Fehler:
Code:
Error using Transformation(line22)
'DstWorkspace' parameter is not supported in this form of syntax forsim command
Die Simulation läuft nun durch. Allerdings werden die Simulationsergebnisse nicht im aktuellen Workspace ausgegeben, können also auch nicht von der function aus output-Argumente genutzt werden.
der Fehler wird für Zeile 22 ausgegeben. Entweder ich kann nicht zählen, oder deine Transformation-Funktion hat keine 22 Zeilen. Wird vielleicht eine andere, gleich benannte Funktion ausgeführt?
das war eine Nachlässigkeit meinerseits. Ich habe einige Kommentar-Zeilen entfernt, da diese nicht veröffentlicht gehören. Habe aber die Zeilennummer im Fehler nicht angepasst. Der Fehler bezieht sich auf die sim(...)-Zeile.
Kurz nach deiner Nachricht habe ich Post, auf den du geantwortet hast, nochmals aktualisiert, da ich etwas experimentiert habe.
ich habe gerade nochmal in die Doku und vor allem die Beispiele geschaut. Dort wird ja vorgeschlagen, dass man sich ein Rückgabeargument von sim holt und daraus die Variablen extrahiert. DstWorkspace war wohl in einer älteren Version.
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.