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

Mit Timer Funktion Zeit erfassen

 

Hans_Meiser

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 04.10.2015, 18:04     Titel: Mit Timer Funktion Zeit erfassen
  Antworten mit Zitat      
Code:

Timer:
clear all;
close all;
clc;

t = timer;
t.StartDelay = 1;
t.Period = 1;
t.TasksToExecute = 5;
t.ExecutionMode = 'fixedRate';
t.UserData = 1;

c = zeros(5,1);
m = t.TasksToExecute;
text = ' Beginn';

set (t, 'TimerFcn','[c] = wert(t,c);') ;
t.StartFcn = {@beginn, text};
t.StopFcn  = {@ende} ;

tic
start(t)

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);

end

 


Hallo Matlab-Profis,

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...

Grüße - Hans


Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 04.10.2015, 19:52     Titel: Re: Mit Timer Funktion Zeit erfassen
  Antworten mit Zitat      
Hallo Hans_Meiser,

Ich werde immer ganz schockelig, wenn ich diesen brutalen CLEAR-Header sehe:
Code:

clear all 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:

Code:
set (t, 'TimerFcn','[c] = wert(t,c);') ;
...
function [c] = wert(t, event,c)

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.:

Code:
function myTimerCallback(timerH, event)

ablauf = get(t,'TasksToExecute');
Data = get(t, 'UserData');
if Data.zahl <= ablauf
   Data.c(zahl)= toc;
end
Data.zahl = Data.zahl+1;
set(timerH, 'UserData', Data);

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

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 04.10.2015, 20:38     Titel:
  Antworten mit Zitat      
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.

Um deine Infos und Hilfe bitte ich...
 
Winkow
Moderator

Moderator



Beiträge: 3.842
Anmeldedatum: 04.11.11
Wohnort: Dresden
Version: R2014a 2015a
     Beitrag Verfasst am: 04.10.2015, 20:56     Titel:
  Antworten mit Zitat      
Zitat:
-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
Code:

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?
_________________

richtig Fragen
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 05.10.2015, 10:49     Titel:
  Antworten mit Zitat      
Hallo Hans_Meiser,

Zitat:
Bitte um Verständnis, ich bin neu hier...

:-) 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.
clear all 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.
close all 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:
Code:
docsearch callback


-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.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Epfi
Forum-Meister

Forum-Meister



Beiträge: 1.134
Anmeldedatum: 08.01.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 05.10.2015, 12:19     Titel:
  Antworten mit Zitat      
Jan S hat Folgendes geschrieben:

close all 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 close all betroffen.

Außerdem kann das Ausführen eines Skriptes ohne close all zu wirren Ergebnissen führen, weil man evtl. in Fenster plottet, in die man gar nicht plotten wollte...

Aber wie auch beim clear (nicht clear all !) 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.
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.