Real in zwei Bytes

Mobi

Level-3
Beiträge
1.369
Reaktionspunkte
135
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

irgendwie steh ich grade auf den Schlauch, oder es liegt am Wetter.

Unzwar habe ich einen Realwert der von -50,0 bis 100,0 geht.
Dieses muss ich in zwei Bytes übertragen.
Den Wert vor dem Komma in ein Byte (inkl. Vorzeichen) und die Nachkommastelle in das andere Byte.

Ein einfacher Tipp könnte mir schon helfen, so als Anstoss.
 
Hallo,
also ein 'echter' Real-Wert hat 4 Byte.

Was du hier brauchst (oder beschreibst) ist eine 'Eigendefinition'. Darum musst du dich selber kümmern.

Aber: von wo nach wo überträgst du ? Welcher Übertragungsweg ??
Format Quelle ?
Format Ziel ?

bg
bb
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,
ich weiß nicht in welcher Programmiersprache Du das brauchst, deshalb in Pseudocode.

Zerlegen:
Code:
Byte1 := TRUNC(Realwert) ; // in Ganzzahl umwandeln durch Abschneiden der Nachkommastellen
Byte2 := TRUNC(Realwert * 10) MOD 10 ; // erste Nachkommastelle isolieren

Zusammensetzen:
Code:
Realwert : = INT_TO_REAL(Byte2) / 10.0 + INT_TO_REAL(Byte1) ;

Harald
 
Das Real-Werte 32 Bit groß sind weiß ich. Nur ich brauche halt nicht die ganze Bandbreite.

Ich will eine Temperatur mit hilfe eines Byte-Arrays an eine Visu senden. Und dafür möchte ich von dem Array zwei Bytes nehmen.
 
Danke PN/DP.

Ich hatte nochmal was getestet. Unzwar habe ich manuell in der Visu mal -2 eingetragen ins Array, daraus wird dann 254. Bei -10 ist es 246 als Byte. Kann mir das mal jemand erklären warum es so im negativen Bereich ist und wie man das umrechnet?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Für Siemens-Panels mit ProTool oder WinCCflex geht auch kurz:
Code:
Intwert := TRUNC(Realwert * 10) ; // -3276,8 ... +3276,7
Am Panel in der Anzeige einfach 1 Stelle von hinten ein Dezimalkomma einfügen.

Vielleicht kannst Du in Deiner VISU den Intwert auch einfach wieder 1:10 skalieren.

Harald
 
Unzwar habe ich manuell in der Visu mal -2 eingetragen ins Array, daraus wird dann 254. Bei -10 ist es 246 als Byte.
Es wird einfach das höherwertige Byte abgeschnitten (das FF) und das niederwertige Byte immer als positive Ganzzahl angesehen.
Oder Deine Visu kennt den Datentyp "signed Byte" (oder "signed Char") und in Deiner Steuerung beobachtest Du das Byte als unsigned.
Es ist nur eine Frage, wie man das Bitmuster im Byte interpretiert.

Harald
 
Zuletzt bearbeitet:
Super hat funktioniert. Für die, die es auch mal brauchen, siehe Anhang.
Der ABS ist drin, da ich ja die Nachkommastelle immer positiv haben will.

Die Steuerung macht die -10 auch zu 246.
 

Anhänge

  • Unbenannt.jpg
    Unbenannt.jpg
    16,3 KB · Aufrufe: 45
Zuviel Werbung?
-> Hier kostenlos registrieren
Der ABS ist drin, da ich ja die Nachkommastelle immer positiv haben will.
Na, ich bin mir nicht sicher, ob das für Deine Aufgabe richtig ist ...

Machst Du in der Visu zwei getrennte Ausgabefelder für Byte1 und Byte2 nebeneinander?

Falls Du aus den Byte1 und Byte2 die Realzahl wieder zusammensetzen willst, dann verkompliziert Dein ABS die ganze Sache. Dann müßtest Du die nun vorzeichenlose Nachkommastelle abhängig vom Vorzeichen des Byte1 addieren (bei +) oder subtrahieren (bei -).
Bei einfach immer nur zusammenaddieren ergibt sich z.B. folgendes:
Code:
                     Byte1 | Byte2     Byte1 + (Byte2/10.0)
Ohne ABS:  -1.5  --->   -1 | -5   --->     -1.5 
[COLOR="Red"]Mit  ABS[/COLOR]:  -1.5  --->   -1 | +5   --->     [COLOR="Red"]-0.5 !!![/COLOR]

Ehrlich gesagt gefällt mir der einfache Weg über einen verzehnfachten INT besser als Dein kompliziertes Eigenformat (siehe #6). Ein INT kann auch leicht in 2 Byte zerlegt und wieder zusammengesetzt werden.


Da fällt mir noch eine Verbesserung ein: die Nachkommastelle sollte unter Berücksichtigung eventuell folgender weiterer Nachkommastellen gerundet werden, damit z.B. 1.48 in 1 und 5 zerlegt wird und dann als 1.5 angezeigt wird. Achtung: dann muß man auch dafür sorgen, daß -1.98 in -2 und 0 zerlegt wird!

Gibt es in Deinem Programmiersystem auch eine RND-Funktion (Runden und wandeln in Ganzzahl)?
Code:
temp_INT := RND(Realwert * 10.0) ;
Byte1 := temp_INT / 10 ;
Byte2 := temp_INT MOD 10 ;

Alternativ geht's auch so, allerdings kennt diese Formel nicht die Geradzahl-Rundungsregel:
Code:
temp_INT := TRUNC((Realwert * 10.0) + (Realwert / ABS(Realwert) / 2.0)) ;
Byte1 := temp_INT / 10 ;
Byte2 := temp_INT MOD 10 ;
(habe zur Verdeutlichung der Rechenreihenfolge mal zusätzliche Klammern gesetzt)

Wenn Du die Nachkommastelle tatsächlich vorzeichenlos brauchst, dann eben so:
Code:
...
Byte2 := ABS(temp_INT MOD 10) ;

Harald
 
Die Steuerung macht die -10 auch zu 246.
Ist das nun ein Problem für Dich oder nur eine Feststellung?
Nicht die Steuerung macht die -10 zu 246, sondern die Interpretation Deines Beobachtungsprogramms.

Wenn Du in der Visu in ein signed Byte eine -10 eingibst, dann steht in dem Byte F9 hex drin.
Diese F9 hex werden zur Steuerung übertragen. Ob die Steuerung die F9 hex dann als -10 oder als 246 interpretieren soll ergibt sich aus Deinen weiteren Verarbeitungs-Befehlen. Dein Beobachtungsprogramm zeigt die F9 hex halt als 246 an.

Harald
 
Ich habe in der Visu zwei Ausgabefelder. Eins für die Vorkommastelle und eins für die Nachkommastelle.
Und so wie ich es gemacht habe, läuft es so wie ich es will. Hab es auch schon mit verschiedenen Werten versucht. Und ich habe auch immer nur eine Nachkommastelle.
 
Zurück
Oben