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

Matlab GUI mit Simulink Model verbinden

 

guguli
Forum-Century

Forum-Century


Beiträge: 166
Anmeldedatum: 04.04.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 08.05.2013, 17:05     Titel: Matlab GUI mit Simulink Model verbinden
  Antworten mit Zitat      
Halo zusammen,

ich hab schon in der Forum gesucht und das einziege was ich zu meinem Problem gefunden habe ist die beide Befehle Sim() und set_param(). aber ich kann mit den beiden nichts anfangen und weiss absolut nicht wo ich was einsetzen soll.

ICh schildere mein Problem:

Ich will vo GUI aus die werte des Simulink Modells verändern bzw. setzen.

beim erzeigen eines Textfeldes In der GUI werden ja die erzeugt
Code:
function kraft_Callback(hObject, eventdata, handles)
function kraft_CreateFcn(hObject, eventdata, handles)


nun will ich wenn ich das eine Zahl eintippe, wenn GUI gestartet ist, diese Zahl dann in Simulink übernehmen wird. Könnt ihr mir pls helfen. Ich hab noch nie sowas gemacht und ein Beispiel würde mich echt sehr helfen.

THX
Private Nachricht senden Benutzer-Profile anzeigen


Bluesmaster
Forum-Century

Forum-Century



Beiträge: 203
Anmeldedatum: 13.11.11
Wohnort: Gera
Version: 2012a
     Beitrag Verfasst am: 08.05.2013, 20:58     Titel:
  Antworten mit Zitat      
Puh, ich kann natürlich jetzt nicht komplett erklären wie man eine
GUI baut, dafür gibts Anleitungen:

http://www.mathworks.com/discovery/matlab-gui.html


Aber ganz kurz das Prinzip:

1. Du brauchst Textfelder die Erzeugt man mit "uicontrol"
2. Du brauchst Reaktionen auf Eingaben sogenannte Callbacks
3. Du lässt den Callback den Wert des Textfeldes in eine Variable speichern
4. Du verwendest diese Variable einfach in Simulink (sim-Befehl)


