ich habe genau das selbe Problem. Ich bekomme jede Sekunde neue Messdaten die über z.B. 150ms gemessen werden. Mein GUI soll sich nun jede Sekunde diese neuen Messdaten holen und die Plots etc im GUI aktualisieren. In die Opening Functioni würde ich nun also einen Timer einbauen, der jede Sekunde auf die neuen Messdaten zugreift. leider bin ich etwas ratlos bei der Programmierung des Timers, da ich generell eher wenig Ahnung von Matlab habe. Mein Timer sieht momentan folgendermaßen aus:
Bitte hänge keine neuen Fragen an bestehende Threads an. Andernfalls wird der "beantwortet"-Status sinnfrei und es ist nicht mehr klar, zu welcher Frage eine Antwort gehört.
Code:
function MyTimer
t = timer('ExecutionMode','fixedSpacing','Period',1.0,'TimerFcn',{@DatenLesen,h});
start(t) end
neuen Messdaten holen und die Plots etc im GUI aktualisieren
Das lässt sich noch nicht direkt in Code beantworten. Es ist weder klar, was "Messdaten holen" bedeutet, noch "GUI aktualisieren". Erkläre daoch beides mal explizit.
Also ich möchte Messungen von Strom und Spannung machen. Jede Sekunde sollen neue Messdaten abgespeichert werden, die ich auch jede Sekunde in mein GUI neu uploaden möchte um die Verläuft von Strom und Spannung usw immer wieder zu aktualisieren. Diese Daten werden immer als struct abgespeichert. Leider sind die Sensoren für die Messungen noch nicht funktionsfähig, ich hab daher noch keine Messdaten um mein GUI zu testen. Aber würde es prizipiell so funktionieren? Ich bin mir überhaupt nicht sicher, welche Übergabeparameter ich in die functions schreiben muss, ob der timer so überhaupt laufen würde und ob meine function auch die neuen Werte in den Plots verwendet?!
Code:
function GUI_verlaeufe_test_OpeningFcn(hObject, eventdata, handles, varargin) % This function has no output args, see OutputFcn. % hObject handle to figure % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) % varargin command line arguments to GUI_verlaeufe_test (see VARARGIN)
% Choose default command line output for GUI_verlaeufe_test
handles.output = hObject;
function MyTimer
t = timer('ExecutionMode','fixedSpacing','Period',1.0,'TimerFcn',{@DatenLesen,daten});
start(t) end
Das ist nun eine "nested function". Ohne Aufruf von außen wird sie gar nicht ausgeführt. Ich vermute, dass das "function MyTimer ... end" einfach weggelassen werden sollte.
Das nächste Problem ist der input "daten". Der ist nicht definiert, während der Callback erstellt wird. Das wird eine Fehlermeldung geben. Was soll "daten" denn sein?
Zitat:
function DatenLesen(hObject,daten)
Der 2. Input eines callbacks ist immer der EventData Struct. Also wäre "daten" erste der dritte. Dennoh ist noch nicht erklärt, was "daten" beinhaltet, zumal diese Variable auch gleich überschrieben wird:
Zitat:
daten = load('export_1_5MVA_Teil2_18_02_16.mat');
Es ist immer sicherer nicht aus dem aktuellen Order zu lesen. Wenn der User per
cd
in einen anderen Ordner wechselt, wird der
load
Befehl scheitern. Füge also besser den absoluten Pfad zum Filenamen an.
Statt das Diagramm immer wieder neu zu zeichnen mit
plot
, könntest Du auch nur die XData und YData eines bestehenden Plots ändern. das läuft deutlich effizienter. Näheres dazu findest Du mit einer Suche nach diesen Ausdrücken im Forum oder im Netz.
Du kannst die Messwerte ja zunächst duir irgendwelche
rand
Zahlen ersetzen und dann mal probieren was passiert, wenn Du das GUI startest. Die Fehlermedlungen sollten beim Debuggen helfen.
also mein Timer läuft nun soweit ganz gut. Jedoch möchte ich mit der ersten GUI ein zweites öffnen, nur leider übergibt das erste GUI meine Daten, seit dem ich den Timer eingebaut habe, nicht mehr an das zweite. Hier noch einmal mein momentaner code in der opening function des ersten GUIs mit anderen Daten als im letzten post (nur als Beispiel):
Code:
function GUI_verlaeufe_test_OpeningFcn(hObject, eventdata, handles, varargin) % This function has no output args, see OutputFcn. % hObject handle to figure % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) % varargin command line arguments to GUI_verlaeufe_test (see VARARGIN)
% Choose default command line output for GUI_verlaeufe_test
handles.output = hObject;
i = 1;
t = timer('ExecutionMode','fixedSpacing','Period',1.0,'TimerFcn',@DatenLesen);
start(t)
Hallo Jan,
danke für die Antwort. Leider funktioniert es immer noch nicht. Mein Code sieht nun folgendermaßen aus:
Code:
function GUI_verlaeufe_test_OpeningFcn(hObject, eventdata, handles, varargin) % This function has no output args, see OutputFcn. % hObject handle to figure % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) % varargin command line arguments to GUI_verlaeufe_test (see VARARGIN)
i = 1;
t = timer('ExecutionMode','fixedSpacing','Period',1.0,'TimerFcn',{@DatenLesen,hObject});
start(t)
% Einlesen der Daten
function DatenLesen(hObject,eventdata,FigureHandle)
Nun bekomme ich die Fehlermeldung: Reference to non-existent field 'output'.
Und zusätzlich auch noch die alte Fehlermeldung, dass U1 nicht exsistiert, sobald ich auf den Button klicke um mein zweites GUI zu öffnen.
Muss ich im Code von der zweiten GUI auch noch etwas ändern oder was mache ich falsch?
Hier noch einmal mein kompletter code der ersten GUI:
Code:
functionvarargout = GUI_verlaeufe_test(varargin) % GUI_VERLAEUFE_TEST MATLAB code for GUI_verlaeufe_test.fig % GUI_VERLAEUFE_TEST, by itself, creates a new GUI_VERLAEUFE_TEST or raises the existing % singleton*.
%
% H = GUI_VERLAEUFE_TEST returns the handle to a new GUI_VERLAEUFE_TEST or the handle to % the existing singleton*.
%
% GUI_VERLAEUFE_TEST('CALLBACK',hObject,eventData,handles,...) calls the local % function named CALLBACK in GUI_VERLAEUFE_TEST.M with the given input arguments.
%
% GUI_VERLAEUFE_TEST('Property','Value',...) creates a new GUI_VERLAEUFE_TEST or raises the % existing singleton*. Starting from the left, property value pairs are % applied to the GUI before GUI_verlaeufe_test_OpeningFcn gets called. An % unrecognized property name or invalid value makes property application % stop. All inputs are passed to GUI_verlaeufe_test_OpeningFcn via varargin.
%
% *See GUI Options on GUIDE's Tools menu. Choose "GUI allows only one % instance to run (singleton)".
%
% See also: GUIDE, GUIDATA, GUIHANDLES
% Edit the above text to modify the response to help GUI_verlaeufe_test
% Last Modified by GUIDE v2.5 23-Nov-2015 09:52:58
% Begin initialization code - DO NOT EDIT
gui_Singleton = 1;
gui_State = struct('gui_Name', mfilename, ...
'gui_Singleton', gui_Singleton, ...
'gui_OpeningFcn', @GUI_verlaeufe_test_OpeningFcn, ...
'gui_OutputFcn', @GUI_verlaeufe_test_OutputFcn, ...
'gui_LayoutFcn', [] , ...
'gui_Callback', []);
ifnargin && ischar(varargin{1})
gui_State.gui_Callback = str2func(varargin{1});
end
ifnargout [varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});
else
gui_mainfcn(gui_State, varargin{:});
end % End initialization code - DO NOT EDIT function GUI_verlaeufe_test_OpeningFcn(hObject, eventdata, handles, varargin) % This function has no output args, see OutputFcn. % hObject handle to figure % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) % varargin command line arguments to GUI_verlaeufe_test (see VARARGIN)
i = 1;
t = timer('ExecutionMode','fixedSpacing','Period',1.0,'TimerFcn',{@DatenLesen,hObject});
start(t)
% Einlesen der Daten
function DatenLesen(hObject,eventdata,FigureHandle)
% --- Outputs from this function are returned to the command line. functionvarargout = GUI_verlaufe_test_OutputFcn(hObject, eventdata, handles) % varargout cell array for returning output args (see VARARGOUT); % hObject handle to figure % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA)
% Get default command line output from handles structure varargout{1} = handles.output;
end
% --- Executes on button press in buttonU. function buttonU_Callback(hObject, eventdata, handles) % hObject handle to buttonU (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA)
GUI_verl_U;
end
i = i+1 dient dazu, immer die nächste Datei (Datein haben fortlaufende Nummerierung) aufzurufen. Das klappt auch solange ich keine Daten an andere GUI's übergeben will..
Reference to non-existent field 'output'.
Error in GUI_Main>GUI_verlaufe_test_OutputFcn (line 135)
varargout{1} = handles.output;
Hier stammt das "handles" aus den Inputs. Da ich grundsätzlich kein GUIDE verwende, weiß ich nicht, ob dies der aktuelle handles-Struct ist, oder eine Kopie, die erzeugt wurde, als der Callback erstellt wurde. Zur Not kannst Du so eine aktuelle Kopie erhalten:
?[/quote]
Das kann ich nicht beantworten, denn ich weiß ja nicht, wozu das Feld "output" dienen soll.
Zitat:
i = i+1 dient dazu, immer die nächste Datei (Datein haben fortlaufende Nummerierung) aufzurufen. Das klappt auch solange ich keine Daten an andere GUI's übergeben will..
Den Wert von "i" zu verändern funktioniert hier, da der Time-Callback eine "nested Funktion" ist. Damit wird dann auf die Variable "i" der Funktion zu gegriffen, die die nested function enthält. Außerhalb dieser Funktion ist "i" aber unbekannt bzw. wird als die imaginäre Einheit interpretiert.
Das "i=1" in GUI_verlaeufe_test_OpeningFcn ist z.B. wirkungslos, da es außerhalb der Funktion gar nicht bekannt ist.
Bisher geht es mit den handles-Structs drunter und drüber. Ich erkenne nicht, wann auf den handles Struct des GUI und wann auf den des Timers zugegriffen werden soll. Wie wäre es, wenn Du den beiden einfach uinterschiedliche Namen gibst? Das sollte auch Dir weiterhelfen.
Statt einer lokalen Variable "i" wäre es wohl klarer, wenn Du z.B. ebenfalls im Handles Struct (des GUI oder des Timers) einen File-Zähler mit eindeutigem Namen verwendest.
Ich habe es nun soweit geschafft, dass das erste GUI die Daten an das zweite übergibt. Hier der Code des ersten GUI:
Code:
functionvarargout = GUI_verlaeufe_test(varargin) % GUI_VERLAEUFE_TEST MATLAB code for GUI_verlaeufe_test.fig % GUI_VERLAEUFE_TEST, by itself, creates a new GUI_VERLAEUFE_TEST or raises the existing % singleton*.
%
% H = GUI_VERLAEUFE_TEST returns the handle to a new GUI_VERLAEUFE_TEST or the handle to % the existing singleton*.
%
% GUI_VERLAEUFE_TEST('CALLBACK',hObject,eventData,handles,...) calls the local % function named CALLBACK in GUI_VERLAEUFE_TEST.M with the given input arguments.
%
% GUI_VERLAEUFE_TEST('Property','Value',...) creates a new GUI_VERLAEUFE_TEST or raises the % existing singleton*. Starting from the left, property value pairs are % applied to the GUI before GUI_verlaeufe_test_OpeningFcn gets called. An % unrecognized property name or invalid value makes property application % stop. All inputs are passed to GUI_verlaeufe_test_OpeningFcn via varargin.
%
% *See GUI Options on GUIDE's Tools menu. Choose "GUI allows only one % instance to run (singleton)".
%
% See also: GUIDE, GUIDATA, GUIHANDLES
% Edit the above text to modify the response to help GUI_verlaeufe_test
% Last Modified by GUIDE v2.5 23-Nov-2015 09:52:58
% Begin initialization code - DO NOT EDIT
gui_Singleton = 1;
gui_State = struct('gui_Name', mfilename, ...
'gui_Singleton', gui_Singleton, ...
'gui_OpeningFcn', @GUI_verlaeufe_test_OpeningFcn, ...
'gui_OutputFcn', @GUI_verlaeufe_test_OutputFcn, ...
'gui_LayoutFcn', [] , ...
'gui_Callback', []);
ifnargin && ischar(varargin{1})
gui_State.gui_Callback = str2func(varargin{1});
end
ifnargout [varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});
else
gui_mainfcn(gui_State, varargin{:});
end % End initialization code - DO NOT EDIT function GUI_verlaeufe_test_OpeningFcn(hObject, eventdata, handles, varargin) % This function has no output args, see OutputFcn. % hObject handle to figure % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) % varargin command line arguments to GUI_verlaeufe_test (see VARARGIN)
i = 1;
t = timer('ExecutionMode','fixedSpacing','Period',1.0,'TimerFcn',{@DatenLesen,hObject});
start(t)
% Einlesen der Daten
function DatenLesen(hObject,eventdata,FigureHandle)
% --- Outputs from this function are returned to the command line. functionvarargout = GUI_verlaufe_test_OutputFcn(hObject, eventdata, handles) % varargout cell array for returning output args (see VARARGOUT); % hObject handle to figure % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA)
% Get default command line output from handles structure varargout{1} = handles.output;
end
% --- Executes on button press in buttonU. function buttonU_Callback(hObject, eventdata, handles) % hObject handle to buttonU (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA)
GUI_verl_U;
end
Nun habe ich aber noch eine weitere Frage. In meiner ersten GUI aktualisieren sich die Werte in den Plots jede Sekunde, da läuft der Timer nun wie er soll, nur in meiner zweiten GUI werden nur die Werte ausgegeben, die übergeben werden, wenn ich auf den Button drücke. Hier fehlt die fortlaufende aktualisierung. Hat jemand eine Idee wie ich diese Werte auch dazu kriegen kann, jede Sekunde die neu geladenen Werte des ersten GUI zu übernehmen und auszugeben? Muss ich hier auch einen Timer einbauen?
Hier noch einmal mein Code für die Übergabe der Werte im zweiten GUI:
Code:
function GUI_verl_U_OpeningFcn(hObject, eventdata, handles, varargin) % This function has no output args, see OutputFcn. % hObject handle to figure % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) % varargin command line arguments to GUI_verl_U (see VARARGIN)
Statt einer lokalen Variable "i" wäre es wohl klarer, wenn Du z.B. ebenfalls im Handles Struct (des GUI oder des Timers) einen File-Zähler mit eindeutigem Namen verwendest.
Was genau meinst du damit? Könntest du vielleicht ein Beispiel geben? Tut mir leid, ich habe nur sehr wenig Erfahrung mit Matlab.. Aber vielen Dank für die Hilfe!
Statt einer lokalen Variable "i" wäre es wohl klarer, wenn Du z.B. ebenfalls im Handles Struct (des GUI oder des Timers) einen File-Zähler mit eindeutigem Namen verwendest.
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
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.