Wenn dein Problem oder deine Frage geklärt worden ist, markiere den Beitrag als "Lösung",
indem du auf den "Lösung" Button rechts unter dem entsprechenden Beitrag klickst. Vielen Dank!
ein 24 Bit Zahlen-Parameter mit dem Wertebereich von +/- 2 hoch 22 soll vorzeichenrichtig, byteweise an eine serielle Schnittstelle RS232 übegeben werden.
Dazu würde ich den Wert gern in ein ByteArray aus 3 Elementen schreiben und als String an VISA übergeben.
Ich hab schon die unterschiedlichsten Wege ausprobiert. Aber als lausiger LabVIEW-Anfänger krieg ich es einfach nicht hin, dass sowohl negative als auch positive Parameter von meiner Schrittmotorensteuerung an der RS232 richtig interpretiert werden.
Wenn ich einen Integer oder Double in einen Hex-String konvertiere, um den String dann zu zerlegen, wird warscheinlich zwischen dem Vorzeichen und dem high-Byte noch ein vietes Byte mit dem Wert 00 eingefügt, da ein Integer ja nur 1,2 oder 4 Byte groß sein kann. So genau kann ich das aber auch noch nicht nachvollziehen. Der String kann außerdem so nicht an VISA-Write übergeben werden, da die Zahlen im String-Format nun als Zeichen und nicht mehr als Zahlenwert gedeutet werden.
Jedenfalls kommen die Parameter nicht so am Gerät an, wie sie sollen, damit die Motorensteuerung richtig reagiert.
Das zweite Problem ist, dass die Parameter, die danach von der Schrittmotorensteuerung zurückgegeben werden sollen, nie richtig bei VISA-Read ankommen, sonder immer nur Fehlermeldungen.
Wenn mir jemand in diesen Problemen helfen könnte, wer ich sehr dankbar.
Wenn ich dich richtig verstehe, genügt es, deinen I32-Wert über den "Flatten To String" (Palette: AdvancedData Maniulation) zu lassen, und dann den String mittels "String Subset" (Palette: String) auf 3 Bytes zu schneiden.
Du erhälst dadurch die binäre Repräsentation deines Wertes in einem 3-Byte langen String.
ich habe hier ein VI erstellt, der wahrscheinlich dein erstes Problem löst. Musst du ausprobieren.
Zum zweiten, kann deine Konfiguration für serielle falsch sein. Ich meine Timeouteinstellung. Ausserdem die VISA-Read-Routine kann fehlerhaft sein. Am besten benutzt du eine Queue und zwei Tasks: eine zum Auslesen, andere zum Auswerten(Parsen), wie im Bild unten.
didierj schrieb:Wenn ich dich richtig verstehe, genügt es, deinen I32-Wert über den "Flatten To String" (Palette: AdvancedData Maniulation) zu lassen, und dann den String mittels "String Subset" (Palette: String) auf 3 Bytes zu schneiden.
Du erhälst dadurch die binäre Repräsentation deines Wertes in einem 3-Byte langen String.
Ich glaube nicht dass nur das Abschneiden des Strings die richtige Lösung ist, denn auch negative Zahlen müssen konvertiert werden.
eugen graf schrieb:Ich glaube nicht dass nur das Abschneiden des Strings die richtige Lösung ist, denn auch negative Zahlen müssen konvertiert werden.
Die binäre Darstellung von negativen Zahlen wird binär so realisiert, dass mindestens das vorderste Bit eine 1 ist (2-er Komplement der positiven Zahl).
Somit istfür 4Byte-SIGNED-Zahlen ein Wertebereich von +(2^31)-1...-2^31 möglich. 4Byte-UNSIGNED-Zahlen haben im Gegensatz einen Wertebereich von +(2^32)-1...0.
Ist dein aktueller Wert nicht das Minimum, so ist nicht nur das vorderste Bit, sondern auch etwelche dahinter 1 bei negativen Zahlen.
Du willst eine 3Byte-Zahl mit Wertebereich +(2^22)-1...-2^22. In der ursprünglichen 4Byte-Zahl sind dann die vordersten 10 Bits 1 (bei negativen Zahlen). Somit kannst du getrost das vordere Byte abschneiden, du hast immer noch min. 2 Bits, die dir die negativen Zahlen darstellen.
vielen Dank für die sehr hilfreichen Antworten und dem Herrn Graf für die Arbeit, die er sich gemacht hat.
Die Antwort von Didier klingt logisch und deckt sich auch mit den Erkentnissen, die ich mit Hilfe von Eugens VI gemacht habe:
Der negative Zahlenwert wird nicht durch die gleiche Binärzahl wie für den Betrag der Zahl plus ein Vorzeichenbit verschlüsselt, sondern durch den maximalen speicherbaren Zahlenbetrag minus den Betrag der negativen Zahl. Somit bleiben die vordersten Bits bei negativen Werten immer 1.
Eugens VI hat leider nicht so ganz das gewünschte Ergebnis gebracht, erst nach dem ich einige Änderungen vorgenommen habe. Dabei hab ich genau die 8 Bit herausgeschnitten, die bei einem Int32 zwischen meiner 22 Bit Zahl und den vermeintlichen 2 Vorzeichenbits liegen. Nach Didiers Theorie war das warscheinlich gar nicht unbedingt nötig.
Mein erstes Problem ist damit nun erst mal gelöst. Vielen Dank dafür.
Das zweite lag wohl tatsächlich am zu kurzen Timeout von 20000 ms
SchwindelInside schrieb:Das zweite lag wohl tatsächlich am zu kurzen Timeout von 20000 ms
Schon etwas verrückt: Die Applikation wird (wie ich vermute) auf einem Rechner laufen, der mit mehreren GHz betrieben wird, und dann sind 20s timeout immer noch zu kurz. :screw:
Timeout von 20s bedeutet doch nur wenn die Daten nicht kommen, wird die Task für 20s angehalten und wenn inzwischen doch die Daten kommen läuft alles weiter.
Problematisch wird es nur wenn man das Programm beenden will und keine Daten kommen, dann wartet man halt bis zu 20 Sekunden.