TIA 16 Bit Wert in 14 Bit Wert umwandeln

Max98

Level-1
Beiträge
1
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,
ich benötige eigentlich folgenden Ausdruck als SCL vielleicht kann, da mir jemand helfen.
Ich möchte die beiden höchstwertigen Bits einer Zahl auf 0 setzten und habe keine Bitweises UND (vgl C++) gefunden.
Datentyp wäre Egal, ob Word oder Int. Der Wert ist auch immer positiv.

C++ Code wäre:
SUM(14Bit)=SUM(BIT16) & 0x3FFF;

Vllt hat da auch jemand eine andere Idee wie das gehen kann :)
 
Ich möchte die beiden höchstwertigen Bits einer Zahl auf 0 setzten und habe keine Bitweises UND (vgl C++) gefunden.
Datentyp wäre Egal, ob Word oder Int. Der Wert ist auch immer positiv.
Könntest Du uns erklären, warum Du das tun willst? Eigentlich manipuliert man keine Bits in INT.
Wenn der Wert immer positiv ist, dann ist das höchstwertige Bit .15 sowieso schon 0. Wenn das zweithöchste Bit .14 = 1 ist, dann entspricht das auf 0 setzen einer Subtraktion von 16384. Willst Du das wirklich? Oder willst Du den Wert auf einen Höchstwert begrenzen (limitieren)?

Harald
 
Könntest Du uns erklären, warum Du das tun willst? Eigentlich manipuliert man keine Bits in INT.
Wenn der Wert immer positiv ist, dann ist das höchstwertige Bit .15 sowieso schon 0. Wenn das zweithöchste Bit .14 = 1 ist, dann entspricht das auf 0 setzen einer Subtraktion von 16384. Willst Du das wirklich? Oder willst Du den Wert auf einen Höchstwert begrenzen (limitieren)?

Harald
Es kann vorkommen, dass gewisse Geräte 14-bit Ganzzahlen zurückgeben und vorne noch 2 Steuerbit Zusatzbits mitsenden.
Ich glaub, ich hatte das mal bei einem Keyence-controller, bin mir aber nicht mehr sicher.
Ich hatte da mal einen Festo Drucksensor.
1680783066545.png

Damit werden jetzt nur die beiden Steuer Zusatzbits wegmaskiert.

Und wie ich gerade sehe, waren die bei mir hinten raus, also genügte bei mir ein SHR.
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Ja, die schlauen Anbieter packen die Zusatzbits/Statusbits (wie bei S5 auch schon üblich) in die niederwertigsten Bits, da kann man sie mit Vorzeichen-erhaltendem SHR rausschieben, oder durch 4 dividieren und wieder mit 4 multiplizieren, oder ausmaskieren, oder auch einfach drinlassen und ignorieren (die Wertigkeit ist ja geringer als die Wertigkeit des LSB).
 
Ja, die schlauen Anbieter packen die Zusatzbits/Statusbits (wie bei S5 auch schon üblich) in die niederwertigsten Bits, da kann man sie mit Vorzeichen-erhaltendem SHR rausschieben, oder durch 4 dividieren und wieder mit 4 multiplizieren, oder ausmaskieren, oder auch einfach drinlassen und ignorieren (die Wertigkeit ist ja geringer als die Wertigkeit des LSB).
Ich kenne das auch von Festo, Balluff usw. Habe immer SHR verwendet. Was meinst du mit „einfach drinnlassen“? 🤔
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich steh am Schlauch… ich gehe davon aus der hersteller schiebt das Ergebnis 2 Bits nach links bevor er es sendet 🤔 da kommt ja was komplett anderes raus.
 
