Timer_callback_Funktion:
function[c] = wert(t, event,c) % global k;
ablauf = get(t,'TasksToExecute');
zahl = get(t, 'UserData');
if zahl <= ablauf
c (zahl,:)= toc;
end % k(zahl,: ) = toc;
zahl = zahl+1;
set(t,'UserData',zahl);
ich möchte mit der TimerFcn, eine CallbackFunktion ausführen, die zu jeder Sekunde einen Vektor c auffüllt. Leider werden die Werte von vorher in dem Vektor nicht abgespeichert. Das Resultat ist folgendes:
c =
0
0
0
0
5.0078
Ich komme hier nicht weiter und weis nicht warum nicht jede Zeile befüllt ist sondern nur die letzte. Wenn ich das über die global Variable k mache so funktioniert das ganze. Bitte um Hilfe...
clearall
erschwert das Debuggen. Der Debugger wäre aber sehr sinnvoll um Deinen Code zu testen. Denn so, wie Du ihn hier gepostet hast, ist er gar nicht lauffähig:
Die Funktion "wert" ist mit 3 Inputs definiert, Du rufst sie in der TimerFcn aber mit nur 2 Inputs auf. Dass Du dann überhaupt ein Ergebnis erhältst, ist verwunderlich.
Callbacks als Strings zu definieren wird weiterhin unterstützt aus Gründen der Rückwärtskompatibilität. Diese Strings werden dann im aktuellen Kontext des Base-Workspaces ausgeführt. Das wird schon sehr spaghetti-arting und ich empfehle dringend, die seit über 10 JAhren empfohlene Form mit Function-Handles zu verwenden. Z.B.:
Wenn die Funktion dann beendet ist, kannst Du von außerhalb die UserData auslesen, bevor Du das Timer-Objekt löschst.
Mit dieser Methode werden nicht "wild" Variablen im Base-Workspace erzeugt und verändert, sondern die Zähler und Daten bleiben schön lokal im Timer selbst gespeichert.
Gruß, Jan
Hans_Meiser
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 04.10.2015, 20:38
Titel:
Hallo Jan,
besten Dank für deine Infos. Leider habe ich beim Einfügen des Codes einen kleinen Fehler gemacht: Timer: und Timer_Callback_Funktion sollen nochmal darauf hinweisen, was der Timer ist und was die Callback Funktion. Ich habe dazu jeweils zwei Skripte angelegt. Bitte um Verständnis, ich bin neu hier...
-Was den clear Header anbetrifft: Ist es gänzlich zu empfehlen, den wegzulassen? Mir ist nicht klar warum der schlecht ist.
-Laut der Matlab Doku hat die callback funktion immer zwei feste Übergabeparamter. Dies ist das Timer Objekt und event.
Bei wert(t,c) übergebe ich event nicht, da es der Callback funktion doch bekannt sein soll?! Falls ich t hier nicht übergebe, bekomme ich den Fehler:'Not enough input arguments'
-Kannst du mir genauer erläutern, wie ich mit den functions handles im Rahmen der Timer Funktion in Zukunft arbeiten soll. Ich kenne mich damit leider nicht aus. Was genau bedeutet das?
-Ich habe den Code so ausgeführt wie von dir verbessert und bekommen den Fehler:
BeginnError while evaluating TimerFcn for timer 'timer-17'
Attempt to reference field of non-structure array.
-Was den clear Header anbetrifft: Ist es gänzlich zu empfehlen, den wegzulassen? Mir ist nicht klar warum der schlecht ist.
Zitat:
clear all erschwert das Debuggen.
außerdem löscht es funktionen aus dem speicher die dann wieder geladen werden müssen und so weiter. wozu soll das clear all dienen? wenn man ordenlich programmiert ist das überflüssig. wenn du es wirklich brauchst reicht in den meisten fällen auch ein einfaches clear
wozu musst du die ausgabe im command window entfernen? alte fehlermeldungen oder ergebnisse zum vergleichen werden dann gelöscht. was ist wenn ein fehler nur scheinbar 'zufällig' auftritt und du ihn dann nicht mehr findest weil die fehlermeldung bereits gelöscht wurde?
_________________
:-) Klar, kein Problem. Ich bin übrigens einer der Moderatoren hier, insofern weiß ich ja, dass Du hier neu bist. Verständnis haben wir hier auf jeden Fall: Das ist ja ein Forum, in dem man Dinge klärt, die man noch nicht selbst lösen kann! Das ist ja der Sinn der Sache.
Zitat:
-Was den clear Header anbetrifft: Ist es gänzlich zu empfehlen, den wegzulassen? Mir ist nicht klar warum der schlecht ist.
Alles, was das Debuggen erschwert, ist ein Feind des Programmierers.
clearall
löscht Breakpoints und entfernt Funktionen, Classes, Java-Classes und persistente Variable aus dem Speicher. Das Nachladen von der Festplatte ist sehr Zeit- und Energie-aufwändig.
closeall
schließt alle Fenster. Wenn Du den Code irgendwann später man verwendest und gleichzeitig ein paar GUIs offen hast, werden die alle gekillt. Wozu soll das nützlich sein?!
Wie Winkow schon erklärte, kann
clc
wichtige Nachrichten verbergen.
Zitat:
-Laut der Matlab Doku hat die callback funktion immer zwei feste Übergabeparamter. Dies ist das Timer Objekt und event.
Nein, so steht das nicht in der Dokumentation. Bitte lies es nochmal nach. Es kommt auf die Details an.
Zitat:
Bei wert(t,c) übergebe ich event nicht, da es der Callback funktion doch bekannt sein soll?!
Das ist Raten. In der Dokumentation findest Du Beispiel-Code, der zeigt, wie man Callbacks programmiert. Siehe:
-Kannst du mir genauer erläutern, wie ich mit den functions handles im Rahmen der Timer Funktion in Zukunft arbeiten soll. Ich kenne mich damit leider nicht aus. Was genau bedeutet das?
Zitat:
BeginnError while evaluating TimerFcn for timer 'timer-17'
Attempt to reference field of non-structure array.
Die Variables "Data" muss beim Erstellen des Timers auch wie gewünscht erzeugt und in den UserData gespeichert werden.
Ich würde empfehlen, mit dem Lesen der Dokumentation zu beginnen. Dort findest Du Beispiele zu Timern. Tippe die mal ab und spiele etwas damit herum. Dann wird es irgendwann klar werden, wie sie funktionieren. Und weitere Fragen, die die Dokumentation nicht klären konnte, sinder hier im Forum sehr willkommen.
closeall
schließt alle Fenster. Wenn Du den Code irgendwann später man verwendest und gleichzeitig ein paar GUIs offen hast, werden die alle gekillt. Wozu soll das nützlich sein?!
Wieder falsch :) Zumindest fast... Grundsätzlich stimmt es schon ;) Aber wenn man nebenbei noch GUIs offen hat, sollte man die figure-Eigenschaft
HandleVisibility
doch sowieso auf
'off'
setzen, weil man sonst mit einem
plot
ohne vorangehendes
figure
in seine GUI plottet. Und das nervt total... Und wenn das handle unsichtbar ist, ist es auch nicht vom
closeall
betroffen.
Außerdem kann das Ausführen eines Skriptes ohne
closeall
zu wirren Ergebnissen führen, weil man evtl. in Fenster plottet, in die man gar nicht plotten wollte...
Aber wie auch beim
clear
(nicht
clearall
!) und
clc
(am Anfang des Skriptes löscht das auch keine wichtigen Meldungen weg, Syntax-Fehler werden ausgegeben, bevor das
clc
ausgeführt wird und alle anderen Fehler kommen hinterm
clc
) ist das mal wieder eine eher philosophische Frage.
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.