LabVIEWForum.de - Wie einzelne Bits in einem Word verschieben?

LabVIEWForum.de

Normale Version: Wie einzelne Bits in einem Word verschieben?
Du siehst gerade eine vereinfachte Darstellung unserer Inhalte. Normale Ansicht mit richtiger Formatierung.
Hallo liebe Community, bzw. Experten in Lab-View,

ich benötige dringend eure Hilfe, nach langer Suche über Google und in Foren bin ich immer noch nicht fündig geworden und hoffe hier kann man mir helfen.

Ich fange mal an,... Ich lese mit LabView 2009 über die VISA Funktion ein RS232 Gerät aus und erhalte als Antwort zwei WORDS.

Um diese WORDS in eine physikalische Größe umwandeln zu können müßte ich ein Teil der Bits um eine Stelle nach rechts verschieben.

Ich hatte mich schon mit den Operatoren bitshift, rotation usw. beschäftigt. Bisher gelang es mir aber nicht nur einen gewissen Teil der Bits zu verschieben.

Im Anhang ist ein Bild vom Muster der Antwortstrings vom Gerät

Das Bit Nr. 7 bleibt immer 0 im Antwortstring.
Allerding muss ich zur Umrechnnung in eine physikalische Größe das Bit Nr. 8 im WORD 0 um eine Stelle nach rechts schieben, so daß AF7 bis AF0 ohne Lücke in Dez umgerechnet werden können.

Im Word 1 muss ich Bit Nr. 13 bis Bit Nr. 8 um eine Stelle nach rechts schieben, damit L12 bis L0 ebenfalls keine Lücken mehr hat.


Kurz gesagt das Bit Nr. 7 ist in der Antwort immer Null muss aber zur Umrechnung eleminiert werden.

Handelt es sich hier um eine Art von bitshift für einzelne Bits?

Und wenn ja wie funktioniert das in LabView, bisher konnte ich leider nur alle Bits im Word um eine Stelle verschieben, was aber keinen Sinn macht.

Ich verstehe sowieso nicht warum das Bit Nr. 7 immer Null bleibt aber man zur Umrechnnung eine Stelle aufrücken muss.


Wäre jemand so freundlich und würde mir weiterhelfen? Welche Funktion in LV kann man nutzen um das Problem zu umgehen.

Vielen Dank.


MfG
Dennis
Wenn ich richtig verstanden habe, dann so z.B.
[attachment=29033]
Gruß, Jens
Jens war schneller, hier der Varinantenvielfalt wegen noch meine Version:
[attachment=29034]
Lv09_img2[attachment=29035]
Aus RS232 wird original ein String empfangen. Wenn Du diesen String beschreibst und sagst, was mit den 3 Daten gemacht werden soll (soll das eine Gleitkommazahl werden?), dann läßt sich alles noch eleganter machen.
Zitat:Ich verstehe sowieso nicht warum das Bit Nr. 7 immer Null bleibt
Vieleicht ist RS232 hier auf 7 Bit konfiguriert.
Moin!

Ich würde beide Zahlen einfach in einen Boolean-Array umwandeln und dann per Indizes die notwendigen Bits tauschen. Oder liege ich da gerade komplett daneben?

Schöne Grüße
Falk
Erstmal möchte ich mich bei euch für die Antworten und Hilfe bedanken.

Bildchen und VIs helfen mir persönlich auch mehr als reiner Text, da ich noch ein Frischling in LabView bin, thanks :-)

@Lucki

Ja es soll eine Gleitkommazahl werden, genauer gesagt auf drei Stellen nach dem Komma.

Ich erwarte Werte zwischen 0,800 und 5,000 (Lambdaverhältnis)

Nachher werde ich eure verschiedenen Varianten ausprobieren und über mein Erfolg oder Misserfolg berichten.

Zusätlich kämpfe ich noch mit einem 2. Problem. Mein VI wird extrem langsam wenn ich die RS232 Schnittstelle öffne, dass sehe ich an meinem Chart vom PID-Regler, die Samplerate beträgt normalerweise 50ms und mit RS232 ca. 3 mal länger. Ich muss mal im Forum suchen oder ggf. ein neuen Thread aufmachen.


Ich bedanke mich nochmal ganz freundlich bei euch

