' schrieb:Hallo LabVIEWforumianer! Ich versuche zur Zeit einen Spektrumanalyser via GPIB bzw. mittels VISA auszulesen. Nun ist es aber so, dass jeder VISA-Read gerne einen Byte Count Wert hätte. Die Frage ist "simpel" wie komme ich an diesen? Folgendes habe ich schon probiert:
[attachment=46221:ByteCount.png]
Im ersten Versuch habe ich die Property Node: Bytes at Port versucht zu verwenden, leider löst diese einen Fehler aus, bzw. für das GPIB Interface ist diese Node nicht definiert/nicht unterstützt.
Im zweiten Versuch habe ich einfach einen Wert gesetzt, dieser muss natürlich lang genug sein, sonst werden die Strings nicht vollständig ausgelesen. Dies ist bei einfachen Befehlen noch nicht problematisch, allerdings geht es letztlich um das Auslesen eines Kurvenverlaufs mit variierender Punktezahl (diese kann ich einfach auslesen bzw. errechnen (die Punktezahl). Wie kann ich nun vorgehen um die genaue Anzahl der Bytes herauszufinden, oder bekomme ich ein "Ende"-Zeichen, so dass ich nach x-Iterationen des Read in einer Schleife, den Read abbrechen kann?
Noch eine weitere Frage:
Ich werde öfter im Program VISA-Read und -Write benutzen müssen in verschiedenen Programmbereichen:
a) Öffne ich in jedem Programmbereich via VISA-Open und Close neu?
b) Schleppe ich die Wires für Resource und Error durch das ganze Programm?
Irgendwie hört sich beides nicht so top an, wie macht mans richtig?
Nochmal anders gefragt: Sollte ich einen Read und Write in ein SubVI kapseln, muss der Nutzer ja VISA-Open und Close wieder herumbastelen, d.h. das SubVI ist nicht ohne weiteres eigenständig lauffähig.
Message Termination ist normalerweise das Zauberwort. Bei GPIB teilt das Gerät (ausser uralt Dynosuariers die noch nie was von IEEE 488.2 gehört haben) mittles Handshake mit wenn es das letzte Byte verschickt. Dann braucht man mit VISA nur noch einen Byte Count anzugeben der minimal so gross ist wie die längste erwartete Message. VISA Read bricht dann ab wenn:
1) dieser EOI (End of Information) gesehen wurde
2) die verlangten Bytes eingetroffen sind
3) das Timeout abgelaufen ist
4) ein Fehler aufgetreten ist
Bei serial funktioniert das auch und hier verwendet man meist einen Termination Character wie Carriage Return oder Line Feed.
Zu Deinen Fragen:
a) Nein bitte nicht!!!!!!!!!!
b) Ja!!! das ist kein Problem sondern hilft wenn sauber getan um eine eindeutige Abfolge in der Ausführung der Funktionen zu erreichen. LabVIEW ist Dataflow kontrolliert. Das heisst wenn Du mehrere Icons nebeneinander in ein Diagramm legst ohne dass da ein Wire vom einen zum anderen geht, ist die Reihenfolge der Ausführung dieser Funktionen zufällig und auf MultiCore Systemen sogar effektiv parallel. Das haben die meisten Instrumente gar nicht gern wenn man sie nicht in einer klar definierten Reihenfolge ansteuert.
Du schreibst Ja auch noch ein Programm darum, oder? Oder schreibst Du einen Instrumenten Treiber? Dann lese Dich doch mal in die Instrumenten Treiber Guidelines von NI ein. Funktionen in einem Instrumententreiber sind nicht völlig eigenständige VIs. Das wäre viel zu unflexible für eine professionelle Verwendung solcher Treiber.
Rolf Kalbermatter