04.09.2009, 17:03
Hallo zusammen,
ich benötige etwas Hilfe bei der Zeitsteuerung von zwei Prozessen.
Und zwar habe ich eine Datenerfassung (NI-6009), die mir die Werte von einer Fotodiode ausliest und gleichzeitig
eine Linearachse, die mir eine Probe vor dieser Fotodiode in Ausbreitungsrichtung eines Laserstrahls hin und herfährt.
Das Problem ist, dass die Messwerte der Fotodiode der jeweiligen Achsenposition zugeordnet werden müssen. Leider bekomme ich
von der Achse aber nur ein Positionsfeedback, wenn sie ein "Go"-Kommando abgeschlossen hat.
Bisher bin ich also in möglichst kleinen Schritten gefahren, hab die Diode ausgelesen und dementsprechend meine Werte direkt mit dem
Feedback der Achse verknüpfen können. Leider ist das Ganze relativ langsam, weil die Kommunikation mit der Achse über RS232 läuft und nur ca alle 20 ms
ein Feedback kommen kann. Dadurch kann ich die volle Achsengeschwindigkeit nicht nutzen und eine Messung dauert ziemlich lang.
Meine Idee ist nun, die Kommandos zur Messwertaufnahme und zum Starten der Bewegung gleichzeitig zu geben, wobei die Achse die
volle Wegstrecke mit Maximalgeschwindigkeit zurücklegen soll (zwischendrin kein Feedback) und währenddessen die Fotodiode ausgelesen
wird. Der Auslesevorgang soll gestoppt werden, sobald die Achse am Ende ist und das Feedback (automatisch) gibt.
Wichtig dabei ist natürlich die Synchronisation zwischen:
a) Starten der Achse und Beginn der Messwertaufnahme und
b) Ausgabe des Feedbacks ("ich bin am Ende angekommen") und Beendigung der Messwertaufnahme.
Anschließend ordne ich einfach die Messwerte der entsprechenden Position - unter Annahme einer konstanten Geschwindigkeit zu.
ABER: Ich krieg es bisher einfach nicht hin.
Ich hab versucht zwei zeitgesteuerte Strukturen - genauer eine Schleife und eine Sequenz zu synchronisieren. In der Schleife
läuft dann die Messwerterfassung und in der Sequenz erfolgt das Start-Kommando für die Achse. Sobald die Achse fertig ist mit bewegen, kommt das Feedback und wird als "Position" in eine lokale Variable geschrieben. Die Schleife mit der Messwerterfassung soll stoppen, sobald der Wert der
lokalen Vaiablen dem Stop-Wert entspricht.
Soweit die Idee. Im angehängten Minimalbeispiel funktioniert das auch ganz gut. Vielleicht kann mal jemand drüberschauen und
mir ein kurzes Feedback dazu geben. Ist die Herangehensweise ok?
Ein Problem tritt jetzt auf, wenn ich die Achse mermals hin- und herbewege. Schließlich sollen auch auf dem Rückweg Messwerte erfasst werden.
Ich mach das ganze einfach mit einer kleinen For-Schleife und einer If-Abfrage. Hier bekomme ich allerdings "error 200429" von
NI DAQmx. Ich verstehe nicht warum. Der Fehler tritt manchmal auf, manchmal aber auch nicht.
DANKE für eure Hilfe!
ich benötige etwas Hilfe bei der Zeitsteuerung von zwei Prozessen.
Und zwar habe ich eine Datenerfassung (NI-6009), die mir die Werte von einer Fotodiode ausliest und gleichzeitig
eine Linearachse, die mir eine Probe vor dieser Fotodiode in Ausbreitungsrichtung eines Laserstrahls hin und herfährt.
Das Problem ist, dass die Messwerte der Fotodiode der jeweiligen Achsenposition zugeordnet werden müssen. Leider bekomme ich
von der Achse aber nur ein Positionsfeedback, wenn sie ein "Go"-Kommando abgeschlossen hat.
Bisher bin ich also in möglichst kleinen Schritten gefahren, hab die Diode ausgelesen und dementsprechend meine Werte direkt mit dem
Feedback der Achse verknüpfen können. Leider ist das Ganze relativ langsam, weil die Kommunikation mit der Achse über RS232 läuft und nur ca alle 20 ms
ein Feedback kommen kann. Dadurch kann ich die volle Achsengeschwindigkeit nicht nutzen und eine Messung dauert ziemlich lang.
Meine Idee ist nun, die Kommandos zur Messwertaufnahme und zum Starten der Bewegung gleichzeitig zu geben, wobei die Achse die
volle Wegstrecke mit Maximalgeschwindigkeit zurücklegen soll (zwischendrin kein Feedback) und währenddessen die Fotodiode ausgelesen
wird. Der Auslesevorgang soll gestoppt werden, sobald die Achse am Ende ist und das Feedback (automatisch) gibt.
Wichtig dabei ist natürlich die Synchronisation zwischen:
a) Starten der Achse und Beginn der Messwertaufnahme und
b) Ausgabe des Feedbacks ("ich bin am Ende angekommen") und Beendigung der Messwertaufnahme.
Anschließend ordne ich einfach die Messwerte der entsprechenden Position - unter Annahme einer konstanten Geschwindigkeit zu.
ABER: Ich krieg es bisher einfach nicht hin.
Ich hab versucht zwei zeitgesteuerte Strukturen - genauer eine Schleife und eine Sequenz zu synchronisieren. In der Schleife
läuft dann die Messwerterfassung und in der Sequenz erfolgt das Start-Kommando für die Achse. Sobald die Achse fertig ist mit bewegen, kommt das Feedback und wird als "Position" in eine lokale Variable geschrieben. Die Schleife mit der Messwerterfassung soll stoppen, sobald der Wert der
lokalen Vaiablen dem Stop-Wert entspricht.
Soweit die Idee. Im angehängten Minimalbeispiel funktioniert das auch ganz gut. Vielleicht kann mal jemand drüberschauen und
mir ein kurzes Feedback dazu geben. Ist die Herangehensweise ok?
Ein Problem tritt jetzt auf, wenn ich die Achse mermals hin- und herbewege. Schließlich sollen auch auf dem Rückweg Messwerte erfasst werden.
Ich mach das ganze einfach mit einer kleinen For-Schleife und einer If-Abfrage. Hier bekomme ich allerdings "error 200429" von
NI DAQmx. Ich verstehe nicht warum. Der Fehler tritt manchmal auf, manchmal aber auch nicht.
DANKE für eure Hilfe!