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

Fehler bei Grafikübergabe von Skript zu GUI

 

hosti
Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 83
Anmeldedatum: 08.09.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 23.03.2012, 10:36     Titel: Fehler bei Grafikübergabe von Skript zu GUI
  Antworten mit Zitat      
Hallo Leute,

schreibe mein erstes GUI mit dem Guide.
Es werden Werte vom GUI (ein paar fixe und ein paar die selbst eingegeben werden) an ein Skript übergeben.

Code:

% --- Executes on button press in Berechnung.
function Berechnung_Callback(hObject, eventdata, handles)
% hObject    handle to Berechnung (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)

fs_entries = get(handles.fs,'String');
fsSelected = get(handles.fs,'Value');
fs = fs_entries{fsSelected(1)};

set(handles.fres1,'String',handles.fres2,'String',...
    TF_KH2_GUI(str2double(get(handles.m_K,'String')),...
    str2double(get(handles.m_A,'String')),...
    str2double(get(handles.c1,'String')),...
    str2double(get(handles.c2,'String')),...
    str2double(get(handles.d1,'String')),...
    str2double(get(handles.d2,'String')),...
    str2double(get(handles.tmax,'String')),...
    str2double(fs),...
    str2double(get(handles.f1,'String')),...
    str2double(get(handles.f2,'String'))));
 



Im Skript werden damit Berechnungen durchgeführt. Es sollen nun die Ergebnisse, 2 Grafiken (Axes) und 2 Werte (fres1, und fres2), in die GUI vom Skript zurück übergeben werden.

Code:

function [fres1, fres2] = TF_KH2_GUI(m_K, m_A, c1, c2, d1, d2, tmax, fs, f1, f2)

...

%% DIE GRAFIKEN

% Plot Frequenzgang
tf = findobj(KH2_GUI,'Type','axes','Tag','tf');
axes(tf)
zoom on
loglog(wfs/(2*pi),abs(h));
xlim([f1 f2]);
xlabel('Frequenz [Hz]');
ylabel('Magnitude');
grid on;


% Plot Übertragungsfunktionen (lin) und Systemantwort
sv = findobj(KH2_GUI,'Type','axes','Tag','sv');
axes(sv)
zoom on
plot(t,abs(h),'r','LineWidth',2);
hold on;
plot(t,y,'--','LineWidth',0.5)
hold off;
xlabel('t/sec');
grid on;
legend('Frequenzgang','Systemantwort nach Frequenz-Sweep Anregung');
 


Dabei treten 2 Fehler auf:

1) Die Grafiken werden nach Ausführung der GUI zwar in den Axes übertragen und angezeigt, aber wenn ich mehrere Durchläufe nacheinander durchführen möchte, bekomme ich IMMER bei dem 3ten Durchlauf folgende Fehlermeldung. Kann mir das nicht erklären warum es bei den ersten 2 Durchläufen funktioniert und dann nicht mehr?

Code:

??? Error using ==> axes
Invalid object handle

Error in ==> TF_KH2_GUI at 86
axes(sv)

Error in ==> KH2_GUI>Berechnung_Callback at 86
set(handles.fres1,'String',handles.fres2,'String',...

Error in ==> gui_mainfcn at 96
        feval(varargin{:});

Error in ==> KH2_GUI at 42
    gui_mainfcn(gui_State, varargin{:});

Error in ==>
@(hObject,eventdata)KH2_GUI('Berechnung_Callback',hObject,eventdata,guidata(hObject))

 
??? Error while evaluating uicontrol Callback
 


2) Der Wert für fres1 wird ganz normal zurückgegeben und in der GUI angezeigt, aber der Wert für fres2 nicht. Müsste aber doch gleich funktionieren, oder?

Habe die Dateien angefügt. Dass es wahrscheinlich nicht sauber programmiert ist, ist mir bewußt. Vielleicht könnt ihr mir weiter helfen.

lg
hosti

TF_KH2_GUI.m
 Beschreibung:

Download
 Dateiname:  TF_KH2_GUI.m
 Dateigröße:  2.25 KB
 Heruntergeladen:  335 mal
KH2_GUI.m
 Beschreibung:

Download
 Dateiname:  KH2_GUI.m
 Dateigröße:  17.47 KB
 Heruntergeladen:  325 mal
KH2_GUI.fig
 Beschreibung:

Download
 Dateiname:  KH2_GUI.fig
 Dateigröße:  10.39 KB
 Heruntergeladen:  382 mal
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


Beiträge: 24.495
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 23.03.2012, 19:44     Titel:
  Antworten mit Zitat      
Hallo,

als allererstes würde ich den Aufruf mal entschachteln. Vielleicht wird dann schon klarer, was das Problem ist.

