Verfasst am: 06.11.2014, 21:36
Titel: Geänderte handle-Variable an Timerfunktion übergeben
Hallo zusammen,
ich habe in Matlab mit Hilfe von GUIDE eine GUI erstellt über die ich einen Mikrocontroller steuern und dessen Messwerte in Echtzeit anzeigen kann.
Zunächst habe ich alles mit globalen Variablen gelöst, was auch funktioniert hat. Nachdem ich mich allerdings länger mit Matlab beschäftigt hatte, wollte ich die globalen Variablen durch handle Variablen ersetzen.
Hier komme ich zu meinem Problem:
In meinen ersten Versuchen habe ich eine Callback Funktion in einer Endlosschleife laufen lassen. Über eine weitere Callback Funktion wollte ich die handle Variable ändern. Jedoch musste ich Feststellen das jede Callback Funktion die handles nur als "Kopie" übergeben bekommt und aktualisierte Werte nicht mitbekommt.
Meine nächste Überlegung war es, einen Timer zu implementieren der sich in regelmäßigen Abständen die Messdaten in der TimerFcn holt. Da die TimerFcn jedesmal neu aufgerufen wird, wird auch der handle Stack jedes mal neu übergeben. Aber auch hier musste ich feststellen, dass die aktualisieren handle Variablen nicht an die TimerFcn übergeben wurden.
Jetzt hab ich mir ein kleines Programm, bestehend aus einem Menü, einem Button und einem Textfeld, geschrieben und habe schon einige Sachen ausprobiert. Aber immer ohne Erfolg. Ich hoffe ihr habt da ein paar Ideen wie ich die geänderte Variable an die TimerFcn übergeben kann.
Der Button startet den Timer. In der Startfunktion wird auf dem Textfeld "Hallo" ausgegeben. Die TimerFcn wird 5 mal alle 0,5 Sekunden aufgerufen und gibt auf dem Textfeld "Test" aus.
In der Stopfunktion wird nun der Inhalt von handles.A im Textfeld ausgegeben.
Handles.A ist mit "27" initialisiert und wird durch den Menü-Aufruf auf 14 gesetzt.
Wird das Menü vor Starten des Timers angeklickt wird die aktualisierte Variable richtig übergeben. Läuft der Timer jedoch schon, so wird der alte Wert (27) ausgegeben.
Hier der Code:
Code:
% --- Executes just before Timer is made visible. function Timer_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)
handles.A='27';
% varargin command line arguments to Timer (see VARARGIN)
% Choose default command line output for Timer
handles.output = hObject;
% UIWAIT makes Timer wait for user response (see UIRESUME) % uiwait(handles.figure1);
% --- Outputs from this function are returned to the command line. functionvarargout = Timer_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;
% --- Executes on button press in pushbutton1. function pushbutton1_Callback(hObject, eventdata, handles) % hObject handle to pushbutton1 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA)
t = timer('StartFcn',{@timer_start, handles},'TimerFcn',{@timer_callback, handles},'StopFcn',{@timer_stop, handles});
t.Period = 0.5;
t.TasksToExecute = 5;
t.ExecutionMode = 'fixedRate';
set(t, 'UserData', handles)
start(t);
function timer_start(timerObj,event, handles) set(handles.text1,'String','Hallo');
function timer_callback(timerObj,event, handles) display('Test');
function timer_stop(timerObj,event, hObject)
handles=guidata(hObject);
set(handles.text1,'String',handles.A);
% -------------------------------------------------------------------- function Menue_Callback(hObject, eventdata, handles) % hObject handle to Untitled_1 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA)
handles.A='14';
guidata(t.UserData, handles)
versuch mal stattdessen, an den Timer das Handle auf die Figure zu übergeben und die Handles bei der Ausführung des Timers mit guidata von der Figure zu holen.
Danke,
hat funktioniert nachdem ich für TimerFcn und StopFcn "handles.figure1" eingesetzt habe.
Einstellungen und Berechtigungen
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.