Code:
f = figure
c = uicontrol( 'Style' , 'edit' , 'Callback' , @(o,e) assignin( 'base' , 'zielvariable' , str2num( get( o , 'String' ))' ))



Der Callback von diesem Textfeld (edit) ist etwas kompliziert zu erklären.
Es geht darum, das in matlab (und auch in anderen Programmiersprachen)
jede Variable nur in einem gewissen "Workspace" existiert.
Der Standard-Matlab-Workspace ist "Base" wird für Skripte und die
Konsole verwendet.

Funktionen wie so ein Callback haben einen eigenen.
Sobald die Funktion durchglaufen ist, ist die Variable weg.
Deswegen schaufeln wir die Variable rüber in den Baseworkspace
mit "assignin"

das ..."@(o,e) Befehl" ... ist eine besondere Art von Funktion,
die man so kompakt überall hinschreiben können ohne extra
ein File anzulegen ( sogn. Anonymus-Fcn)

Für den Einstieg sollte das hoffentlich helfe


Gruß

Blues
Private Nachricht senden Benutzer-Profile anzeigen
 
guguli
Themenstarter

Forum-Century

Forum-Century


Beiträge: 166
Anmeldedatum: 04.04.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 10.05.2013, 11:09     Titel:
  Antworten mit Zitat      
Danke für die antwort.

zu 3. Du lässt den Callback den Wert des Textfeldes in eine Variable speichern :

meinste das etwa so???
Code:
handles.kraft = str2double(get(hObject,'String'));
guidata(hObject,handles);
Private Nachricht senden Benutzer-Profile anzeigen
 
Bluesmaster
Forum-Century

Forum-Century



Beiträge: 203
Anmeldedatum: 13.11.11
Wohnort: Gera
Version: 2012a
     Beitrag Verfasst am: 10.05.2013, 11:33     Titel:
  Antworten mit Zitat      
Kann man so machen ja.

Wichtig ist, dass dein simulinkmodell an die Variable "herakommt"

also dass der "sim"-Befehl im gleichen Workspace aufgerufen
wird in der sich auch handles.kraft befindet.

Ich persönlich arbeite nicht mit der "handles"-struktur, das ist
mehr was wenn du mit GUIDE arbeitest, aber es geht auch.


Im Simulink-Modell muss dein Block dann eben auf handles.kraft
zugreifen


Gruß

Blues
Private Nachricht senden Benutzer-Profile anzeigen
 
guguli
Themenstarter

Forum-Century

Forum-Century


Beiträge: 166
Anmeldedatum: 04.04.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 10.05.2013, 11:39     Titel:
  Antworten mit Zitat      
eine Frage zu dem Simulink Modell, gibt es für simulink auch eine .m file??? wo ich dann den zugrif auf handles.kraft programmieren kann???

Oder was meinste mit "Im Simulink-Modell muss dein Block dann eben auf handles.kraft zugreifen " ????
Private Nachricht senden Benutzer-Profile anzeigen
 
guguli
Themenstarter

Forum-Century

Forum-Century


Beiträge: 166
Anmeldedatum: 04.04.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 10.05.2013, 12:49     Titel:
  Antworten mit Zitat      
Also hab glaub ich etwas gefunden: und zwar mit to workspace kann ich das machen.

Also ich hab das so gemacht.
Code:

function kraft_Callback(hObject, eventdata, handles)

kraft_value = str2num(get(hObject,'String'));

if (isempty(kraft_value))
     set(hObject,'String','0')
end
guidata(hObject, handles);

function flaeche_Callback(hObject, eventdata, handles)
flaeche_value = str2num(get(hObject,'String'));

if (isempty(flaeche_value))
     set(hObject,'String','0')
end
guidata(hObject, handles);

%startbutton
function start_Callback(hObject, eventdata, handles)

kraft_value = str2num(get(handles.kraft_editext,'String'));
flaeche_value = str2num(get(handles.flaeche_editext,'String'));

set_param('object','Value',num2str(kraft_value));
set_param('object','Value',num2str(flaeche_value));


set(handles.static_text4,'String',spannung);


guidata(hObject, handles);

function static_text4_CreateFcn(hObject, eventdata, handles)

 


ich weiss allerdings nicht was ich beim set_param(...) für dasobjekt setzen soll. Welches Object muss darein?
Private Nachricht senden Benutzer-Profile anzeigen
 
guguli
Themenstarter

Forum-Century

Forum-Century


Beiträge: 166
Anmeldedatum: 04.04.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 10.05.2013, 13:39     Titel:
  Antworten mit Zitat      
hab das jetzt so geändert,
Code:

function start_Callback(hObject, eventdata, handles)

k = str2num(get(handles.kraft,'String'));
f = str2num(get(handles.flaeche,'String'));

set_param('Steifigkeit/k','String',num2str(k));
set_param('Steifigkeit/f','String',num2str(f));

set(handles.static,'String',spannung);

guidata(hObject, handles);
 


und kriege diese Fehlermeldung:
Code:

Error using feval
Undefined function 'text4_CreateFcn' for input arguments of type 'double'.

Error in gui_mainfcn (line 96)
        feval(varargin{:});

Error in Gui (line 42)
    gui_mainfcn(gui_State, varargin{:});

Error in @(hObject,eventdata)Gui('text4_CreateFcn',hObject,eventdata,guidata(hObject))

 
Error using struct2handle
Error while evaluating uicontrol CreateFcn

Error using Gui>start_Callback (line 264)
Invalid Simulink object name: Steifigkeit/k

Error in gui_mainfcn (line 96)
        feval(varargin{:});

Error in Gui (line 42)
    gui_mainfcn(gui_State, varargin{:});

Error in @(hObject,eventdata)Gui('start_Callback',hObject,eventdata,guidata(hObject))

 
Error while evaluating uicontrol Callback
 
Private Nachricht senden Benutzer-Profile anzeigen
 
guguli
Themenstarter

Forum-Century

Forum-Century


Beiträge: 166
Anmeldedatum: 04.04.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 10.05.2013, 15:05     Titel:
  Antworten mit Zitat      
die Fehlermeldung wa einfach hab ich behoben. Aber ich verstehe das mit set_param nicht. ich weiss nicht welche parameter ich da rein schreiben soll?

kann mir das einer in einfachen wörten erklären???
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 10.05.2013, 22:09     Titel:
  Antworten mit Zitat      
Hallo,

ich würde set_param hier gar nicht erst verwenden.
Den gewünschten Parameter in dem Block als Variable eintragen und dann von der GUI bzw. dem Callback aus die Variable ändern.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Bluesmaster
Forum-Century

Forum-Century



Beiträge: 203
Anmeldedatum: 13.11.11
Wohnort: Gera
Version: 2012a
     Beitrag Verfasst am: 11.05.2013, 11:48     Titel:
  Antworten mit Zitat      
so hatte ich das eigentlich auch gemeint.

einfach dort wo du in einen Simulink-Block von Hand eine
Zahl eintragen kannst die Variable eintragen.

Nicht schieben, sondern das Modell holt sich die Variable
aus dem gleichen Workspace

Gruß

Blues
Private Nachricht senden Benutzer-Profile anzeigen
 
guguli
Themenstarter

Forum-Century

Forum-Century


Beiträge: 166
Anmeldedatum: 04.04.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 11.05.2013, 15:52     Titel:
  Antworten mit Zitat      
ich hab schon alles ausprobiert aber irgendwie das erkennt mein parameter nicht, beim set_param().

ich schick ma mein simulink model und mein .m file

und mein code ist :

Code:

function varargout = Gui(varargin)

gui_Singleton = 1;
gui_State = struct('gui_Name',       mfilename, ...
                   'gui_Singleton',  gui_Singleton, ...
                   'gui_OpeningFcn', @Gui_OpeningFcn, ...
                   'gui_OutputFcn',  @Gui_OutputFcn, ...
                   'gui_LayoutFcn',  [] , ...
                   'gui_Callback',   []);
if nargin && ischar(varargin{1})
    gui_State.gui_Callback = str2func(varargin{1});
end

if nargout
    [varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});
else
    gui_mainfcn(gui_State, varargin{:});
end


% --- Executes just before Gui is made visible.
function Gui_OpeningFcn(hObject, eventdata, handles, varargin)


% Choose default command line output for Gui
handles.output = hObject;

% Update handles structure
guidata(hObject, handles);

% UIWAIT makes Gui wait for user response (see UIRESUME)
% uiwait(handles.figure1);


% --- Outputs from this function are returned to the command line.
function varargout = Gui_OutputFcn(hObject, eventdata, handles)


% Get default command line output from handles structure
varargout{1} = handles.output;


function kraft_Callback(hObject, eventdata, handles)

kraft_value = str2num(get(hObject,'String'));

if (isempty(kraft_value))
     set(hObject,'String','0')
end
guidata(hObject, handles);

% --- Executes during object creation, after setting all properties.
function kraft_CreateFcn(hObject, eventdata, handles)

if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
    set(hObject,'BackgroundColor','white');
end


function flaeche_Callback(hObject, eventdata, handles)
flaeche_value = str2num(get(hObject,'String'));

if (isempty(flaeche_value))
     set(hObject,'String','0')
end
guidata(hObject, handles);

% --- Executes during object creation, after setting all properties.
function flaeche_CreateFcn(hObject, eventdata, handles)

if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
    set(hObject,'BackgroundColor','white');
end


% --- Executes on button press in start.
function start_Callback(hObject, eventdata, handles)

k = str2num(get(handles.kraft,'String'));
f = str2num(get(handles.flaeche,'String'));

set_param('Steifigkeit\kk','kraft',num2str(k));
set_param('Steifigkeit\f','flaeche',num2str(f));

set(handles.static,'String',spannung);

guidata(hObject, handles);


% --- Executes during object creation, after setting all properties.
function static_CreateFcn(hObject, eventdata, handles)

 



ich krieg diese Fehlermeldung

Invalid Simulink object name: Steifigkeit\kk

Steifigkeit.mdl
 Beschreibung:

Download
 Dateiname:  Steifigkeit.mdl
 Dateigröße:  29.34 KB
 Heruntergeladen:  349 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
Bluesmaster
Forum-Century

Forum-Century



Beiträge: 203
Anmeldedatum: 13.11.11
Wohnort: Gera
Version: 2012a
     Beitrag Verfasst am: 11.05.2013, 16:14     Titel:
  Antworten mit Zitat      
genau so sollst es ja nicht machen.


set_param schiebt den Wert in das Simulinkmodell wie du
ihn per Hand eintragen würdest.

Wenn du dort gleich eine Variable einträgst dann holt
sich das Modell den Wert aus der Variable bei jedem Durchgang ab.

Das ist ja der Sinn einer Variable, dass du in dem Moment wo du
das Modell baust den Wert noch nicht kennst.


Wenn du es aber unbedingt so machen willst dann lautet die
Korrekte Syntax:

Code:
set_param( 'Steifigkeit/kraft'  ,'Value' , num2str( k ) )



Aber wie gesagt, das ist kein gutes Design, wenn du z.B. später
den Wert noch von einer anderen Stelle aus änder willst musst
du ihn von dort aus auch schieben. Und dann wird es
beim debuggen schwieriger zu ermitteln wo der Wert her kam....

Gruß

Blues
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 11.05.2013, 16:28     Titel:
  Antworten mit Zitat      
Hallo,

warum bestehst du denn darauf, set_param zu verwenden statt (wie von bluesmaster und mir vorgeschlagen) die Variable im Workspace zu setzen? Das wäre deutlich einfacher.

Wenn du unbedingt set_param verwenden willst, musst du dich an die vorgeschriebene Syntax halten und vor allem die richtigen Blockparameter ansprechen.
http://www.mathworks.de/de/help/sim.....tml#sources_lib_blkparams

Richtig wäre also:
Code:
set_param('Steifigkeit/kraft','Value', num2str(k));


Grüße,
Harald

Edit: leider Beitrag von blues zu spät gesehen. Aber schön, dass wir uns einig sind :)
Private Nachricht senden Benutzer-Profile anzeigen
 
