19.08.2006, 00:59
<div align="left">Wunderschönen Abend,
ich habe eine Precitec CHR 150-N Sensor-Steuerung in dem die Signale vom Sensor digitalisiert werden.
Die digitalisierten Messwerte werden mit 115200 Baud über die RS232 an meinen Omniputer geschickt.
Ich habe eine Messrate von 1000 Hz eingestellt. Außerdem werden nach meinen Einstellungen jeweils 20 Messwerte ein und der selben Messgröße noch vor dem Absenden zu einem Mittelwert zusammengefasst, sodass die effektive Rate der gesendeten Messwerte nur noch 50 Hz betragen sollte. Die Messwerte werden als Datenpaketen über die RS232 verschickt. Die Datenpakete enthalten 2 verschiedene Messwerte, bestehend aus jeweils 5 Ziffern als ASCII-Zeichen, getrennt durch ein Komma. Also in der Form 12345,54321 . Zwischen jedem Datenpaket wird eine Wagenrücklauf und ein Zeilenvorschub (CRLF) gesendet. Das hab ich bei VISA konfigurieren als Abschlusszeichen angegeben.
Im Instr-Eigenschaftsknoten werden soviele Bytes auf dem Port angezeigt wie die Größe des Puffers angezeigt wurde also standartmäßig 4096. Aufgrund des Abschlusszeichens werden nur 13 Bytes einschließlich Abschlusszeichen gelesen. Das ist auch gut und so.
Die Messwerte kann ich auf dem LCD-Display der Sensorsteuerung sehen. Sobald ich die Probe aus dem Messbereich nehme, wird der Messwert "0". Deshalb sehe ich ob die richtigen Werte in meinem VI ankommen die auch gerade vom Sensor gemessen werden. Dies ist aber leider nicht der Fall. Und da liegt mein Problem.:
Offensichtlich liest Das VI das Datenpaket, das als nächstes im Puffer rumhängt. Ich möchte aber immer das Datenpaket auslesen, das gerade eben vom Sensor gekommen ist. Am besten wäre es dabei aber wenn im Dauerbetrieb alle Messwerte erfasst werden. Das sollte bei einer effektiven Messrate von 50 Hz und 13 Byte pro Datenpaket auf einem 500 Mhz P3 mit WinXP doch möglich sein. Oder? Ich möchte die Messrate auch nicht noch weiter reduziern, da das auch die Genauigkeit und Auflösung meiner Messung beinträchtigt. Die Puffergröße möchte ich auch nicht reduzieren, ich ja auch verschieden Steuerbefehle an die Sensor-Steuerung senden möchte und die Antworten darauf auslesen möchte. Diese sind zum Teil um einiges größer als ein Datenpaket. Ich muss dazu sagen, das zur gleichen Zeit noch kontinuierlich 8-Bit Signale über eine zweite seriellen Schnittstelle von einem anderen Gerät mit 9600 Baud ausgelesen werden. Das könnte zusätzliche Rechenleistung beanspruchen. Die Signale brauche ich aber für die richtige Beendigung des Messvorgangs.
Ob mein VI es nun schafft alle Messwerte online zu verarbeiten oder nicht, wie bekomme ich eine zum Sensor synchrone Messwertaufnahme hin?
Gibt es eine Möglichkeit den Puffer jedesmal zu löschen nach dem ein Datenpaket ausgelesen wurde?
Ich habe darüber hinaus die Möglichkeit zur Synchronisierung die Messung zu starten in dem ich einen Steuerbefehl sende. Die Antwort darauf wird immer mit "readyCRLF" abgeschlossen. Dannach sendet der Sensor sofort wieder Datenpakete. Oder ich sende den Befehl zur Fortsetzung der Messung. Dann sendet er auch sofort wieder ein neues Datenpaket.
Im Übrigen möchte ich nicht all das in einem einzigen VI realisieren. Das VI für die Initialisierung und Konfiguration der seriellen Schnittstelle soll möglichst nur einmal beim Start der Anwendung aufgerufen werden. Wenn ich die Messung starte soll das VI ablaufen, dass die Synchronisationsbefehl sendet. Dannach sollen bis zum Abbruch alle Messwerte verarbeitet, im Diagramm angezeigt und in einen Array gespeichert werden. Das VIs für die beiden letztgenannten Funktionen spar ich mir hier, da die an sich bei mir funktionieren.
Die Abruchbedingung für die Beendigung der Messwertaufnahme soll, wenn es möglich ist, von einen anderen VI aus erfolgen, das aber nicht von dem Mess-VI selbst augerufen wird. Ich habe gelesen das soetwas über Objekt-Referenzen möglich ist. Ich stelle mir das wie eine Art Pointer in C++ oder Pascal vor. richtig? Das wäre eine tolle Sache aber ich komme damit in LV noch nicht so ganz klar. Der Abbruch soll allerdings nicht durch ein Bedienelement ausgelöst werden, sondern durch das interne Setzen einer Variable. Ich möchte auch möglichst vermeiden zusätzlichen Speicher für globale Variablen zu reservieren und Rechenleistung für deren Setzen innerhalb einer Schleife zu beanspruchen. Wenn ich eine Referenz an ein SubVI übergebe weiß LV nicht welcehen Datentyp der referezierte Wert hat und zeigt deshalb eine fehlerhafte Verbindung zum Eigenschaftsknoten an.
Wie kann ich das nun alles realisieren?
Ich wäre sehr dankbar, wenn mir jemand helfen könnte.
eine traumhafte Nacht wünsch ich
SchwindelInside
[attachment=2961]
[attachment=2962]
[attachment=2963]
</div>
ich habe eine Precitec CHR 150-N Sensor-Steuerung in dem die Signale vom Sensor digitalisiert werden.
Die digitalisierten Messwerte werden mit 115200 Baud über die RS232 an meinen Omniputer geschickt.
Ich habe eine Messrate von 1000 Hz eingestellt. Außerdem werden nach meinen Einstellungen jeweils 20 Messwerte ein und der selben Messgröße noch vor dem Absenden zu einem Mittelwert zusammengefasst, sodass die effektive Rate der gesendeten Messwerte nur noch 50 Hz betragen sollte. Die Messwerte werden als Datenpaketen über die RS232 verschickt. Die Datenpakete enthalten 2 verschiedene Messwerte, bestehend aus jeweils 5 Ziffern als ASCII-Zeichen, getrennt durch ein Komma. Also in der Form 12345,54321 . Zwischen jedem Datenpaket wird eine Wagenrücklauf und ein Zeilenvorschub (CRLF) gesendet. Das hab ich bei VISA konfigurieren als Abschlusszeichen angegeben.
Im Instr-Eigenschaftsknoten werden soviele Bytes auf dem Port angezeigt wie die Größe des Puffers angezeigt wurde also standartmäßig 4096. Aufgrund des Abschlusszeichens werden nur 13 Bytes einschließlich Abschlusszeichen gelesen. Das ist auch gut und so.
Die Messwerte kann ich auf dem LCD-Display der Sensorsteuerung sehen. Sobald ich die Probe aus dem Messbereich nehme, wird der Messwert "0". Deshalb sehe ich ob die richtigen Werte in meinem VI ankommen die auch gerade vom Sensor gemessen werden. Dies ist aber leider nicht der Fall. Und da liegt mein Problem.:
Offensichtlich liest Das VI das Datenpaket, das als nächstes im Puffer rumhängt. Ich möchte aber immer das Datenpaket auslesen, das gerade eben vom Sensor gekommen ist. Am besten wäre es dabei aber wenn im Dauerbetrieb alle Messwerte erfasst werden. Das sollte bei einer effektiven Messrate von 50 Hz und 13 Byte pro Datenpaket auf einem 500 Mhz P3 mit WinXP doch möglich sein. Oder? Ich möchte die Messrate auch nicht noch weiter reduziern, da das auch die Genauigkeit und Auflösung meiner Messung beinträchtigt. Die Puffergröße möchte ich auch nicht reduzieren, ich ja auch verschieden Steuerbefehle an die Sensor-Steuerung senden möchte und die Antworten darauf auslesen möchte. Diese sind zum Teil um einiges größer als ein Datenpaket. Ich muss dazu sagen, das zur gleichen Zeit noch kontinuierlich 8-Bit Signale über eine zweite seriellen Schnittstelle von einem anderen Gerät mit 9600 Baud ausgelesen werden. Das könnte zusätzliche Rechenleistung beanspruchen. Die Signale brauche ich aber für die richtige Beendigung des Messvorgangs.
Ob mein VI es nun schafft alle Messwerte online zu verarbeiten oder nicht, wie bekomme ich eine zum Sensor synchrone Messwertaufnahme hin?
Gibt es eine Möglichkeit den Puffer jedesmal zu löschen nach dem ein Datenpaket ausgelesen wurde?
Ich habe darüber hinaus die Möglichkeit zur Synchronisierung die Messung zu starten in dem ich einen Steuerbefehl sende. Die Antwort darauf wird immer mit "readyCRLF" abgeschlossen. Dannach sendet der Sensor sofort wieder Datenpakete. Oder ich sende den Befehl zur Fortsetzung der Messung. Dann sendet er auch sofort wieder ein neues Datenpaket.
Im Übrigen möchte ich nicht all das in einem einzigen VI realisieren. Das VI für die Initialisierung und Konfiguration der seriellen Schnittstelle soll möglichst nur einmal beim Start der Anwendung aufgerufen werden. Wenn ich die Messung starte soll das VI ablaufen, dass die Synchronisationsbefehl sendet. Dannach sollen bis zum Abbruch alle Messwerte verarbeitet, im Diagramm angezeigt und in einen Array gespeichert werden. Das VIs für die beiden letztgenannten Funktionen spar ich mir hier, da die an sich bei mir funktionieren.
Die Abruchbedingung für die Beendigung der Messwertaufnahme soll, wenn es möglich ist, von einen anderen VI aus erfolgen, das aber nicht von dem Mess-VI selbst augerufen wird. Ich habe gelesen das soetwas über Objekt-Referenzen möglich ist. Ich stelle mir das wie eine Art Pointer in C++ oder Pascal vor. richtig? Das wäre eine tolle Sache aber ich komme damit in LV noch nicht so ganz klar. Der Abbruch soll allerdings nicht durch ein Bedienelement ausgelöst werden, sondern durch das interne Setzen einer Variable. Ich möchte auch möglichst vermeiden zusätzlichen Speicher für globale Variablen zu reservieren und Rechenleistung für deren Setzen innerhalb einer Schleife zu beanspruchen. Wenn ich eine Referenz an ein SubVI übergebe weiß LV nicht welcehen Datentyp der referezierte Wert hat und zeigt deshalb eine fehlerhafte Verbindung zum Eigenschaftsknoten an.
Wie kann ich das nun alles realisieren?
Ich wäre sehr dankbar, wenn mir jemand helfen könnte.
eine traumhafte Nacht wünsch ich
SchwindelInside
[attachment=2961]
[attachment=2962]
[attachment=2963]
</div>