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

Geänderte handle-Variable an Timerfunktion übergeben

 

Sebastian_T
Forum-Newbie

Forum-Newbie


Beiträge: 4
Anmeldedatum: 06.11.14
Wohnort: Iserlohn
Version: ---
     Beitrag Verfasst am: 06.11.2014, 21:36     Titel: Geänderte handle-Variable an Timerfunktion übergeben
  Antworten mit Zitat      
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;

% Update handles structure
guidata(hObject, handles);

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


% --- Outputs from this function are returned to the command line.
function varargout = 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)
 


Grüße
Sebastian
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: 06.11.2014, 22:06     Titel:
  Antworten mit Zitat      
Hallo,

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.

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

Forum-Newbie

Forum-Newbie


Beiträge: 4
Anmeldedatum: 06.11.14
Wohnort: Iserlohn
Version: ---
     Beitrag Verfasst am: 06.11.2014, 23:19     Titel:
  Antworten mit Zitat      
Kannst du mir sagen wie ich das mache? Ich bin noch nicht so fit in Matlab.
Danke schonmal für deine Antwort Smile
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: 06.11.2014, 23:53     Titel:
  Antworten mit Zitat      
Hallo,

in etwa sowas:
Code:
... ,'TimerFcn',{@timer_callback, handles.figure1}, ...

und in der Funktion dann fh entgegennehmen
Code:
function timer_stop(timerObj,event, fh)

und
Code:
handles = guidata(fh);


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

Forum-Newbie

Forum-Newbie


Beiträge: 4
Anmeldedatum: 06.11.14
Wohnort: Iserlohn
Version: ---
     Beitrag Verfasst am: 07.11.2014, 11:34     Titel:
  Antworten mit Zitat      
Danke,
hat funktioniert nachdem ich für TimerFcn und StopFcn "handles.figure1" eingesetzt habe. Smile
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 - 2024 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.