guguli
Themenstarter

Forum-Century

Forum-Century


Beiträge: 166
Anmeldedatum: 04.04.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 11.05.2013, 16:50     Titel:
  Antworten mit Zitat      
also ich will das so machen, weil ich es so gelesen habe. Wie gesagt, ich bin ein NEwbie und hab nicht viel Erfahrung mit malab simulink und GUI. und versuch im ersten Mom alles was mich weiter bringt. Smile

Ich will aber das auch schön machen. aslo ih rmeint es ist schöner die Variable in workspace zu speichern?!

und wie würde ich denn in meinem Fall jetzt das machen?????


Smile
THX
Private Nachricht senden Benutzer-Profile anzeigen
 
guguli
Themenstarter

Forum-Century

Forum-Century


Beiträge: 166
Anmeldedatum: 04.04.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 11.05.2013, 16:58     Titel:
  Antworten mit Zitat      
also muss ich denn so etwas machen??

Code:

kraft = str2double(get(hObject,'string'));
flaeche = str2double(get(hObject,'string'));

handles.metricdata.concs = kraft;
guidata(hObject,handles)
kraft= handles.metricdata.kraft;

handles.metricdata.concs = flaeche;
guidata(hObject,handles)
flaeche= handles.metricdata.flaeche;

uisave({'kraft' , 'flaeche' },filename);
 


für "filename" kommt dann in meinem Fall Steifigkeit???!
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen

Gehe zu Seite 1, 2  Weiter

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.