' schrieb:Hallo,
Folgendes Problem entzieht sich beharrlich der Lösung durch meine (bescheidenen) LabVIEW-Kenntnisse. Entschuldigt vorab die englischen Bezeichnungen - ich habe hier nur diese Sprachversion verfügbar.
Ich versuch das Voltcraft VC920 DMM mittels RS-232 und VISA auszulesen. Ein naiver Ansatz aufbauend auf dem "property node - bytes at port" und "VISA Read" funktionier auch nach meinen Vorstellungen, vorausgesetzt das VI wird nur einmal ausgeführt. Bei wiederholter Ausführung (nach Stopp, wobei VISA Close aufgerufen wird) liefert "VISA Read" aber den kryptischen Fehler -1073807298 (Hex 0xBFFF003E, Could not perform operation because of I/O error.). Dieser Fehler tritt erstaunlicherweise nur einmal auf und wird er ignoriert (verbundener error handler oder durch Betätigung von "Continue" im Fehlerdialog), so läuft das VI erwartungsgemäß weiter. Trotzdem finde ich die Option den Fehler permanent außer Acht zu lassen nicht erstrebenswert und hoffe ihr könnt damit mehr anfangen als ich. Jedenfalls habe ich die Ausgabe des NI Spy’s für einen erfolgreiche Aufruf im neu gestarteten LabVIEW (spy_1.txt) und einen erfolglosen Aufruf (2.) angehängt (spy_2.txt). Beide basieren auf dem simplen, ebenfalls beigefügten Prototype-VI (LV 8.5).
[attachment=43965:vc920_test_8_5.png] (LV 8.5)
Mein Google Reschärsche hat zwar zu dem beanstandeten Fehler viele Referenzen aufgeworfen - eine Lösung oder auch nur die Ursache konnte ich daraus aber nicht ableiten. Bin für alle Tipps und Ideen dankbar.
LV-Anfänger
[attachment=43966:spy_1.txt]
[attachment=43967:spy_2.txt]
Also ganz helfen kann ich dir wohl auch nicht aber Du hast da zwei Dinge die mich ziemlich stören. Das erste ist dass Du zwar Termination Character enablest (bewusst oder das wird default getan) aber danach trotzdem mit Avail_Bytes arbeitetest. Das Zweite ist bei einem Instrument das einen Termination Character hat (die zwei Punkte am Ende von zurückgelesenen Strings im viRead des Spylogs lassen mit fast 100% vermuten dass das wirklich so ist) eigentlich überflüssig da die VISA Read Funktion bei einem Read mit eingeschaltetem Termination Character ohnehin wartet bis entweder:
1) die verlangten Anzahl Character eingetroffen sind
2) der Termination Character gelesen wurde
3) das Timeout abgelaufen ist
4) ein Fehler aufgetreten ist
Avail Bytes hätte hier höchstens als Indikation, ob überhaupt Daten anliegen einen Sinn um bei einem Gerät dass sehr langsam Daten ausspuckt zu verhindern, dass VISA Read auf die nächsten Daten wartet während der Benützer die Applikation abschliessen möchte, und die Applikation erst abschliesst nach langer Wartezeit wenn das VISA Read endlich mit den Daten zurückkommt.
Also eventuel Avail_Bytes machen und wenn nicht 0, dann mit VISA Read mit einer viel grösseren Zahl die ganz sicher länger als der längstmöglich zurückgegebene String ist lesen.
Zweiter Nitpick, wenn Du schon Avail_Bytes verwendest solltest Du im Falle von 0 Bytes das VISA Read gleich in eine case Struktur legen. Es hat absolut keinen Sinn um diese Funktion aufzurufen um 0 Bytes zu lesen und das könnte eventuel die Schnittstelle durcheinander bringen.
Ohh und bitte solche Dinge nicht in eine Loop setzen die volle Pulle durchdreht. Da gehört schon ein Looptimer hinein der im Verhältniss der Berichthäufigkeit die Loop bremst. Das Metronom eignet sich dazu sehr gut. Es hat keinen Sinn 5000 mal pro Sekunde zu schauen ob da ein neuer String ist wenn das Gerät doch nur 2 pro Sekunde verschickt.
Noch ein Tipp, bei solchen Berichtschleudern, die ganz einfach immer Daten rauspusten ist es eine gute Idee um nach der Initialization erst die Buffer zu leeren.
Rolf Kalbermatter