Verfasst am: 06.11.2008, 16:50
Titel: Timmer soll periodisch Funktion starten
Hallo,
ich möchte eine Funktion periodisch aufrufen. ich weiß, dass es mit Timern geht, aber ich schaffe es nicht eine meiner Funktionen aufzurufen.
Also:
t=timer('ExecutionMode','fixedRate','Period',1,'TimerFcn',@...);
start(t);
Also so müsste das aussehen, aber was muss bei dem @... genau hin. Da soll jetzt meine fucntion hin. wie geht das genau. Danke schon mal.
es funktioniert genau einmal. er sagt mir :
??? Error while evaluating TimerFcn for timer 'time-1'
Reference to non-existent field 'FirstInitFlag'
die Variable die er bemängelt gibt es aber, und wenn ich keinen Timer nehme, sondern das in einer Schleife ausführe gibt er mir den Fehler nicht.
Liegt es vielleicht daran, dass ich meinen Timer an die Callback einer Checkbox gehangen habe. Ich bin etwas ratlos. Also nochmal mein Ziel:
Ich will mit einer Checkbox einen Timer auslösen der alle paar sekunden eine Funktion ausfürht.
Danke schonmal.
beachte, dass das Feld "FirstInitFlag" in der Struktur "handles" schon bei der Zuweisung der Callback-Funktion existieren muss. Ausserdem werden nur die Werte der Struktur übernommen, d.h. falls sich in der Struktur "handles" zur Laufzeit irgendwas ändert, bekommt die Timer-Funktion davon nichts mit. Aus diesem Grunde macht man es z.B. bei GUIs oft so, dass man mit "guidata" Werte in die GUI schreibt und wieder ausliest. Ansonsten gibt es auch die Möglichkeit, dem Feld "UserData" im Timer Werte zuzuweisen, und die dann zu verwenden.
Code:
userdata.timer=timer('ExecutiveMode','fixedRate','Period',0.1,'Timerfunction',@routine);
set(userdata.timer, 'UserData', rand);
start(userdata.timer);
N = 100;
for i=1:N
set(userdata.timer, 'UserData', rand);
pause(0.1);
end
function routine (hObject, eventdata)
zahl = get(hObject, 'UserData');
disp(zahl);
return
EDIT: Hab jetzt erst gesehen dass du da auch eine Checkbox mitverwendest. Könntest du dafür mal ein Minimalbeispiel posten? Ich befürchte, dass "FirstInitFlag" beim zweiten Aufruf nicht mehr existiert.
MfG
Da Kai
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 07.11.2008, 13:08
Titel: die scheckbox
Code:
function live_box_callback(userdata, handles);
userdata=getappdata(gcf,'userdata');
userdata.timer=timer('ExecutiveMode','fixedRate,'Period',10,'TimerFcn', {@routine handles});
if(get(handles.live_box,'Value')==1)
start(userdata.timer) else
stop(userdata.timer) end setappdata(gcf,'userdata',userdata);
function routine(hObject, eventdata, handles)
macht irgendwas....
zum einen ist es unschön, dass du bei jedem Aufruf von live_box_callback einen neuen Timer anlegst (und den alten nicht löscht). Wird diese Funktion 50 Mal aufgerufen, hast du 50 Timerobjekte noch irgendwo rumliegen.
Einen Fehler sehe ich direkt nicht, da "live_box_callback" eine Callback-Funktion zu sein scheint, muss die auch der Form callback_fcn (hObject, eventdata, [optionale arg]) genügen. Daran könnte es liegen. Kannst du noch kurz die Zeile einfügen, in der du der Checkbox die Callback-Funktion zuweist (bzw. in der live_box_callback zugewiesen wird)?
MfG
Da Kai
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 11.11.2008, 11:09
Titel: läuft immer noch nicht
Also ich habe meine Gui mit dem GUIDE von Matlab erstellt und bei dem Zuweisen der Callback nur den Rechtsklick auf dem Button gemacht. Also gehe ich davon aus, dass diese Zuweisung korekt ist. In meinem m-file ist keine direkte Zuweisung zu finden. Wie würde die denn sonst aussehen?
Also beim Inspector der GUI steht bei dem Button unter Callback:
plot1('live_box_Callback',gcbo,[],guidata(gcbo)).
Zu dem löschen der Timer: Wird jetzt bei jedem Abtastzyklus des Programms meine Funktion live_box_callback ausgelöst oder nur wenn sich der Status der Checkbox ändert. Wenn das letztere der Fall wäre könnte ich ja vor jedem neuen Timmer alle anderen löschen.
es wird immer dann die Funktion "live_box_Callback" aufgerufen, wenn sich irgendwas an dem Objekt, dem diese Funktion zugewiesen wird, ändert. Das ist in deinem Fall die Checkbox. Besser wäre es diesen Timer einmal zu initialisieren (außerhalb von Callback-Funktionen) und in der Callback-Funktion diesen Timer nur zu starten und stoppen.
Tja, das ist das Problem an GUIDE. Viele Zuweisungen bzw. Aufrufe sind nicht direkt ersichtlich. Aber egal, dessen Verwendung hat natürlich auch seine gute Seiten
Naja, um auf dein eigentlich Problem zurückzukommen:
kannst du mal in "routine" und am Anfang von "live_box_callback" handles ausgeben?
MfG
Da Kai
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 17.11.2008, 15:06
Titel:
Also ich habe deine punkte jetzt mal umgesetzt. Das heißt:
1. Die Timer initialisierung findet nur beim ersten Aufruf der Funktion statt.
2. Ich habe Handles ausgegeben am Ende von routine und von der TimerFcn, voruasgesetzt du meintest damit einen Rückgabewert im Kopf einzusetzen. Also :
function handles=routine(hObject, evendata, handles)
....
aber es geht immer noch nict. Ich habe deb selben Fehler.
nein, mit ausgeben meinte ich du sollst einfach "handles" in beide Funktionen reinschreiben und schauen, was Matlab dir dann zurückgibt (welchen Wert handles gerade hat).
MfG
Da Kai
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 24.11.2008, 16:17
Titel: ich habs jetzt
Also mein problem lag darin, dass mein Hauptprogramm die übergabevariablen nicht richtig aktualisiert. Also funktioniert mein Timer eigentlich richtig.
Vielen Dank für die Hilfe, waren immer die richtigen Denkanstöße.
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.