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

Probleme mit Timer

 

de_ralle
Forum-Newbie

Forum-Newbie


Beiträge: 3
Anmeldedatum: 26.03.12
Wohnort: Karlsruhe
Version: R2011b
     Beitrag Verfasst am: 26.03.2012, 21:28     Titel: Probleme mit Timer
  Antworten mit Zitat      
Hallo,
ich will Matlab dazu bringen in einem bestimmten Zeitraster eine vertikale Linie zu zeichnen und dabei die vorherige zu löschen (eine Art Zeitanzeiger im plot soll so entstehen). Ich habe es mit timer versucht, es bislang aber noch nicht zum laufen gebracht.

Beispiel meines Timers:

Code:

shootLinie = timer;
shootLinie.Period = Zeitraster;                                
shootLinie.TasksToExecute = fix((Zeit(end)-Zeit(1))/Zeitraster);
shootLinie.ExecutionMode = 'fixedDelay';                  
shootLinie.TimerFcn = subfkt_LinieZeichnen;  
start(shootLinie);
 


die TimerFcn wird nicht ausgeführt. Fehlermeldung:
Error while evaluating TimerFcn for timer 'timer-30'

Too many input arguments.

Versteh ich nicht, wo bitte genau habe ich zuviele input arguments Confused

Kann irgendjemand mir hier weiterhelfen?
Danke schonmal. Ich bin Matlab-Anfänger, vielleicht habe ich die Dokumentation bloss falsch verstanden...


Vollständigkeitshalber (vielleicht liegt der Fehler hier): subfkt_LinieZeichnen ist dabei folgende Funktion

Code:

function linie = subfkt_LinieZeichnen

% Löschen der letzten Linie:
if exist('Linie')
    x = get(Linie,'XData');
    ztctr = 1 + fix((Anfangszeit-x(1))/Zeitraster);  % Anzahl bereits gezeichneter Linien
    delete(Linie);
else
    ztctr = 1;
end

% Erstellen der neuen Linie:
linie = line([ztctr*Zeitraster,ztctr*Zeitraster],Y,'Color','k');
drawnow;

end
 


Damit die benötigten Variablen auch in dieser Funktion gebraucht werden können, habe ich sie (die Variablen) global definiert. Ist nicht die beste Methode aber wusste mir nicht besser zu helfen.
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: 27.03.2012, 08:23     Titel: Re: Probleme mit Timer
  Antworten mit Zitat      
Hallo de_ralle,

Die Callback-Funktion des Timers wird wie alle anderen Callbacks auch mit zwei Inputs aufgerufen, nämlich dem Handle des Timers und dem EventData struct. Schaue Dir mal die Beispiele in "doc timer" an.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
de_ralle
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 3
Anmeldedatum: 26.03.12
Wohnort: Karlsruhe
Version: R2011b
     Beitrag Verfasst am: 31.03.2012, 09:00     Titel:
  Antworten mit Zitat      
okay,ich habe mich jetzt nochmal durch Dokumentation und Internet gewühlt und das Ding läuft zum Teil. Hatte nicht verstanden,dass Handle und EventData Struct vom timer nochmal in die Callback Function am Anfang hineingehören. Um meine Unterfunktion leicht allgemeiner zu halten habe ich sie daher verschachtelt.

Ein Hauptproblem bleibt dennoch:
wie ist es möglich eine von der Timer Callback Function erstellte Variable immer wieder durch die gleiche Callback Function zu überschreiben? In diesem Fall wäre das "linie".
Beim Testen gibt Matlab "Invalid or deleted object." aus. Stimmt ja auch, "linie" wurde beim ersten Aufrufen gelöscht, und eine neue erstellt welche dann nicht übergeben wird. Ist das überhaupt möglich?
Danke schonmal!

Code:
function fig = sndplay(Zeit, Signal, Zeitraster, Messtastfrequenz)

... ...

y = [min(Signal), max(Signal)];
x = [min(Zeit), max(Zeit)];
anfangszeit = Zeit(1);

%% VERARBEITUNG:
% Erstellen der grafischen Ausgabe
fig1 = figure(1);
plt = plot(Zeit, Signal);
axis([x,y]);

% Erstellen des (ersten) Zeitanzeigers in grafischer Ausgabe
linie = line([Zeit(1),Zeit(1)],y);

% Hauptteil: Zeitanzeiger im gegeben Zeitraster & Tonausgabe
shootLinie = timer( ...
    'Period',Zeitraster, ...                                    
    'TasksToExecute', fix((Zeit(end)-Zeit(1))/Zeitraster), ...
    'ExecutionMode','fixedDelay', ...                    
    'TimerFcn',{@zeitschritt,linie,Zeitraster});
start(shootLinie);

sound(double(Signal),Messtastfrequenz);

end


%% UNTERFUNKTION(en): Zeichnen der neuen und entfernen der alten Linie

function Linie = zeitschritt(~,~,Linie,Zeitraster)

Linie = subfkt_LinieZeichnen(Linie,Zeitraster);

end



function zeichnen = subfkt_LinieZeichnen(Linie, Zeitraster)
       
% Koordinaten:
  x = get(Linie,'XData');
  y = get(Linie,'YData');
  xneu = x+Zeitraster;
 
% Löschen der letzten Linie:
  delete(Linie);

% Erstellen der neuen Linie:
zeichnen = line(xneu,y,'Color','k');
drawnow;


end


ich hoffe ich habe das Problem klar dargestellt, falls nicht kann ich versuchen weiter zu erklären...
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: 31.03.2012, 14:11     Titel:
  Antworten mit Zitat      
Hallo de_ralle,

Einerseits könntest Du den Handle der neuen Linie in den UserData des Timer-Objekts speichern. Andererseits musst Du die Linie aber gar nicht löschen:

Code:
function zeichnen = subfkt_LinieZeichnen(Linie, Zeitraster)
       
% Koordinaten:
  x = get(Linie,'XData');
  y = get(Linie,'YData');
  xneu = x+Zeitraster;

% Update der Line:
set(Linie, 'XData', xneu, 'YData', yneu);
drawnow;
end

Das ist nebenbei auch noch schneller.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
de_ralle
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 3
Anmeldedatum: 26.03.12
Wohnort: Karlsruhe
Version: R2011b
     Beitrag Verfasst am: 01.04.2012, 17:12     Titel:
  Antworten mit Zitat      
ja genau, das ist die Lösung. echt besser die Linie zu ändern ohne sie zu löschen Smile
vielen Dank!
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 - 2025 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.