Hallo alle zusammen,
ich arbeite erst seit 3 Wochen mit LV und meine Grundkenntnisse übers Programmieren sind auch nicht so berauschend.
Also: Ich möchte über LV mit VISA einen Messverstärker ansprechen, der im Normalmodus permanent seine Messwerte auf die serielle Schnittstelle schreibt. Es werden für jeden Messwert 5 Bytes übertragen:
-das erste dient der Synchronisierung
-das zweite ist Status-Byte
-3 bis 5 sind Daten-Bytes : HByte, MByte und LByte
es werden also 24 Bit übertragen
Die Registerwerte werden durch Semikolon getrennt übetragen, nachdem sie durch einen entsprechenden Befehl angefordert wurden. Es werden 2 bis 8 Daten-Bytes übertragen.
Nun zu meinen Fragen:
Wie kann ich das permanente Schreiben unterbinden?
Warum bekomme ich, nachdem ich einen Befehl gesendet habe, nicht die zu erwartente Antwort?
Wie kann ich die drei Daten-Bytes herausfiltern um diese Auszuwerten?
Ich hoffe auf eure Unterstützung
Hallo,
das permanente Schreiben kannst Du unterbinden, wenn Du eine Event-Structure verwendest. Dann wird irgendein Case nur nach einem bestimmten Event ausgeführt.
Wenn Du ein Schreibbefehl sendest, dann sollte "Read" nicht aktiv sein, wenn Du ein Abfragebefehl schickst, dann sollten beide aktiv sein. Vielleicht liegt es daran, dass Du nichts empfängst. Ich habe auch mal über VISA *RST (Reset) geschickt und hatte ein "Read" dabei. Dann hat das Gerät einfach keinen Reset durchgeführt.
Die Datenbytes kannst Du ja in ein Array schreiben und da gibt es ja einige Möglichkeiten, um irgendwelche Werte "rauszufiltern" (Index Array) oder zu löschen (Delete from Array),....
Gruß Markus
' schrieb:Hallo alle zusammen,
ich arbeite erst seit 3 Wochen mit LV und meine Grundkenntnisse übers Programmieren sind auch nicht so berauschend.
Also: Ich möchte über LV mit VISA einen Messverstärker ansprechen, der im Normalmodus permanent seine Messwerte auf die serielle Schnittstelle schreibt. Es werden für jeden Messwert 5 Bytes übertragen:
-das erste dient der Synchronisierung
-das zweite ist Status-Byte
-3 bis 5 sind Daten-Bytes : HByte, MByte und LByte
es werden also 24 Bit übertragen
Die Registerwerte werden durch Semikolon getrennt übetragen, nachdem sie durch einen entsprechenden Befehl angefordert wurden. Es werden 2 bis 8 Daten-Bytes übertragen.
Nun zu meinen Fragen:
Wie kann ich das permanente Schreiben unterbinden?
Warum bekomme ich, nachdem ich einen Befehl gesendet habe, nicht die zu erwartente Antwort?
Wie kann ich die drei Daten-Bytes herausfiltern um diese Auszuwerten?
Ich hoffe auf eure Unterstützung
' schrieb:Nun zu meinen Fragen:
Wie kann ich das permanente Schreiben unterbinden?
Warum bekomme ich, nachdem ich einen Befehl gesendet habe, nicht die zu erwartente Antwort?
Wie kann ich die drei Daten-Bytes herausfiltern um diese Auszuwerten?
Ich hoffe auf eure Unterstützung
Hallo Steve,
die Einstellungen der Schnittstelle solltest Du außerhalb der Whileschleife plazieren. (nach links aus der Schleifer rauslegen) Sonst wird die Schnittstelle mit jedem Schleifendurchlauf neu initialisiert. Das ist nicht notwendig und geht zu Lasten der Schnelligkeit.
Im selben Zuge solltest Du natürlich das Schliessen der Visa-Session ebenfalls aus der Schleife herausnehmen. (nach rechts ziehen zusammen mit dem Fehlerbehandler)
Was meinst Du mit permanentes Schreiben ?
Wenn Du das Schaltverhalten Deines Schreiben-Schalters auf "Latch beim drücken" änderst, sollte Dein Befehl nur einmal gesendet werden.
Welche Antwort bekommst Du denn auf Deinen gesendeten Befehl?
Hast Du mal mit Hyperterminal das ganze simuliert. Was erhältst Du dort als Antwort ?
Grüße
Andreas
' schrieb:Hallo Steve,
die Einstellungen der Schnittstelle solltest Du außerhalb der Whileschleife plazieren. (nach links aus der Schleifer rauslegen) Sonst wird die Schnittstelle mit jedem Schleifendurchlauf neu initialisiert. Das ist nicht notwendig und geht zu Lasten der Schnelligkeit.
Im selben Zuge solltest Du natürlich das Schliessen der Visa-Session ebenfalls aus der Schleife herausnehmen. (nach rechts ziehen zusammen mit dem Fehlerbehandler)
Was meinst Du mit permanentes Schreiben ?
Wenn Du das Schaltverhalten Deines Schreiben-Schalters auf "Latch beim drücken" änderst, sollte Dein Befehl nur einmal gesendet werden.
Welche Antwort bekommst Du denn auf Deinen gesendeten Befehl?
Hast Du mal mit Hyperterminal das ganze simuliert. Was erhältst Du dort als Antwort ?
Grüße
Andreas
Ich bedank mich für euer bemühen.
@ Andreas: Das permanente Schreiben bezog sich auf den Messverstärker. Er antwortet fast endlos. Keine Ahnung wieso und weshalb...
Ich werde eure Ratschläge jetzt in aller Ruhe ausprobieren und mich gegebenfalls noch mal melden!
Hallo Steve,
ich hab Dein Programm testweise hier laufen lassen.
Mit der Funktion der Kippschalter hab ich so meine Nöte.
Deshalb habe ich diese testweise durch Schaltflächen ersetzt.
Kannst Du mir sagen, was der Wert 59 als Abschlußzeichen darstellt?
Das ist mir so nicht geläufig.
Grüße
Andreas
' schrieb:Hallo Steve,
ich hab Dein Programm testweise hier laufen lassen.
Mit der Funktion der Kippschalter hab ich so meine Nöte.
Deshalb habe ich diese testweise durch Schaltflächen ersetzt.
Kannst Du mir sagen, was der Wert 59 als Abschlußzeichen darstellt?
Das ist mir so nicht geläufig.
Grüße
Andreas
Die 59 soll ein ";" bedeuten (ASCII). Ich hatte die Absicht, das immer nur bis zu dem ";" gelesen werden soll, damit ich die Daten dann auswerten kann. Klappt aber leider nicht so, wie ich es mir gvorgestellt hab.
' schrieb:Die 59 soll ein ";" bedeuten (ASCII). Ich hatte die Absicht, das immer nur bis zu dem ";" gelesen werden soll, damit ich die Daten dann auswerten kann. Klappt aber leider nicht so, wie ich es mir gvorgestellt hab.
Nochmal ich.
Danke nochmal für dein Bemühen.
Mir stellt sich jetzt aber dir Frage, wie ich die gelesenen Daten auswerten kann???
Beim Schreiben stell ich einen Befehl aus einer Befehlstabelle, den der Messverstärker mit unterschiedliche Anzahl von Daten-Bytes beantwortet. Und genau die Bytes benötige ich. Wie kann ich das machen?
Ich hoffe auf Unterstützung von euch?
' schrieb:Die 59 soll ein ";" bedeuten (ASCII). Ich hatte die Absicht, das immer nur bis zu dem ";" gelesen werden soll
Das brauchst Du nicht so zu machen.
Lies einfach alles ein was Du gesendet bekommst und dann kannst Du mit Stringoperationen den gelesenen Wert aufteilen und dann weiter verarbeiten. Da Du das Trennzeichen zwischen die Bytes kennst ist das kein Problem.
Anschließend mußt Du nur noch die Daten wieder zusammensetzen, damit Du den ursprünglichen Wert bekommst.
Stell doch mal einen Antwortstring hier rein, damit wird dann klar wie es weiter gehen sollte.
Dein Programm tut in der Hauptsache das was es soll.
Sende einfach mal einen Befehl aus der Befehlstabelle. Das kannst Du alternativ auch mit Hyperterminal machen.
Grüße
Andreas
Zum Auswerten von Daten musst du einen Parser programmieren.
Es geht so:
1) Du empfängst alle Daten in einer Whileschleife
2) Du übergibst diese Daten an eine weitere Whileschleife mittels einer Queue
3) In dieser weiteren Whileschleife suchst du deinen Syncbyte in den Daten
4) Wenn du Syncbyte gefunden hast, schneidest du an dieser Stelle deine Daten ab (mit Search und Split String)
5) Dann suchst du in dem abgeschnittenem String dein Abschlusszeichen und schneidest an dieser Stelle noch mal die Daten ab
6) Das was vor dem Abschlusszeichen steht ist ein Paket, das du leicht mit "Type Cast" in Zahlen umwandeln kannst.
7) Den Rest von abgeschnittenen Daten gibst du mit einem Schieberegister wieder an den Anfang der Whileschleife.
8) Die Daten, die von der vohrigen Whileschleife knüpfst du mit "Concancenate Strings" an das Ende deiner Daten
Ungefähr so, wie im Bild
Wenn unklar, nochmal Fragen
Gruss
' schrieb:Das brauchst Du nicht so zu machen.
Lies einfach alles ein was Du gesendet bekommst und dann kannst Du mit Stringoperationen den gelesenen Wert aufteilen und dann weiter verarbeiten. Da Du das Trennzeichen zwischen die Bytes kennst ist das kein Problem.
Anschließend mußt Du nur noch die Daten wieder zusammensetzen, damit Du den ursprünglichen Wert bekommst.
Stell doch mal einen Antwortstring hier rein, damit wird dann klar wie es weiter gehen sollte.
Dein Programm tut in der Hauptsache das was es soll.
Sende einfach mal einen Befehl aus der Befehlstabelle. Das kannst Du alternativ auch mit Hyperterminal machen.
Grüße
Andreas
Hier also eine Antwort vom Messverstärker.
Könnte ich nicht bei "VISA:Lesen" nen Befehl geben, das es mir nur die 5 Bytes ausliest? Oder liest es dann willkürlich irgendwelche?
Ich bin richtig begeistert von eurem Zuspruch! Da macht es Spass mit LV zu arbeiten bzw. es zu lernen...
Ich
' schrieb:Zum Auswerten von Daten musst du einen Parser programmieren.
Es geht so:
1) Du empfängst alle Daten in einer Whileschleife
2) Du übergibst diese Daten an eine weitere Whileschleife mittels einer Queue
3) In dieser weiteren Whileschleife suchst du deinen Syncbyte in den Daten
4) Wenn du Syncbyte gefunden hast, schneidest du an dieser Stelle deine Daten ab (mit Search und Split String)
5) Dann suchst du in dem abgeschnittenem String dein Abschlusszeichen und schneidest an dieser Stelle noch mal die Daten ab
6) Das was vor dem Abschlusszeichen steht ist ein Paket, das du leicht mit "Type Cast" in Zahlen umwandeln kannst.
7) Den Rest von abgeschnittenen Daten gibst du mit einem Schieberegister wieder an den Anfang der Whileschleife.
8) Die Daten, die von der vohrigen Whileschleife knüpfst du mit "Concancenate Strings" an das Ende deiner Daten
Ungefähr so, wie im Bild
Wenn unklar, nochmal Fragen
Gruss
Danke für deine Erklärung, aber mir sind leider noch einige Sachen unklar.
Was z.B. ist ein Syncbyte oder ein "Concancenate Strings"?
Sorry, bin noch ein Grünling im Bezug auf LV?