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

Verknüpfung zwischen Skript, Funktion und Simulink-Modell

 

Waldemar
Forum-Century

Forum-Century


Beiträge: 100
Anmeldedatum: 14.10.11
Wohnort: Neuss
Version: R2011b
     Beitrag Verfasst am: 21.01.2013, 13:54     Titel: Verknüpfung zwischen Skript, Funktion und Simulink-Modell
  Antworten mit Zitat      
Hallo,

ich komme an meinem momentan Problem nicht weiter!!

Ich denke, dass es mit verschiedenen Arbeitsspeichern, lokalen Variablen etc. zu tun.

Da ich allerdings bislang keinen Kontakt zu diesem Thema hatte, komme ich momentan überhaupt nicht weiter, so dass ich um eure Hilfe bitte.

Also ich möchte mit einem Skript:
Code:
optopt= optimset('Display','iter');
[x, fval, exitflag]=fmincon(@xy_Regelung,[10;10;10],[],[],[],[],[],[],@xy_NB,optopt);


die Eingangsgrößen eines Simulinkmodells optimieren, so dass die Ausgangsgröße des Simulink-Modells minimal wird! (Als Bsp. habe ich das genommen, das unter "doc fmincon" zu finden ist! Siehe Anhang!)

Die Funktion die zu optimieren ist, in meinem Fall das Simulink-Modell, ist in xy_Regelung ausgegliedert:
Code:

% Variante1:
% function f = myfun(x)
% f = -x(1) * x(2) * x(3);

% Variante2:
function y = xy_Regelung(x)
MDLsim  = 'xy';
open(MDLsim);
set_param('xy','SimulationCommand','start');
pause(5)
Ausgang=Regelguete_ges.signals.values;
y=Ausgang(end);


und die Nebenbedinungen stehen in xy_NB:
Code:
function [c,ceq] = xy_NB(x)

c=[-x(1)-2*x(2)-2*x(3);x(1)+2*x(2)+2*x(3)-72];
ceq=[];
.

Wenn das Ganze mit der Varainte1 laufen lasse, funktioniert das Ganze. Wenn ich die Variante2 versuche, kommen folgende Fehlermeldungen:
Code:
Undefined variable "Regelguete_ges" or class "Regelguete_ges.signals.values".

Error in xy_Regelung (line 25)
Ausgang=Regelguete_ges.signals.values;
.
Dazu kommt, dass Simulink nicht läuft, weil die Eingänge unbekannt sind (In den Eingängen habe ich x(1), x(2) und x(3) geschrieben).

Wenn ich xy_Regelung nicht als Funktion, sondern als Skript ausführe:
Code:

x=[10;10;10];
MDLsim  = 'xy';
open(MDLsim);
set_param('xy','SimulationCommand','start');

pause(5)

Ausgang=Regelguete_ges.signals.values; % Funktioniert mit Regelguete_ges to Workspace!!
y=Ausgang(end);

läuft es durch.

Ist ja nicht so, dass ich nicht versuche selber drauf zu kommen, aber ich komm überhaupt nicht weiter.

Wäre über konkretes Beispiel, wie ich die Eingangsgrößen, kommen ja aus dem Skript, an das Modell weiterführen kann oder wie ich die Ausgangsgröße vom Modell zum Skript bekomme!!

Vielen Dank.

MfG, Waldemar

PS: Der angestrebte Aufbau resultiert aus meinem eigentlich Fall.

xy.mdl
 Beschreibung:

Download
 Dateiname:  xy.mdl
 Dateigröße:  31.54 KB
 Heruntergeladen:  325 mal

_________________

Im "ich brauch Hilfe"-Status
Private Nachricht senden Benutzer-Profile anzeigen


Waldemar
Themenstarter

Forum-Century

Forum-Century


Beiträge: 100
Anmeldedatum: 14.10.11
Wohnort: Neuss
Version: R2011b
     Beitrag Verfasst am: 21.01.2013, 16:32     Titel:
  Antworten mit Zitat      
Hallo,

habe es mal mit assignin probiert:
Code:

x=[10;10;10]; % Eingefügt, um mich erstmal mit der Ausgangsseite zu befassen!
optopt= optimset('Display','iter');
[x, fval, exitflag]=fmincon(@xy_Regelung,[10;10;10],[],[],[],[],[],[],@xy_NB,optopt);


Code:

function y = xy_Regelung(x)

MDLsim  = 'xy';
open(MDLsim);
set_param('xy','SimulationCommand','start');

pause(10)

assignin('base','Ausgang',Regelguete_ges.signals.values);
% Ausgang=Regelguete_ges.signals.values;

length_Ausgang=length(Ausgang);
y=Ausgang(length_Ausgang);

 


aber der Fehler blieb der Gleiche.

Hab es mal mit dem debugger probiert (Brackpiont in die Zeile von assignin gesetzt) und dabei fiel mir auf, dass Regelguete_ges nach dem Durchlaufen des Simulink-Modells gar nicht in den 'base'-Workspace übergeben wurde!?
Anstelle 'base' habe ich 'caller' probiert, aber auch keine Verbesserung!
Wie kann ich denn nun in einer functionfile auf Werte des Simulink-Modells zu greifen, wenn diese - nach Beendigung der Simulation - nicht im 'base' workspace stehen?

bin ratlos.

MfG, Waldemar


