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?
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:
- 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.
- In neueren Versionen ist diese Option veraltet, weil sie nicht kompatibel ist mit der Parallel Computing Toolbox und PARFOR. Was ich empfehle ist:
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.
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.
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.