Verfasst am: 16.01.2009, 12:00
Titel: Systemzeit auf der x-Achse anzeigen
Hallo Forum,
seit einigen Tagen probiere ich mich leider erfolglos an folgendem Problem:
Ich nehme über eine A/D-Karte Daten in Echtzeit auf und zeige sie in einem Diagramm an. Nun sollen aber auf der x-Achse nicht die Samples oder die Messzeit stehen sondern der genaue Zeitpunkt in hh:mm:ss, d.h. wenn die Aufnahme z.b. 10:45:00 startet und 30s dauert sollen an der x-Achse in z.b. 10 Ticks die Werte von 10:45:00 bis 10:45:30 stehen.
Ich habe hier mal ein einfaches Beispiel für eine Datenaufnahme von der Soundkarte über 10s mit einem 3s Preview und einem Diagramm über die Gesamtzeit. (Ist das Beispiel DAQDOC5_2 für die Data Acquisition Toolbox).
duration = 10; % Ten second acquisition set(AI,'SampleRate',8000)
ActualRate = get(AI,'SampleRate');
set(AI,'SamplesPerTrigger',duration*ActualRate)
preview = 16000;
subplot(211) set(gcf,'doublebuffer','on')
P = plot(zeros(preview,1)); grid on
title('Preview Data') xlabel('Samples') ylabel('Signal Level (Volts)')
start(AI) while AI.SamplesAcquired < preview
end while AI.SamplesAcquired < duration*ActualRate
data = peekdata(AI,preview);
set(P,'ydata',data) drawnow end
data = getdata(AI);
subplot(212),
plot(data),
grid on
title('All Acquired Data') xlabel('Samples') ylabel('Signal level (volts)')
Die Aktuelle Zeit in einem etwas eigentümlichen Serial Date Format bekommst Du mit now().
Dabei ist der Ganzanteil die Zahl der Tage seit dem ersten Januar im Jahr 0.
Der Bruchanteil sind die Stunden. Mitternacht ist dabei um ,0, Mittag um ,5 und 6 Uhr abends um ,75.
Deine einzelnen Ticks kannst Du damit im serial-date-format berechnen.
Für eine hübschere Anzeige gibt es dann noch datestr(). Die Funktion nimmt ein serial date entgegen und gibt Datum und Uhrzeit aus.
Diese hübschen Werte gibst Du dann noch als XTickLabel vor und (fast) alles ist prima.
Danke Epfi,
bei dem Versuch mein Problem zu beschreiben, habe ich vollkommen vergessen zu erwähnen, dass ich es schon bis zur Ausgabe der Zeit im richtigen Format geschafft hatte. Ich bin dann daran gescheitert den Vektor für XTickLabel korrekt zu erzeugen, da dieser ja permanent neu geschrieben werden muss, und das auch noch zeitlich richtig zur laufenden Datenaufnahme. Was ich auch schon geschafft hatte, ist den XTickLabel-Vektor zwar mit der aktuellen Zeit aber überall die gleiche Zeit zu "füllen". Dadurch wurde die Zeit auf der x-Achse zwar richtig dargestellt, allerdings leider auf allen Ticks die gleiche Zeit.
Ich hoffe das war verständlich, ist ganz schön schwierig wenn man gerade mit Matlab (und Programmieren überhaupt) anfängt und dann gleich mit einer solchen Aufgabe ins kalte Wasser geschmissen wird
Wenn du die Samplefrequenz kennst und die Umrechnung von Sample auf richtige Zeit schaffst, dann einfach die Achsen vordefinieren im einem bestimmten Bereich und fixieren. Nun sollte es doch möglich sein den Xticklabel Vektor einmal umzurechnen und beim plotten dann zu verwenden? Oder hab ich was übersehen?
_________________
Der XTickVektor verändert sich ja laufend. Das ist ein Plot, der immer die letzten paar Sekunden der aktuellen Aufnahme anzeigt. Die XTickLabels müssen also ständig aktualisiert werden.
Code:
%vor dem beginn der Aufzeichnung
num_labels = 5; %anzahl der angezeigten labels
set(gca, 'XTickLabelMode', 'manual');
set(gca, 'XTickMode', 'manual');
set(gca, 'XTick', linspace(0,preview,num_labels));
xlabel_step = (preview/samplerate/(num_labels-1))/(24*3600); %abstand zwischen zwei ticks im matlab-zeitformat
%in der schleife dann immer den aktuellen Zeitvektor neuberechnen und zuweisen
zeit = now();
labelvektor = datestr([zeit-4*xlabel_step; zeit-3*xlabel_step; zeit-2*xlabel_step; zeit-1*xlabel_step; zeit-0*xlabel_step]);
set(gca, 'XTickLabel', labelvektor);
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.