Der Debugger könnte auch helfen.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
hosti
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 83
Anmeldedatum: 08.09.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 26.03.2012, 09:54     Titel:
  Antworten mit Zitat      
Hallo,

habe den Aufruf entschachtelt. Daran ist es aber vorerst mal nicht gelegen.
Das erste Problem mit der Fehlermeldung bei axes(sv) ist erstmal gelöst. Anscheinend hat das Programm hier Probleme mit den hold on und hold off befehlen gehabt. Jedenfalls wenn ich den hold off Befehl weglasse, kann das Programm nun beliebig oft hintereinander durchgeführt werden. Damit er mir dann aber nicht die Grafen immer übereinander zeichnet habe ich in der Callback Function ein cla eingefügt. Somit werden die vorigen axes vor einer neuen Darstellung immer gelöscht.

Code:

% --- Executes on button press in Berechnung.
function Berechnung_Callback(hObject, eventdata, handles)
% hObject    handle to Berechnung (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)

cla   % löscht die vorigen Axes

fs_entries = get(handles.fs,'String');
fsSelected = get(handles.fs,'Value');
fs_str = fs_entries{fsSelected(1)};

m_K = str2double(get(handles.m_K,'String'));
m_A = str2double(get(handles.m_A,'String'));
c1 = str2double(get(handles.c1,'String'));
c2 = str2double(get(handles.c2,'String'));
d1 = str2double(get(handles.d1,'String'));
d2 = str2double(get(handles.d2,'String'));
tmax = str2double(get(handles.tmax,'String'));
fs = str2double(fs_str);
f1 = str2double(get(handles.f1,'String'));
f2 = str2double(get(handles.f2,'String'));

set(handles.fres1,'String',...
    handles.fres2,'String',...
    TF_KH2_GUI(m_K, m_A, c1, c2, d1, d2, tmax, fs, f1, f2));
 


Code:

function [fres1, fres2] = TF_KH2_GUI(m_K, m_A, c1, c2, d1, d2, tmax, fs, f1, f2)

...

% DIE GRAFIKEN

% Plot Frequenzgang
tf = findobj(KH2_GUI,'Type','axes','Tag','tf');
axes(tf)
zoom on
loglog(wfs/(2*pi),abs(h));
xlim([f1 f2]);
xlabel('Frequenz [Hz]');
ylabel('Magnitude');
grid on;


% Plot Übertragungsfunktion
sv = findobj(KH2_GUI,'Type','axes','Tag','sv');
axes(sv)
zoom on
plot(t,abs(h),'r','LineWidth',2);
hold on;
plot(t,y,'--','LineWidth',0.5)
% hold off;
xlabel('t/sec');
grid on;
legend('Frequenzgang','Systemantwort nach Frequenz-Sweep Anregung');
 



Das 2te Problem hab ich noch nicht lösen können. Weiterhin bekomme ich vom Skript nur fres1 als Rückgabewert und fres2 nicht. Es existieren aber beide Variablen im Skript. Habe auch mit dem Debugger nichts finden können.

lg
hosti
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.495
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 26.03.2012, 10:12     Titel:
  Antworten mit Zitat      
Hallo,

du rufst deine Funktion implizit mit einem Rückgabeparameter auf.

Ich kann nur raten, was du mit diesem Befehl überhaupt erreichen willst:
Code:
set(handles.fres1,'String',...
    handles.fres2,'String',...
    TF_KH2_GUI(m_K, m_A, c1, c2, d1, d2, tmax, fs, f1, f2));


Empfehlung ist, das zu entschachteln:
Code:
[f1, f2] = TF_KH2_GUI(m_K, m_A, c1, c2, d1, d2, tmax, fs, f1, f2);
set(handles.fres1,'String',...)
set(handles.fres2,'String',...)


Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
hosti
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 83
Anmeldedatum: 08.09.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 26.03.2012, 14:39     Titel:
  Antworten mit Zitat      
Mit diesem Befehl möchte ich einfach zwei berechnete Werte aus dem aufgerufenem Skript (TF_KH2_GUI.m) wieder zurück in das GUI übergeben. Diese Werte sollen in einem Static Text Feld in der .fig angezeigt werden. [nicht vom GUI im Dateinamen verwirren lassen, ist kein Skript zu einem GUI, sondern diese wird vom GUI aufgerufen]

Wenn ich nur einen Wert auslese mit
Code:

set(handles.fres1,'String',...
    TF_KH2_GUI(m_K, m_A, c1, c2, d1, d2, tmax, fs, f1, f2));
 


dann funktioniert das. Bei zwei nicht mehr. Was kann man da anders machen?
Private Nachricht senden Benutzer-Profile anzeigen
 
Winkow
Moderator

Moderator