PS:
Wenn ich xy_Regelung nicht als functionfile, sondern als Skript ausführe,
Code:

x=[10;10;10];
% function y = xy_Regelung(x)

MDLsim  = 'xy';
open(MDLsim);
set_param('xy','SimulationCommand','start');

pause(10)

assignin('base','Ausgang',Regelguete_ges.signals.values);
% Ausgang=Regelguete_ges.signals.values;
 
length_Ausgang=length(Ausgang);
y=Ausgang(length_Ausgang);

 

kann ich sofort nach dem Durchlaufen des Simulationsmodells auf Regelguete_ges zu greifen!
Muss doch auch gehen, wenn xy_Regelung eine functionfile ist!!
_________________

Im "ich brauch Hilfe"-Status

Zuletzt bearbeitet von Waldemar am 21.01.2013, 16:44, insgesamt einmal bearbeitet
Private Nachricht senden Benutzer-Profile anzeigen
 
LittleX
Forum-Guru

Forum-Guru


Beiträge: 494
Anmeldedatum: 14.05.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 21.01.2013, 16:42     Titel:
  Antworten mit Zitat      
Hallo,

wie Du richtig vermutet hast, hast Du ein Problem mit unterschiedlichen Workspaces.
Das Simulink Modell erwartet die Parameter im sogenannten Base Workspace. Wenn Du vom Command Window ein Skript ausführst, werden die Veriablen in diesem Workspace angelegt.

In Deiner Variante 2 hast Du nun eine Funktion, die einen eigenen Workspace hat und dort sind die Variablen für das Modell nicht sichtbar.

Mögliche Lösungen:
1. Angabe des SrcWorkspace für das Modell (klappt aber nur, wenn Du sim verwendest anstellen von set_param und SimulationCommand 'start')
Code:

sim('xy','SrcWorkspace','Current')
 


2. Verwenden von assignin oder evalin um von der Funktion aus die Daten im Base Workspace anzulegen.
Code:

assignin('base','x',[10,10,10]);
 


3. Anlegen der Variable im Model-Workspace
Code:

hws = get_param(bdroot, 'modelworkspace');
hws.assignin('xy',[10,10,10])
 


Viele Grüße,

LittleX
Private Nachricht senden Benutzer-Profile anzeigen
 
Waldemar
Themenstarter

Forum-Century

Forum-Century


Beiträge: 100
Anmeldedatum: 14.10.11
Wohnort: Neuss
Version: R2011b
     Beitrag Verfasst am: 21.01.2013, 17:56     Titel:
  Antworten mit Zitat      
Hallo,

@LittleX: Danke für deine Antwort. Das Simulink-Modell nimmt schonmal die richtigen Eingangsgrößen!

Jetzt bleibt nur noch, dass das functionfile die Ausgangsgrößen des Simulink-Modells nutzen kann!

Bisher...

Bsp.:
Code:

optopt= optimset('Display','iter');
[x, fval, exitflag]=fmincon(@xy_Regelung,[10;10;10],[],[],[],[],[],[],@xy_NB,optopt);


Code:

function y = xy_Regelung(x)

simOut=sim('xy','SrcWorkspace','current','SaveOutput','on','OutputSaveName','youtNew');
                                                                                 
pause(10)
%%Klappt nicht!
simOutVars = simOut.who;
yout = simOut.get('youtNew');

length_yout=length(yout);
y=yout(length_yout);
%%Klappt nicht!
 


...aber klappt noch nicht!

MfG,

Waldemar
_________________

Im "ich brauch Hilfe"-Status
Private Nachricht senden Benutzer-Profile anzeigen
 
Waldemar
Themenstarter

Forum-Century

Forum-Century


Beiträge: 100
Anmeldedatum: 14.10.11
Wohnort: Neuss
Version: R2011b
     Beitrag Verfasst am: 21.01.2013, 22:21     Titel:
  Antworten mit Zitat      
War das ein Krampf!!

Läuft aber jetzt!

Meine Lsg:

Code:
% Entweder mit A und b (Variante1) oder über @NB (Variante2):
% Variante1:
A = [-1 -2 -2;1  2  2];
b = [0;72];
optopt= optimset('Display','iter');
[x, fval, exitflag]=fmincon(@xy_Regelung,[10;10;10],A,b,[],[],[],[],[],optopt);

% Variante2:
% optopt= optimset('Display','iter');
% [x, fval, exitflag]=fmincon(@xy_Regelung,[10;10;10],[],[],[],[],[],[],@xy_NB,optopt);


Code:

function y = xy_Regelung(x)
simOut=sim('xy','SrcWorkspace','current','SaveOutput','on','OutputSaveName','youtNew');
pause(7)
simOutVars = simOut.who;
yout = simOut.get('youtNew');
length_yout=length(yout);
y=yout(length_yout);


Code:
function [c,ceq] = xy_NB(x)

c=[-x(1)-2*x(2)-2*x(3);x(1)+2*x(2)+2*x(3)-72];
ceq=[];

 


S.-Modell im Anhang.

Danke für die Hilfe.

MfG, Waldemar

xy.mdl
 Beschreibung:

Download
 Dateiname:  xy.mdl
 Dateigröße:  31.38 KB
 Heruntergeladen:  298 mal

_________________

Im "ich brauch Hilfe"-Status
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 - 2025 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.