Wie stelle ich eine Eingabe für ein Simulink-Modell bereit, ohne es in den Arbeitsbereich zu platzieren?

8

Ich habe ein Simulink-Modell, das gerade von einem Skript ausgeführt wird (d. h. keine Funktion). Das Skript schreibt Variablenwerte in den MATLAB-Arbeitsbereich, führt die Modellsimulation aus (die diese Werte verwendet), und dann schreibt das Modell zusätzliche Werte in den Arbeitsbereich. Wenn ich versuche, das Skript in eine Funktion umzuwandeln (indem ich function [output] = runSim() am Anfang der Datei platziere), beklagt sich Simulink, dass es die Variablen nicht kennt, vermutlich weil sie nicht im MATLAB-Arbeitsbereich sind, sondern sie sind im Funktionsumfang.

Gibt es eine elegante Möglichkeit, ein Simulink-Modell mit Eingängen zu versehen und Ausgaben von einem Simulink-Modell zu übernehmen, anstatt sie in den Arbeitsbereich zu stecken?

    
JnBrymn 11.03.2011, 22:48
quelle

4 Antworten

9

Es ist nicht offensichtlich, aber Sie können Daten vom sim() -Befehl und vom Arbeitsbereich einer aufrufenden Funktion eingeben / ausgeben. Ich habe es vor & amp; habe ein Beispiel bei der Arbeit, kann aber bis Montag nicht hinkommen, um das zu überprüfen. Versuchen Sie jedoch die auf der Mathworks-Website aufgelistete Lösung :

  

Lösung:

     

Bei Verwendung von variablen Maskenparametern in   Simulink, der Basisarbeitsbereich ist der   Standard-Quellarbeitsbereich von Simulink.   Mit dem Befehl SIMSET können Sie jedoch   Dieser Arbeitsbereich kann geändert werden. SIM ist   dann mit dieser Optionsstruktur verwendet   erstellt von SIMSET. Das Folgende ist ein   Beispiel, wie man das macht.

%Vor%

... obwohl dies anscheinend in R2009b aufgrund der Inkompatibilität mit der Parallel Computing Toolbox & gt; veraltet ist :( Es sieht so aus, als ob die korrekte Lösung ist, Variablen explizit in den Modellarbeitsbereich der Simulation (anders als der Basisarbeitsbereich) zu schieben a href="http://www.mathworks.com/help/techdoc/ref/assignin.html"> assignin() .

Ссылка

  

Sie haben 2 Optionen:

     
  1. Lesen Sie für Releases vor R2009b die SIMSET-Dokumentation. Es erlaubt   Sie legen die Eigenschaft "SrcWorkspace" fest   zu "aktuell", um die Daten von Ihrem zu verwenden   Funktion.
  2.   

Ссылка

     
  1. In neueren Versionen ist diese Option veraltet, weil sie nicht kompatibel ist   mit der Parallel Computing Toolbox   und PARFOR. Was ich empfehle ist:
  2.   

Ссылка

    
Jason S 12.03.2011, 15:14
quelle
2

Sie können die Funktion evalin () verwenden, um von Ihrer eigenen Funktion einen MATLAB-Ausdruck (als String) in einem bestimmten Arbeitsbereich auszuführen, in Ihrem Fall die Basis für SIMULINK, um sie zu finden. Wenn Sie den Arbeitsbereich jedoch nicht direkt verwenden möchten, können Sie die Signale oder Variablen aus / in MAT-Dateien mithilfe der Blöcke Von / Bis Datei laden und speichern.

    
Mahmoud Kassem 12.03.2011 03:35
quelle
0

Kurze Antwort: Nein.

Ich könnte mich irren , aber lassen Sie mich Ihnen einen Hintergrund geben. Ich arbeite an einem sehr großen Simulink-Modell, an dem wir seit Jahren arbeiten. Bis heute laden wir noch alle notwendigen Variablen über den Arbeitsbereich ein. Das war lange Zeit eine Beschwerde von mir, so sehr, dass MathWorks das Problem sogar mit der Funktion Simulink.save_vars gelöst hat. Es hört sich so an, als würden Sie bereits Variablen mit einem Skript / einer Funktion einrichten, daher wird Simulink.save_vars Ihnen nicht viel nützen.

Sie können den Arbeitsbereich bereinigen, indem Sie Strukturen für einige der Variablen verwenden. Die meisten Simulink-Blöcke unterstützen keine Strukturen, manche jedoch. Vermeiden Sie außerdem, dass Sie etwas in den Arbeitsbereich einfügen, außer den Variablen, die Ihr Modell benötigt.

    
Miebster 12.03.2011 00:18
quelle
0

Nun, ich weiß nicht, wie man es mit einer einfachen Funktion macht, aber es ist wirklich praktisch, es innerhalb einer Klassenfunktion (Methode) zu tun. Es funktioniert gut mit Version 2009b.

Platzieren Sie den Code in der Datei Test.m:

%Vor%

Dann nur:

%Vor%

Was passiert? Sie legen einen Objekttest an, in dem die Felder t und u definiert sind. Dann in der Methode sim () sagen Sie zu Simulink, um nach Eingabe '[test.t test.u]' zu suchen. Sowohl Simulink als auch die Methode sim () haben Zugriff auf diese Variablen (ich glaube, das ist das Wichtigste).

OK, es hat immer noch einen großen Nachteil, der mit Nummer 1 markiert ist. Sie müssen explizit wissen, wie ein Verweis auf die Klasseninstanz im Arbeitsbereich benannt wird (in diesem Fall 'test'). Sie können es umgehen, indem Sie den Namen in einem Konstruktor übergeben, oder Sie können statische Variablen und Methoden verwenden, aber auf diese Weise können Sie das Eingangssignal nicht dynamisch ändern.

    
Golmar 03.02.2013 23:13
quelle

Tags und Links