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

Script aus MATLAB function ausführen

 

baustamm
Forum-Anfänger

Forum-Anfänger


Beiträge: 29
Anmeldedatum: 20.07.12
Wohnort: ---
Version: Matlab 2011b
     Beitrag Verfasst am: 20.07.2012, 11:01     Titel: Script aus MATLAB function ausführen
  Antworten mit Zitat      
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!
Private Nachricht senden Benutzer-Profile anzeigen


DSP
Forum-Meister

Forum-Meister



Beiträge: 2.117
Anmeldedatum: 28.02.11
Wohnort: ---
Version: R2014b
     Beitrag Verfasst am: 20.07.2012, 11:12     Titel:
  Antworten mit Zitat      
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.
Private Nachricht senden Benutzer-Profile anzeigen
 
baustamm
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 29
Anmeldedatum: 20.07.12
Wohnort: ---
Version: Matlab 2011b
     Beitrag Verfasst am: 20.07.2012, 12:18     Titel:
  Antworten mit Zitat      
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.
Private Nachricht senden Benutzer-Profile anzeigen
 
DSP
Forum-Meister

Forum-Meister



Beiträge: 2.117
Anmeldedatum: 28.02.11
Wohnort: ---
Version: R2014b
     Beitrag Verfasst am: 20.07.2012, 12:41     Titel:
  Antworten mit Zitat      
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 Wink
Private Nachricht senden Benutzer-Profile anzeigen
 
baustamm
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 29
Anmeldedatum: 20.07.12
Wohnort: ---
Version: Matlab 2011b
     Beitrag Verfasst am: 20.07.2012, 13:11     Titel:
  Antworten mit Zitat      
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!
Private Nachricht senden Benutzer-Profile anzeigen
 
cybbi
Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 84
Anmeldedatum: 23.08.11
Wohnort: ---
Version: Alle
     Beitrag Verfasst am: 20.07.2012, 14:37     Titel:
  Antworten mit Zitat      
Lösung:

In deinem Script eine Zeile ganz oben hinzufügen:

Code:

function myfunc
% Ab hier dann das restliche Skript...
 


Im Embedded Matlab Function Block muss diese Funktion noch als extrinsic definiert werden, dann kann diese aufgerufen werden:

Code:

coder.extrinsic('myfunc')
myfunc;
 


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.
Private Nachricht senden Benutzer-Profile anzeigen
 
baustamm
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 29
Anmeldedatum: 20.07.12
Wohnort: ---
Version: Matlab 2011b
     Beitrag Verfasst am: 20.07.2012, 16:11     Titel:
  Antworten mit Zitat      
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.. ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
cybbi
Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 84
Anmeldedatum: 23.08.11
Wohnort: ---
Version: Alle
     Beitrag Verfasst am: 23.07.2012, 09:52     Titel:
  Antworten mit Zitat      
Ü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

Code:
coder.ceval


(Schau in die Doku rein, da stehen Beispiele drin)
Private Nachricht senden Benutzer-Profile anzeigen
 
baustamm
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 29
Anmeldedatum: 20.07.12
Wohnort: ---
Version: Matlab 2011b
     Beitrag Verfasst am: 23.07.2012, 11:26     Titel:
  Antworten mit Zitat      
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?
Private Nachricht senden Benutzer-Profile anzeigen
 
baustamm
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 29
Anmeldedatum: 20.07.12
Wohnort: ---
Version: Matlab 2011b
     Beitrag Verfasst am: 23.07.2012, 12:49     Titel:
  Antworten mit Zitat      
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?
Private Nachricht senden Benutzer-Profile anzeigen
 
cybbi
Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 84
Anmeldedatum: 23.08.11
Wohnort: ---
Version: Alle
     Beitrag Verfasst am: 23.07.2012, 14:23     Titel:
  Antworten mit Zitat      
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... Smile
Private Nachricht senden Benutzer-Profile anzeigen
 
baustamm
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 29
Anmeldedatum: 20.07.12
Wohnort: ---
Version: Matlab 2011b
     Beitrag Verfasst am: 23.07.2012, 19:18     Titel:
  Antworten mit Zitat      
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?
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.