04.05.2015, 14:55
05.05.2015, 10:50
Ich habe mal hier das gesamte Projekt hochgeladen.
Relevant ist davon im Ordner das VI: Ansteuerung_Winkel.vi
Danke euch schonmal für eure Hilfe!
Relevant ist davon im Ordner das VI: Ansteuerung_Winkel.vi
Danke euch schonmal für eure Hilfe!
05.05.2015, 10:56
Hallo Agenth,
VI öffnen, sofort erstes Problem sehen:
Du definierst deinen AI-Task mit einer Samplerate von 20kHz und fragst dann in einer Schleife gerade mal 20 Samples ab. Das führt zu einer Loop-Rate von 1kHz - du lasstest die CPU mit Aufrufen des DAQmx-Treibers aus!
Allgemeine Empfehlung: Immer Datenblöcke abfragen, die einem Zeitraum von 0.1s entsprechen - bei dir also 2000 Samples…
VI öffnen, sofort erstes Problem sehen:
Du definierst deinen AI-Task mit einer Samplerate von 20kHz und fragst dann in einer Schleife gerade mal 20 Samples ab. Das führt zu einer Loop-Rate von 1kHz - du lasstest die CPU mit Aufrufen des DAQmx-Treibers aus!
Allgemeine Empfehlung: Immer Datenblöcke abfragen, die einem Zeitraum von 0.1s entsprechen - bei dir also 2000 Samples…
05.05.2015, 16:57
(05.05.2015 10:56 )GerdW schrieb: [ -> ]Hallo Agenth,
VI öffnen, sofort erstes Problem sehen:
Du definierst deinen AI-Task mit einer Samplerate von 20kHz und fragst dann in einer Schleife gerade mal 20 Samples ab. Das führt zu einer Loop-Rate von 1kHz - du lasstest die CPU mit Aufrufen des DAQmx-Treibers aus!
Allgemeine Empfehlung: Immer Datenblöcke abfragen, die einem Zeitraum von 0.1s entsprechen - bei dir also 2000 Samples…
Erstmal danke für den Tipp. Mir wird jedoch vorgegeben mit einer Samplerate von 1 kHz aufzunehmen :/
05.05.2015, 18:34
(05.05.2015 16:57 )Agenth schrieb: [ -> ]Erstmal danke für den Tipp. Mir wird jedoch vorgegeben mit einer Samplerate von 1 kHz aufzunehmen :/Das heißt noch lange nicht, dass die Auswertung auch mit 1kHz laufen muss.
Weitere Unschönheiten:
- Deine Speicherschleife (ganz unten) läuft ungebremst.
- Die Start/Reset-Messung Schleife rechts oben läuft ungebremst.
- Die Betriebs-/Bewegungsarten-Schleife läuft im Modus "Leerlauf" ungebremst.
- Deine Drive-Handle Schleife ganz oben könnte ebenfalls eine CPU zu 100% auslasten - das hängt aber von der .NET-DLL ab.
- Die Schleife unterhalb der Schleife mit der Event-Struktur könnte auf den ersten Blick ebenfalls eine CPU zu 100% auslasten.
- Die Signaldatenverarbeitungsschleife läuft - wenn keine Messung aktiv ist - ungebremst.
- Wieso ist es nötig neben ein Gauge-Control noch einen weiteren Numeric-Indicator zu platzieren? Rechtsklick -> Visible -> Digitial Display -> Fertig? Und wieso aktualisierst du die Gauge-Controls mit 100 Hz, und einige der Numeric Indicators nur mit 10 Hz? Der typischer TFT-Monitor kann sowieso nur 60 Hz, für das menschliche Auge langen 10-20 Hz.
Fazit:
Ich entdecke 2-6 ungebremste While-Loops, die Datenerfassungsloop ist auf 1 kHz getrimmt, durch die Abhängigkeiten über Queues gilt das für 1-2 weitere Loops. Die Plots werden - sobald sie aktiv sind - ebenfalls mit 100 Hz aktualisiert, auch das ist heftig.
Und da wunderst du dich über 80% CPU?
Gruß, Jens
06.05.2015, 06:38
(05.05.2015 18:34 )jg schrieb: [ -> ]Weitere Unschönheiten:
- Deine Speicherschleife (ganz unten) läuft ungebremst.
- Die Start/Reset-Messung Schleife rechts oben läuft ungebremst.
- Die Betriebs-/Bewegungsarten-Schleife läuft im Modus "Leerlauf" ungebremst.
- Deine Drive-Handle Schleife ganz oben könnte ebenfalls eine CPU zu 100% auslasten - das hängt aber von der .NET-DLL ab.
- Die Schleife unterhalb der Schleife mit der Event-Struktur könnte auf den ersten Blick ebenfalls eine CPU zu 100% auslasten.
- Die Signaldatenverarbeitungsschleife läuft - wenn keine Messung aktiv ist - ungebremst.
- Wieso ist es nötig neben ein Gauge-Control noch einen weiteren Numeric-Indicator zu platzieren? Rechtsklick -> Visible -> Digitial Display -> Fertig? Und wieso aktualisierst du die Gauge-Controls mit 100 Hz, und einige der Numeric Indicators nur mit 10 Hz? Der typischer TFT-Monitor kann sowieso nur 60 Hz, für das menschliche Auge langen 10-20 Hz.
Fazit:
Ich entdecke 2-6 ungebremste While-Loops, die Datenerfassungsloop ist auf 1 kHz getrimmt, durch die Abhängigkeiten über Queues gilt das für 1-2 weitere Loops. Die Plots werden - sobald sie aktiv sind - ebenfalls mit 100 Hz aktualisiert, auch das ist heftig.
Und da wunderst du dich über 80% CPU?
Okay das sind einige Punkte an denen ich arbeiten kann!
- Aber wo genau soll ich die schleifen denn Bremsen? Ist die Reaktionszeit der Aktion die ausgeführt werden soll dann nicht wieder verzögert? Z.B.: Ich starte den Motor, lasse ihn fahren und möchte zu einem bestimmten Zeitpunkt, zu dem ich aufnehmen möchte, die Messung starten. Mit einer Verzögerung würden doch Werte verloren gehen, dadurch dass verzögert reagiert wird, bzw. es werden nicht exakt die Werte genommen bei denen ich aufnehmen möchte?
- Inwiefern könnte die Schleife unterhalb der Event-Struktur die CPU auslasten?
- Gauge-Controls aktualisiere ich etwas schneller, da es sonst nicht flüssig verläuft. Numeric Indicators jedoch sind sowieso viel zu schnell, da könnte ich noch etwas verlangsamen, stimmt.
07.05.2015, 15:17
Hallo Agenth,
noch ein kleiner Nachtrag:
ungebremst heißt ja nicht, dass in diesem Case in der Schleife nichts gemacht wird. In deiner "Betriebs-/Bewegungsarten"-Schleife prüfst du im Leerlauffall einige Variablen ab und setzt in deren Abhängigkeit andere Variablen. Das ist klassisches POLLING! Und das ist meistens performancelastig. Wenn sich deine Eingangsvariablen nicht ändern, dann wird auch das Resultat dasselbe sein. Diese Prüfung machst du aber so schnell, wie es deine CPU eben zulässt.
Gruß, Marko
noch ein kleiner Nachtrag:
ungebremst heißt ja nicht, dass in diesem Case in der Schleife nichts gemacht wird. In deiner "Betriebs-/Bewegungsarten"-Schleife prüfst du im Leerlauffall einige Variablen ab und setzt in deren Abhängigkeit andere Variablen. Das ist klassisches POLLING! Und das ist meistens performancelastig. Wenn sich deine Eingangsvariablen nicht ändern, dann wird auch das Resultat dasselbe sein. Diese Prüfung machst du aber so schnell, wie es deine CPU eben zulässt.
Gruß, Marko
08.05.2015, 06:26
(07.05.2015 15:17 )Trinitatis schrieb: [ -> ]Hallo Agenth,
noch ein kleiner Nachtrag:
ungebremst heißt ja nicht, dass in diesem Case in der Schleife nichts gemacht wird. In deiner "Betriebs-/Bewegungsarten"-Schleife prüfst du im Leerlauffall einige Variablen ab und setzt in deren Abhängigkeit andere Variablen. Das ist klassisches POLLING! Und das ist meistens performancelastig. Wenn sich deine Eingangsvariablen nicht ändern, dann wird auch das Resultat dasselbe sein. Diese Prüfung machst du aber so schnell, wie es deine CPU eben zulässt.
Gruß, Marko
Hallo Marko,
wie kann man das denn lösen? Habe überlegt, ob es eine Möglichkeit gibt diese Abfragen in eine Ereignisstruktur zu implementieren, wobei nur bei Wertänderung reagiert wird. Aber ich weiß nicht so recht, ob das mit Variablen auch so funktioniert. Bei den Buttons habe ich es ja mit Referezen realisiert, dies klappt.
Danke schonmal für den Tipp!
08.05.2015, 08:00
Schon ein Wait von 1-2 ms würde die CPU-Auslastung deutlich absenken!
Gruß, Jens
Gruß, Jens
08.05.2015, 08:15
(08.05.2015 08:00 )jg schrieb: [ -> ]Schon ein Wait von 1-2 ms würde die CPU-Auslastung deutlich absenken!
Habe ich drin und klappt auch ganz gut, bin aber immernoch bei 40-60% :/