Gruß
Dennis
Hallo, also mein VI funktioniert jetzt so wie ich es will. Ich hatte mich jetzt für Luckis Variante entschieden.

Allerdings ist meine Variante nicht die eleganteste und vielleicht auch nicht optimiert auf Leistung.

Kann jemand nochmal ein Blick auf mein VI werfen und ggf. was verbessern?

Besonders die rechte obere Ecke im Blockdiagramm gefällt mir nicht so, da gibt es doch bestimmt eine elegantere Version mit Arrays/Clusters ?

Meint Ihr ich verschwende Prozessorleistung mit dem aktuellen VI ? Vielleicht kann man auch dort noch etwas optimieren.

Um die Hilfe zu vereinfachen lade ich einfach mal das VI hoch.

Für Tipps und veränderungen wäre ich sehr dankbar.

Gruß
Dennis



LabView-Version vom Anhang: LV 2009 SP1
Lv09_img2
Hast Recht, oben rechts läßt sich etwas vereinfachen. Und unten rechts vielleicht auch, aber da weiß ich nicht, wie die Umrechnung sein soll.
Und dann würde ich nicht mehr als eine Bildschirmseite Raum verschwenden für das bisschen Code. Und ob alle 50ms neue Kommandos gesendet werden müssen, das mußt Du selbst wissen. Wenn es nur darum geht, daß die Anzeigen für den Betrachter immer aktuell sind, dann würden 100..200 ms auch genügen.

Lv09_img2[attachment=29081]
Danke Lucki, deine Veränderung ist für mich auch einleuchtend,... nur komme ich meistens nicht selber drauf von Anfang an.

Die einzulesenen Bytes hast du auf 20 erhöht, soll das eine Sicherheit zwecks Timings sein?

P.S. Die obere Visa-Funktion liest eigentlich permament die Bytes ein thoeretisch ohne Abfrage-String (finde ich nicht so leistungsoptimiert)
und die untere Visa Funktion antwortet nur nach einem Abfrage-String (polling Betrieb).



Gruß
Dennis
' schrieb:P.S. Die obere Visa-Funktion liest eigentlich permament die Bytes ein thoeretisch ohne Abfrage-String (finde ich nicht so leistungsoptimiert)
und die untere Visa Funktion antwortet nur nach einem Abfrage-String (polling Betrieb).
Wenn das so ist, dann würde ich die Abfrage voneiander unabhängig machen, damit nicht ein Buffer überläuft.
Eine andere Möglichkeit wöre, die eine Schleife zu lassen, dann aber das Wait herauszunehmen. Die untere Funktion würde dann genau so oft gepollt, wie die obere die Daten sendet, und das würde funtkionieren.
Es war übrigens ein Hauptfehler, die Schnittstelle immer wieder neu zu konfigurieren. Siehe das neue VI.

Die Erhöhung auf 20 Bytes ist von mit nur so ein Gefühlssache. Der Buffer wird ausgelesen, wenn TermChar eintrifft. Wenn die Stringlänge immer konstant 9 beträgt, dann muß an den Byteanschluß eine Länge von 9...beliebig groß angeschlossen werden.
Lv09_img2[attachment=29099]
Super Lucki,

so wird die RS232-Schnittstelle nicht alle 50ms neu initalisiert, was wahrscheinlich auch Rechnerleistung gekostet hatte.

Die untere Funktion lief bisher problemlos,
aber bei der oberen Funktion kann ich leider kein Polling machen, weil mein Controller schickte auch ohne "Anfrage-Strings" Bytes ohne Ende.
Obwohl ich nur 6 benötige, von daher musste ich gezielt mit der Funktion "String nach Muster durchsuchen" meine 6 Bytes herausfischen.

Besser hätte mir natürlich gefallen, dass mein Controller nur die gewollten 6 Bytes schickt auf Anfrage, jedoch lässt sich der Controller nicht umprogrammieren weil es ein Serienteil ist.

Ich füge dann dein VI in meinem Hauptprogramm ein und schaue ob ich damit weniger Rechnerauslastung habe, damit mein Chart (PID Regler) auch tatsächlich alle 50 ms aktualisiert wird.


Vielen Dank nochmal

Gruß
Dennis
Referenz-URLs