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

Timmer soll periodisch Funktion starten

 

Da Kai

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 06.11.2008, 17:50     Titel: Timmer soll periodisch Funktion starten
  Antworten mit Zitat      
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.


dib0r
Forum-Guru

Forum-Guru


Beiträge: 413
Anmeldedatum: 09.05.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 06.11.2008, 18:34     Titel:
  Antworten mit Zitat      
Hallo,

ganz genau. Das @ steht für das function_handle, ist aber ganz einfach.
Code:

[...]t=timer('ExecutionMode','fixedRate','Period',1,'TimerFcn',{@meineFunktion 'Hallo Welt :)'});
start(t);

function meineFunktion (hObject, eventdata, str)
  disp(str);
return
Du kannst aber statt {@...} auch 'disp('Hallo Welt')' schreiben. Suche mal nach Callback-Funktionen - das nämlich ist eine.

MfG
Private Nachricht senden Benutzer-Profile anzeigen
 
Da Kai

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 07.11.2008, 10:20     Titel: geht nur einmal
  Antworten mit Zitat      
Also ich habe das so eingefügt und es geht auch, aber nur einmal.
Mein Text lautet:

userdata.timer=timer('ExecutiveMode','fixedRate','Period',0.1,'Timerfunction',@routine handles});
start(userdata.timer)

function routine(...handles)
macht was......

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.
 
dib0r
Forum-Guru

Forum-Guru


Beiträge: 413
Anmeldedatum: 09.05.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 07.11.2008, 10:48     Titel:
  Antworten mit Zitat      
Hallo,

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
Private Nachricht senden Benutzer-Profile anzeigen
 
Da Kai

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 07.11.2008, 14:08     Titel: die scheckbox
  Antworten mit Zitat      
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....

 

so das ist mein derzeitiges Programm, sieht wer den Grund für die Fehlermeldung beim zweiten auslösen des Timers?
 
dib0r
Forum-Guru

Forum-Guru


Beiträge: 413
Anmeldedatum: 09.05.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 07.11.2008, 14:27     Titel:
  Antworten mit Zitat      
Hallo,

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
Private Nachricht senden Benutzer-Profile anzeigen
 
Da Kai

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 11.11.2008, 12:09     Titel: läuft immer noch nicht
  Antworten mit Zitat      
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.
 
dib0r
Forum-Guru

Forum-Guru


Beiträge: 413
Anmeldedatum: 09.05.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 11.11.2008, 15:38     Titel:
  Antworten mit Zitat      
Hallo,

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 Smile

Naja, um auf dein eigentlich Problem zurückzukommen:
kannst du mal in "routine" und am Anfang von "live_box_callback" handles ausgeben?

MfG
Private Nachricht senden Benutzer-Profile anzeigen
 
Da Kai

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 17.11.2008, 16:06     Titel:
  Antworten mit Zitat      
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.
 
dib0r
Forum-Guru

Forum-Guru


Beiträge: 413
Anmeldedatum: 09.05.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 18.11.2008, 13:02     Titel:
  Antworten mit Zitat      
Hallo,

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
Private Nachricht senden Benutzer-Profile anzeigen
 
Da Kai

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 24.11.2008, 17:17     Titel: ich habs jetzt
  Antworten mit Zitat      
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.
 
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.