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

Simulink-Modell aus function starten

 

AugustusOne
Forum-Anfänger

Forum-Anfänger


Beiträge: 15
Anmeldedatum: 26.06.15
Wohnort: ---
Version: 2015b
     Beitrag Verfasst am: 09.12.2015, 19:55     Titel: Simulink-Modell aus function starten
  Antworten mit Zitat      
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


Die ich dann wie folgt aufrufen würde:
Code:
switch Version
    case 1
        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
    case 2
        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'.
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: 10.12.2015, 05:14     Titel:
  Antworten mit Zitat      
Hallo,

das Problem dürfte sein, dass Simulink im falschen Workspace nach den Variablen sucht. Probier mal:

Code:
sim(..., 'SrcWorkspace', 'current')

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
AugustusOne
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 15
Anmeldedatum: 26.06.15
Wohnort: ---
Version: 2015b
     Beitrag Verfasst am: 10.12.2015, 06:36     Titel:
  Antworten mit Zitat      
Hallo Harald,

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.
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: 11.12.2015, 04:40     Titel:
  Antworten mit Zitat      
Hallo,

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.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
AugustusOne
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 15
Anmeldedatum: 26.06.15
Wohnort: ---
Version: 2015b
     Beitrag Verfasst am: 21.05.2016, 11:12     Titel:
  Antworten mit Zitat      
Hallo Leute,

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:

Code:
[A] = Transformation(...
                                    xapp,...
                                    yapp,...
                                    zapp,...
                                    xapp_time,...
                                    yapp_time,...
                                    zapp_time,...
                                    phi,...
                                    phi_time...
                                    );


Code:
function [ xapp_trans, yapp_trans, zapp_trans, phi_trans ] = ...
          Transformation( xapp, yapp, zapp, xapp_time, yapp_time, zapp_time, phi, phi_time)

s               = 1;                        % Startelement
d               = 1;                        % Dämpfungskonstante [ ]
k               = 1;                        % Verstärkungsfaktor [ ]
omega_0         = 5;                        % [Hz]
T               = sqrt(1/omega_0);
T_A             = 66;                       % Adaptionszeitkonstante regulär [s]
K_A             = 1.22;                     % Adaptionsverstärkung [ ]
T_L             = 0.3;                      % Hochfrequenzkonstante [s]
T_I             = 0.12;                     % Integrationskonstante [s]

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(line 22)
'DstWorkspace' parameter is not supported in this form of syntax for sim command



Ohne den Zusatz findet er allerdings die Variablen nicht.

Würde mich super freuen, wenn jemand eine Idee hätte, wie ich das lösen könnte! Smile

Beste Grüße
August
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: 21.05.2016, 11:18     Titel:
  Antworten mit Zitat      
Hallo,

den wirklich relevanten Teil - wo du DstWorkspace setzt - hast du leider weggelassen.

Zudem wäre hilfreich zu wissen, welche MATLAB-Version du verwendest.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
AugustusOne
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 15
Anmeldedatum: 26.06.15
Wohnort: ---
Version: 2015b
     Beitrag Verfasst am: 21.05.2016, 11:25     Titel:
  Antworten mit Zitat      
Hallo Harald,

meine Version ist 2015b.

Den DstWorkspace setze ich nirgendwo, das ist ja das seltsame. Weder in der function, noch im Hauptverzeichnis.


Kleines Update:
Statt zunächst options zu deklarieren und diese in
Code:
sim('Sim_Transformation', options)

einzufügen, habe ich sie mal direkt in den Sim-Befehl gepackt:
Code:
sim('Sim_Transformation', 'SrcWorkspace', 'current')

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.

Wenn ich DstWorkspace anfüge:
Code:
sim('Sim_Transformation', 'SrcWorkspace', 'current', 'DstWorkspace', 'current')

kommt der bekannte Fehler:
Code:
'DstWorkspace' parameter is not supported in this form of syntax for sim command


Zuletzt bearbeitet von AugustusOne am 21.05.2016, 12:00, insgesamt einmal bearbeitet
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: 21.05.2016, 12:00     Titel:
  Antworten mit Zitat      
Hallo,

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?

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
AugustusOne
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 15
Anmeldedatum: 26.06.15
Wohnort: ---
Version: 2015b
     Beitrag Verfasst am: 21.05.2016, 12:02     Titel:
  Antworten mit Zitat      
Hallo Harald,

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.
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: 21.05.2016, 13:41     Titel:
  Antworten mit Zitat      
Hallo,

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.

Wie man mit der Rückgabe umgeht, siehe hier:
http://de.mathworks.com/help/simuli.....-sim-command.html#br92hw_

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
AugustusOne
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 15
Anmeldedatum: 26.06.15
Wohnort: ---
Version: 2015b
     Beitrag Verfasst am: 22.05.2016, 10:02     Titel:
  Antworten mit Zitat      
Vielen Dank! Smile

Mit den Tipps hat es jetzt geklappt.

Code:
simOut = sim('Sim_Transformation',...
            'SaveState','on',...
            'SaveOutput','on',...
            'SrcWorkspace','current');
simOutVars = simOut.who;
Outputvariable_function1 = simOut.get('Output_sim_1');
Outputvariable_function2 = simOut.get('Output_sim_2');
% ...
 
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.