|
|
Script aus MATLAB function ausführen |
|
baustamm |
Forum-Anfänger
|
|
Beiträge: 29
|
|
|
|
Anmeldedatum: 20.07.12
|
|
|
|
Wohnort: ---
|
|
|
|
Version: Matlab 2011b
|
|
|
|
|
|
Verfasst am: 20.07.2012, 11:01
Titel: Script aus MATLAB function ausführen
|
|
Hallo!
Ich habe eine Frage. In meinem Simulink Modell ist ein Block mit einer matlab function, in der function würde ich gerne ein script aufrufen. wenn ich den script name in die function schreibe kommt folgender fehler:
This text contains non-empty top-level expressions. It appears to be a script.
Wie bekomme ich das script aufgerufen?
vielen dank!
|
|
|
|
|
DSP |
Forum-Meister
|
|
Beiträge: 2.117
|
|
|
|
Anmeldedatum: 28.02.11
|
|
|
|
Wohnort: ---
|
|
|
|
Version: R2014b
|
|
|
|
|
|
Verfasst am: 20.07.2012, 11:12
Titel:
|
|
Meinst du einen Embedded Matlab Function Block?
Wenn du mit Skript einen m-file meinst, ist ein Aufruf in dem Block nicht möglich. Hier werden längst nicht alle Funktionen aus Matlab unterstützt.
Mögliche Lösung: Das Simulink-Modell aus einem m-file starten, wo auch deine andere Funktion aufgerufen werden kann. Entsprechend müssen dann dem Modell die Variablen übergeben werden.
|
|
|
baustamm |
Themenstarter
Forum-Anfänger
|
|
Beiträge: 29
|
|
|
|
Anmeldedatum: 20.07.12
|
|
|
|
Wohnort: ---
|
|
|
|
Version: Matlab 2011b
|
|
|
|
|
|
Verfasst am: 20.07.2012, 12:18
Titel:
|
|
ja das meine ich.
okay danke schon einmal für die antwort.
funktionen kann man aber aufrufen oder? ich muss einem mex file den input übergeben und den output bekommen um diesen dann weiter zu verarbeiten.
myexample RUN(x) ist der aufruf, wenn ich das in der commandzeile eingeben funktioniert alles wie gewünscht.
der simulink block (embedded matlab function) soll also praktisch diesen aufruf in die commandzeile schreiben und den output weiterleiten.
x ist dabei der input in den function block.
|
|
|
DSP |
Forum-Meister
|
|
Beiträge: 2.117
|
|
|
|
Anmeldedatum: 28.02.11
|
|
|
|
Wohnort: ---
|
|
|
|
Version: R2014b
|
|
|
|
|
|
Verfasst am: 20.07.2012, 12:41
Titel:
|
|
Eine Funktion ist doch auch in einem m-file gespeichert, ergo geht das auch nicht. Das es in der Commandozeile geht, ist ja unwichtig (da matlab)...der Block unterstützt dieses Aufruf eben nicht. Es gibt sicherlich andere Möglichkeiten, aber da bin ich dann überfragt.
Schau einfach mal in der Doku zu dem Block, was alles unterstützt wird
|
|
|
baustamm |
Themenstarter
Forum-Anfänger
|
|
Beiträge: 29
|
|
|
|
Anmeldedatum: 20.07.12
|
|
|
|
Wohnort: ---
|
|
|
|
Version: Matlab 2011b
|
|
|
|
|
|
Verfasst am: 20.07.2012, 13:11
Titel:
|
|
es gibt eine myexample_RUN.m datei aber die ist leer. der eigentliche code befindet sich in einem mex file welches aus einer kompilierten c++ datei kommt. ich muesste also irgendwie dem mex file einen wert uebergeben und einen wert ausgegeben bekommen.
vielen dank auf jeden fall mal, ich probiere mal weiter!
|
|
|
cybbi |
Forum-Fortgeschrittener
|
|
Beiträge: 84
|
|
|
|
Anmeldedatum: 23.08.11
|
|
|
|
Wohnort: ---
|
|
|
|
Version: Alle
|
|
|
|
|
|
Verfasst am: 20.07.2012, 14:37
Titel:
|
|
Lösung:
In deinem Script eine Zeile ganz oben hinzufügen:
Im Embedded Matlab Function Block muss diese Funktion noch als extrinsic definiert werden, dann kann diese aufgerufen werden:
Vorsicht: Das ganze hat den Nachteil, dass sie deine Modellierung ziemlich herunterbremst, weil jedes Mal der Matlab-Interpreter aufgerufen wird. Deswegen rate ich grundsätzlich vom Verwenden der extrinsic-Funktionalität ab.
|
|
|
baustamm |
Themenstarter
Forum-Anfänger
|
|
Beiträge: 29
|
|
|
|
Anmeldedatum: 20.07.12
|
|
|
|
Wohnort: ---
|
|
|
|
Version: Matlab 2011b
|
|
|
|
|
|
Verfasst am: 20.07.2012, 16:11
Titel:
|
|
super danke! teste das am montag gleich mal!
mit dem runterbremsen ist natürlich schlecht, allerdings ist das ganze ein nichtlineares optimierungsproblem, da wird die "bremse" wahrscheinlich sowieso ganz wo anders liegen.. ;)
|
|
|
cybbi |
Forum-Fortgeschrittener
|
|
Beiträge: 84
|
|
|
|
Anmeldedatum: 23.08.11
|
|
|
|
Wohnort: ---
|
|
|
|
Version: Alle
|
|
|
|
|
|
Verfasst am: 23.07.2012, 09:52
Titel:
|
|
Übrigens noch ein Nachtrag, weil ich es gerade lese:
Du kannst in einem Matlab Function Block auch externen C / C++ Code aufrufen, ohne dass dieser erst in einer library kompiliert werden muss. Dazu gibts den Befehl
(Schau in die Doku rein, da stehen Beispiele drin)
|
|
|
baustamm |
Themenstarter
Forum-Anfänger
|
|
Beiträge: 29
|
|
|
|
Anmeldedatum: 20.07.12
|
|
|
|
Wohnort: ---
|
|
|
|
Version: Matlab 2011b
|
|
|
|
|
|
Verfasst am: 23.07.2012, 11:26
Titel:
|
|
|
|
|
das coder.ceval schau ich mir gleich mal an.
das einbinden der funktion hat soweit geklappt. nun ist der rueckgabewert out meiner funktion ein 1x1 struct, wie kann ich darauf einen wert auslesen.
in matlab wäre der befehl out.CONTROLS(1), wie wird denn die variable in simulink abgespeichert und wie greife ich auf diese zu?
edit: um genauer zu sein: bei out scheint es sich um ein mxArray zu handeln
out =
STATES: [51x5 double]
CONTROLS: [51x2 double]
PARAMETERS: [0x1 double]
DISTURBANCES: [51x2 double]
ALGEBRAICSTATES: [0x1 double]
CONVERGENCE_ACHIEVED: 1
und ich will genau den ersten wert von controls
scheinbar muss man die variable erst definieren. hab ich gemacht:
[code]s = struct('STATES', 'CONTROLS', 'PARAMETERS', 'DISTURBANCES',...
'ALGEBRAICSTATES','CONVERGENCE_ACHIEVED' )[/code]
trotzdem kommt folgender fehler:
MATLAB Function Interface Error: MATLAB expression 'active_damping_RUN' does not have the correct number of fields: expected 3; found 6. Block MATLAB Function (#41) While executing: none
wieso? habe doch sechs felder angegeben, wieso werden drei erwartet?
|
|
|
baustamm |
Themenstarter
Forum-Anfänger
|
|
Beiträge: 29
|
|
|
|
Anmeldedatum: 20.07.12
|
|
|
|
Wohnort: ---
|
|
|
|
Version: Matlab 2011b
|
|
|
|
|
|
Verfasst am: 23.07.2012, 12:49
Titel:
|
|
so funktioniert es, aber sieht ja schrecklich aus..
[code]a=zeros(51,5);
b=zeros(51,2);
c=zeros(0,1)
d=zeros(51,2)
e=zeros(0,1)
f=0;
s = struct('STATES',a, 'CONTROLS',b, 'PARAMETERS',c, 'DISTURBANCES',...
d, 'ALGEBRAICSTATES',e,'CONVERGENCE_ACHIEVED' ,f );
out = active_damping_RUN(1)
s=out;
y=s.CONTROLS(1,2); [/code]
gibt es noch eine andere möglichkeit? ist doch sehr unpraktisch wenn ich vorher schon die größen der vektoren festlegen muss..
ps wieso klappt das mit dem code einfügen nicht bei mir?
|
|
|
cybbi |
Forum-Fortgeschrittener
|
|
Beiträge: 84
|
|
|
|
Anmeldedatum: 23.08.11
|
|
|
|
Wohnort: ---
|
|
|
|
Version: Alle
|
|
|
|
|
|
Verfasst am: 23.07.2012, 14:23
Titel:
|
|
Hallo,
das ist eine Eigenschaft des Matlab-Function Blocks, dass man die Dimensionen der Eingänge und Ausgänge im Vorfeld festlegen muss. Grund ist der, dass der Code in C-Code übersetzt wird und automatisch eingebunden wird. Durch dieses Übersetzen ist es eben notwendig, die Dimensionen schon vorher zu wissen.
Beste Grüße
P.S.: So langsam ist der Punkt gekommen, an dem du vielleicht mal ein Beispielmodell uploaden solltest, damit wir dir noch vernünftig helfen können...
|
|
|
baustamm |
Themenstarter
Forum-Anfänger
|
|
Beiträge: 29
|
|
|
|
Anmeldedatum: 20.07.12
|
|
|
|
Wohnort: ---
|
|
|
|
Version: Matlab 2011b
|
|
|
|
|
|
Verfasst am: 23.07.2012, 19:18
Titel:
|
|
wenn das mit dem beispielmodell so einfach wäre.... :)
versuche das acado toolkit (http://www.acadotoolkit.org/) in simulink einzubetten und für meine zwecke zu benutzen. scheint aber nicht die nötige performance für eine echtzeitregelung zu bieten.
würde das gerne mal mit dem einbetten von c++ code ausprobieren aber ich befürchte, das ist nicht so einfach (keine ahnung wie man da die ein und ausgänge etc definiert aber versuche das mal die tage).
wenn ich coder.ceval benutze muss das der code dann trotzdem als mex file vorliegen oder nur als .cpp datei?
|
|
|
|
|
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.
|
|