11.05.2010, 09:22
Hallo zusammen,
bevor ich zu meiner Problembeschreibung komme, erstmal einige Eckdaten:
- LabVIEW 8.5 Application
- Win XP
- 4-fach USB Seriell Umsetzer (recht hochwertig im industrietauglichen Metallgehäuse von NS-COM)
- An jedem der vier seriellen Ports hängt ein Sensor (9600 Baud), welcher alle Sekunde ausgelesen wird
Nun zum Problem:
Mein Programm liest vier Sensoren über die vier seriellen Schnittstellen nach folgendem Muster aus:
VISA Konfigurieren/öffnen -> VISA Buffer leeren (in und out Buffer) -> Befehl an den Sensor schicken (VISA Write) -> Antwort vom Sensor empfangen (VISA Read) -> VISA CLOSE -> Daten in txt-Datei speichern
Diesen Muster läuft vier mal parallel in while-Schleifen, jede Schleife hat einen Takt von einer Sekunde. Der Befehl zum Anfordern eines Telegramms ist 5 Byte lang, die Antwort ca. 150 Byte.
Der String, welcher vom Sensor gesendet wird, hat als Endzeichen ein Linefeed. Dies ist unter VISA Konfigurieren auch so eingestellt. VISA READ soll max 500 Byte lesen, nach Timeout abbrechen oder eben nach meinem Linefeed beendet werden. Ganz normale Vorgehensweise.
Ich habe mein Programm nacheinander auf zwei verschiedenen PCs (A B) laufen lassen. Auf beiden PCs lüft es erstmal einwandfrei.
Nach einiger Zeit (Stunden oder Tage) bzw. nach tausenden erfolgreichen Telegrammen folgendes Szenario:
PC A: Die empfangenen Daten werden korrupt. Beim empfangenen Telegramm fehlen die ersten 10 bis 20 Bytes. Das Telegramm wird vom Sensor jedoch korrekt gesendet. Über ein T-Stück habe ich die serielle Leitung über einen anderen PC (Hyperterminal) abgehört. Kurz nachdem die Daten korrupt sind, dies kann bei einem, bei zwei, drei oder vier Sensoren vorkommen, erscheint vielleicht noch ein VISA WRITE ERROR und das wars. Der PC hängt sich auf, nicht einmal der Mauszeiger lässt sich mehr bewegen.
PC B: Hier werden die Daten nicht korrupt. Es wird gemeldet, dass keine Daten mehr empfangen werden können. Eine beliebige Anzahl von Schnittstellen melden einen VISA WRITE ERROR und das Programm hängt sich auf. Der PC hängt sich nicht auf.
Die Verzweiflung ist langsam groß. Folgendes habe ich bereits durchgeführt:
- VISA Empfangsbuffer in der Hardwarekonfig von 4096 auf 256 Byte verkleinert
- VISA Sendebuffer in der Hardwarekonfig von 4096 auf 256 Byte verkleinert
- Empfangs- und Sendebuffer werden im VI bei jedem Zyklus geleert
Eigentlich kann sich mein Programm nicht aufängen. Ich habe allen Fehlerstrippen ein Anzeigeelement spendiert. Meine Leseroutine solle auch OK sein. Da PC A und PC B unterschiedliche Verhaltensweisen zeigen, hege ich den Verdacht, dass es etwas mit Windows zu tun hat, aber was? Der einzigste Unterschied zwischen beiden PCs ist Win Service Pack 2 und 3.
Vielleicht liegt es aber auch daran, dass ich vier while Schleifen parallel laufen lasse. Sollte ich die vier Schnittstellen eher acheinanden in einer Sequenz aufrufen?
Ich könnte noch ewig weiter schreiben, aber vorerst sollte es reichen. Vielleicht kann mir jemand weiter helfen oder mein Problem kommt jemandem bekannt vor.
Grüßle
Matthias
bevor ich zu meiner Problembeschreibung komme, erstmal einige Eckdaten:
- LabVIEW 8.5 Application
- Win XP
- 4-fach USB Seriell Umsetzer (recht hochwertig im industrietauglichen Metallgehäuse von NS-COM)
- An jedem der vier seriellen Ports hängt ein Sensor (9600 Baud), welcher alle Sekunde ausgelesen wird
Nun zum Problem:
Mein Programm liest vier Sensoren über die vier seriellen Schnittstellen nach folgendem Muster aus:
VISA Konfigurieren/öffnen -> VISA Buffer leeren (in und out Buffer) -> Befehl an den Sensor schicken (VISA Write) -> Antwort vom Sensor empfangen (VISA Read) -> VISA CLOSE -> Daten in txt-Datei speichern
Diesen Muster läuft vier mal parallel in while-Schleifen, jede Schleife hat einen Takt von einer Sekunde. Der Befehl zum Anfordern eines Telegramms ist 5 Byte lang, die Antwort ca. 150 Byte.
Der String, welcher vom Sensor gesendet wird, hat als Endzeichen ein Linefeed. Dies ist unter VISA Konfigurieren auch so eingestellt. VISA READ soll max 500 Byte lesen, nach Timeout abbrechen oder eben nach meinem Linefeed beendet werden. Ganz normale Vorgehensweise.
Ich habe mein Programm nacheinander auf zwei verschiedenen PCs (A B) laufen lassen. Auf beiden PCs lüft es erstmal einwandfrei.
Nach einiger Zeit (Stunden oder Tage) bzw. nach tausenden erfolgreichen Telegrammen folgendes Szenario:
PC A: Die empfangenen Daten werden korrupt. Beim empfangenen Telegramm fehlen die ersten 10 bis 20 Bytes. Das Telegramm wird vom Sensor jedoch korrekt gesendet. Über ein T-Stück habe ich die serielle Leitung über einen anderen PC (Hyperterminal) abgehört. Kurz nachdem die Daten korrupt sind, dies kann bei einem, bei zwei, drei oder vier Sensoren vorkommen, erscheint vielleicht noch ein VISA WRITE ERROR und das wars. Der PC hängt sich auf, nicht einmal der Mauszeiger lässt sich mehr bewegen.
PC B: Hier werden die Daten nicht korrupt. Es wird gemeldet, dass keine Daten mehr empfangen werden können. Eine beliebige Anzahl von Schnittstellen melden einen VISA WRITE ERROR und das Programm hängt sich auf. Der PC hängt sich nicht auf.
Die Verzweiflung ist langsam groß. Folgendes habe ich bereits durchgeführt:
- VISA Empfangsbuffer in der Hardwarekonfig von 4096 auf 256 Byte verkleinert
- VISA Sendebuffer in der Hardwarekonfig von 4096 auf 256 Byte verkleinert
- Empfangs- und Sendebuffer werden im VI bei jedem Zyklus geleert
Eigentlich kann sich mein Programm nicht aufängen. Ich habe allen Fehlerstrippen ein Anzeigeelement spendiert. Meine Leseroutine solle auch OK sein. Da PC A und PC B unterschiedliche Verhaltensweisen zeigen, hege ich den Verdacht, dass es etwas mit Windows zu tun hat, aber was? Der einzigste Unterschied zwischen beiden PCs ist Win Service Pack 2 und 3.
Vielleicht liegt es aber auch daran, dass ich vier while Schleifen parallel laufen lasse. Sollte ich die vier Schnittstellen eher acheinanden in einer Sequenz aufrufen?
Ich könnte noch ewig weiter schreiben, aber vorerst sollte es reichen. Vielleicht kann mir jemand weiter helfen oder mein Problem kommt jemandem bekannt vor.
Grüßle
Matthias