13.04.2011, 08:00
In meinem Projekt setze ich die Timer-Funktion (Get-Tick-Count) zur Synchronisierung von nicht so einfach zu synchronisierenden Prozessen ein.
Ich habe ine Datenquelle, die mit 32,045 ms Periode Werte generiert, diese puffert und DLL-gesteuert abliefert. Wie das nun bei Windows so ist, funktioniert das mit der Echtzeitfähigkeit überhaupt nicht und die Werte tauchen, je nach Systemauslastung, zu seltsamen Zeiten und in unterschiedlichen Packetgrößen auf. Doch, Hardwarepuffer sei dank, geht nichts verloren. Also hab ich ein VI geschrieben, das die Werte in ein Array packt und mit einem ms-Zeitstempel (Get-Tick-Count) der Übernahme versieht. So hab ich dann festgestellt, dass die Timerfunktion und meine externe Datenquelle sehr genau synchron laufen (ppm-Bereich).
Des weiteren habe ich eine Positionsberechnung mit der gleichen Funktion realisiert, da ich hier Startzeit und Geschwindigkeit kenne ...
Die unterschiedlichen Tasks sind in eigenen VI's untergebracht und tauschen über Notifiers und Queue die Daten aus.
Alles lief super bis ich noch eine Spannung über die PCI-6259 ausgeben wollte. Hab mir das Beispiel Gen Voltage Update.vi genommen, mit einer While-Schleife versehen, Wartezeit dazu, funktioniert. Doch wenn das VI zusammen mit den anderen VI's läuft, passen die Timerwerte nicht mehr. Die ursprünglich so genaue Datenquellenperiode von 32,045 ms ist ca. 0,5 ms kürzer.
Mein Rechner ist ein Dual-Core, die Systemlast liegt bei ca. 22%.
Eine timed loop hab ich auch schon probiert, gleiches Problem.
Da ich den Wert ca. 10-20 mal /s ändern will, bringt ein dauerndes neu erstellen und schließen des Tasks auch nichts.
Früher konnte man bei D/A-Karten einfach Werte in ein Register schreiben, aber das waren ja auch ISA-Karten (...und es hat auch öfters mal geknallt).
Kann man den DAQ-Manager irgendwie umgehen?
Vielen Dank
Joachim
[attachment=33264]
Ich habe ine Datenquelle, die mit 32,045 ms Periode Werte generiert, diese puffert und DLL-gesteuert abliefert. Wie das nun bei Windows so ist, funktioniert das mit der Echtzeitfähigkeit überhaupt nicht und die Werte tauchen, je nach Systemauslastung, zu seltsamen Zeiten und in unterschiedlichen Packetgrößen auf. Doch, Hardwarepuffer sei dank, geht nichts verloren. Also hab ich ein VI geschrieben, das die Werte in ein Array packt und mit einem ms-Zeitstempel (Get-Tick-Count) der Übernahme versieht. So hab ich dann festgestellt, dass die Timerfunktion und meine externe Datenquelle sehr genau synchron laufen (ppm-Bereich).
Des weiteren habe ich eine Positionsberechnung mit der gleichen Funktion realisiert, da ich hier Startzeit und Geschwindigkeit kenne ...
Die unterschiedlichen Tasks sind in eigenen VI's untergebracht und tauschen über Notifiers und Queue die Daten aus.
Alles lief super bis ich noch eine Spannung über die PCI-6259 ausgeben wollte. Hab mir das Beispiel Gen Voltage Update.vi genommen, mit einer While-Schleife versehen, Wartezeit dazu, funktioniert. Doch wenn das VI zusammen mit den anderen VI's läuft, passen die Timerwerte nicht mehr. Die ursprünglich so genaue Datenquellenperiode von 32,045 ms ist ca. 0,5 ms kürzer.
Mein Rechner ist ein Dual-Core, die Systemlast liegt bei ca. 22%.
Eine timed loop hab ich auch schon probiert, gleiches Problem.
Da ich den Wert ca. 10-20 mal /s ändern will, bringt ein dauerndes neu erstellen und schließen des Tasks auch nichts.
Früher konnte man bei D/A-Karten einfach Werte in ein Register schreiben, aber das waren ja auch ISA-Karten (...und es hat auch öfters mal geknallt).
Kann man den DAQ-Manager irgendwie umgehen?
Vielen Dank
Joachim
[attachment=33264]