Beiträge: 3.842
Anmeldedatum: 04.11.11
Wohnort: Dresden
Version: R2014a 2015a
     Beitrag Verfasst am: 26.03.2012, 14:43     Titel:
  Antworten mit Zitat      
Zitat:
Was kann man da anders machen?

das was harald gesagt hat
Private Nachricht senden Benutzer-Profile anzeigen
 
hosti
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 83
Anmeldedatum: 08.09.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 26.03.2012, 15:14     Titel:
  Antworten mit Zitat      
Ja alles klar. Sollte doch etwas genauer lesen. Embarassed
Hatte noch einen Programmierfehler drinnen, aber jetzt funktionierts!

Danke Harald!

lg
hosti
Private Nachricht senden Benutzer-Profile anzeigen
 
hosti
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 83
Anmeldedatum: 08.09.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 27.03.2012, 12:49     Titel:
  Antworten mit Zitat      
Sorry dass ich den geschlossenen Beutrag wieder eröffne, aber mir ist noch ein Problem untergekommen, wo ich einfach nicht drauf komme.

Ich habe in meinem GUI ja mehrere Edit Felder. Diese sollen vom User auch alle ausgefüllt werden, deswegen möchte ich eine Abfrage machen, ob ein Edit Feld leer geblieben ist und dann eine Fehlermeldung rausschicken.
Für ein einzelnes Edit Feld habe ich dass in der Callback Funktion des Push Buttons so realisiert:

Code:

if isempty(get(handles.m_K,'String'))
    errordlg('Alle Felder müssen ausgefüllt werden!', 'Error')
end
 


Das funktioniert auch.
Natürlich sollten auch die anderen Felder überprüft werden. Deswegen habe ich mir gedacht ich frage alle einzeln ab:

Code:

if isempty(get(handles.m_K,'String'))
    errordlg('Alle Felder müssen ausgefüllt werden!', 'Error')
end
if isempty(get(handles.m_A,'String'))
    errordlg('Alle Felder müssen ausgefüllt werden!', 'Error')
end
if isempty(get(handles.c1,'String'))
    errordlg('Alle Felder müssen ausgefüllt werden!', 'Error')
end
...
 


Wenn hier das erste Feld (handles.m_K) leer ist bricht er wieder normal nach der Ausführung mit der Error Meldung ab, aber wenn das erste befüllt ist und zB das zweite Feld (handles.m_A) erst leer ist, gibt es nur folgende Matlab-Error Meldung:

Code:

??? Error using ==> get
Invalid handle object.

Error in ==> KH_GUI>Berechnung_Callback at 93
if isempty(get(handles.m_K,'String'))

Error in ==> gui_mainfcn at 96
        feval(varargin{:});

Error in ==> KH_GUI at 42
    gui_mainfcn(gui_State, varargin{:});

Error in ==>
@(hObject,eventdata)KH_GUI('Berechnung_Callback',hObject,eventdata,guidata(hObject))

 
??? Error while evaluating uicontrol Callback
 


Beim debuggen stellte ich fest dass er gar nicht bis zur zweiten if-Abfrage kommt und vorher schon die Fehlermeldung rausschmeißt.

Wo kann hier der Fehler liegen? Bzw. gibt es eine Möglichkeit allgemein abzufragen ob es noch ein leeres Edit Feld gibt?

Danke für eure Hilfe!

lg
hosti
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.495
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 27.03.2012, 20:24     Titel:
  Antworten mit Zitat      
Hallo,

schau mal, ob du in deinem Code irgendwo etwas der Form
Code:
handles.m_K = ...

hast. Wenn ja: schlechte Idee, weil du damit das Handle auf das Textfeld überschrieben hast, also umbenennen.

errordlg bricht meines Wissens übrigens nicht ab, sondern führt die Codeausführung weiter.

Ich würde die Abfragen im übrigen mit && kombinieren.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
hosti
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 83
Anmeldedatum: 08.09.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 28.03.2012, 06:50     Titel:
  Antworten mit Zitat      
Hallo,

Harald hat Folgendes geschrieben:

schau mal, ob du in deinem Code irgendwo etwas der Form
Code:
handles.m_K = ...

hast. Wenn ja: schlechte Idee, weil du damit das Handle auf das Textfeld überschrieben hast, also umbenennen.

errordlg bricht meines Wissens übrigens nicht ab, sondern führt die Codeausführung weiter.



Ja du hattest recht. Das wars, jetzt funktionierts.
errordlg bricht nicht ab. Zusätzliches return einfügen, dann gehts.

Harald hat Folgendes geschrieben:

Ich würde die Abfragen im übrigen mit && kombinieren.


Ja, hab die Abfragen mit || kombiniert. Meldung soll ja schon kommen, auch wenn nur ein Feld leer bleibt.

Danke!

lg
hosti
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.