Ich steh am Schlauch… ich gehe davon aus der hersteller schiebt das Ergebnis 2 Bits nach links bevor er es sendet 🤔 da kommt ja was komplett anderes raus.
Ja, da kommt natürlich etwas komplett anderes heraus, wenn man um 2 Bits nach links schiebt bzw. mit 4 multipliziert.
Darum verschiebt man die Bits nicht um 2 BitPositionen wieder nach rechts zurück, sondern belässt sie dort, wo sie sind.
Gehören die beiden Bits rechts nicht mehr zur Zahl, dann kann man sie wahlweise und willkürlich fest mit 00 oder 11 überschreiben oder man kann das, was nicht zur Zahl gehört. einfach dort stehenlassen.
Die kleinste darstellbare Einheit der Zahl ist dann 100 (= 4 dezimal) und der grösste durch die Willkür gemachte Fehler ist 11 (= 3 dezimal).
Die Information, ob hier ursprünglich ab- oder aufgerundet oder gar nicht gerundet wurde oder noch wahrscheinlicher: nie genau ermittelt wurde, ist unwiederbringlich verloren gegangen und nicht mehr rekonstruierbar.
Mit 14 Bit kann man einen MessBereich natürlich nicht so präzise abbilden, wie mit z.B. 15 oder 16 Bit.
Wenn man trotzdem auf die mögliche GenauigkeitsSteigerung verzichtet, hat das seine Gründe.
Meistens finanzielle, die man heutzutage nicht mehr ganz so schmerzlich nachvollziehen kann.
Wenn es z.B. um die AnalogDigitalUmsetzung von Werten geht, kann aber auch die für die Umsetzung erforderliche Zeit ein Kriterium sein.
Eine genauere Darstellung erfordert nicht nur mehr Bits, sondern auch mehr Zeit für die Wandlung.

An der Schnittstelle zwischen AnalogDigitalUmwandler und der Software ist es durchaus sinnvoll, die Position des höchstwertigen Bits an Ort und Stelle zu belassen und nicht die Position des niederwertigsten Bits. Darauf möchte ich hier nicht näher eingehen. Man vergleiche einfach mal den resultierenden Aufwand, wenn man z.B. die SW-Anpassung von einem 13-Bit ADU auf einen 15-Bit ADU ausführen müsste.
 
Was meinst du mit „einfach drinnlassen“? 🤔
So wie Heinileini schon schrieb: Drinlassen = nicht "plattmachen".

Oft braucht oder hat man von ADU gar keine 16 Bit Auflösung, weil die Genauigkeit der preisgünstigen Elektronik diese hohe Auflösung vielleicht gar nicht hergibt. Ein übliches Verfahren ist, den Analogwert vom ADU linksbündig in ein 16 Bit Word einzufügen, und damit unabhängig von der tatsächlichen Auflösung des Analogeingangs immer auf einen Wertebereich von 0 .. 32767 oder bei Siemens 0 .. 27648 zu normieren. Die übrig bleibenden niederwertigen rechten Bits des Word sind dann immer 0 - man kann diese ungenutzten Bits gut für zusätzliche Status-Informationen nutzen, ohne dass von der ADU-Information was verloren geht.

Beispiel: ein Sensor 0..10 Bar an einem Siemens Analogeingang auf 0..27648 normiert. Wenn der ADU 14 Bit auflöst, dann würde der ADU-Wert je Quantisierungsstufe um 4 springen (bei nur 12 Bit sogar um 16). Setzt man bei 14 Bit ADU die 2 niederwertigen Bits auf 0, dann könnte der Wandlerwert z.B. zwischen 27632 und 27636 hin und her springen. Die beiden Statusbits können den Wert um max. 3 erhöhen. Sind die beiden Bits z.B. 11 (3 dezimal) und man lässt sie drin, dann springt der Wert zwischen 27635 und 27639. Nach der Skalierung zu 0 .. 10.000 würde der Wert mit plattgemachten Bits zwischen 9.994 und 9.995 schwanken, mit Bits drin gelassen zwischen 9.995 und 9.996

2#0110_1011_1111_00_00 = 16#6BF0 = 27632 --> skaliert 9.994
2#0110_1011_1111_00_11 = 16#6BF3 = 27635 --> skaliert 9.995
2#0110_1011_1111_01_00 = 16#6BF4 = 27636 --> skaliert 9.995
2#0110_1011_1111_01_11 = 16#6BF7 = 27639 --> skaliert 9.996

Bei einem Analogeingang der vielleicht 0.5% Genauigkeit hat (entspricht hier 0.05 Bar), ist diese zusätzliche Verfälschung um ca. 0.01% nicht der Rede wert (und bei einer Skalierung 0 .. 10.00 nicht mal zu sehen) 🤷‍♂️

Harald
 
Zurück
Oben