Byte to Real

uwemiess

Level-1
Beiträge
49
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen.
ich möchte ein Byte in Real wandeln. Gibt es einen Standarbaustein der es ermöglicht den Byte Wert(auch negativ) in Typ Real zu wandeln?
Gruß Uwe
 
Sorry, war auf falschem Dampfer. Aber jetzt ein neuer dreizeiliger Versuch:

SLD 24 // Bit 7 nach Bit 31 bringen (Vorzeichen)
SSD 24 // Vorzeichenerweiterung in Bit 31 bis Bit 7
DTR // Nach Real wandeln
 
oder einfach:
Code:
L [I]MBx[/I]    // im Akku, der immer 16 Bit 
           //hat werden die führenden Nullen 
           //bei diesem Befehl immer gelöscht
ITD      // Int -> Doppel
DTR     // Doppel -> Real


Aber dürfte sich auch nicht um signed byte scheren :(
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
oder einfach:
Code:
L [I]MBx[/I]    // im Akku, der immer 16 Bit 
           //hat werden die führenden Nullen 
           //bei diesem Befehl immer gelöscht
ITD      // Int -> Doppel
DTR     // Doppel -> Real


Aber dürfte sich auch nicht um signed byte scheren :(
Ich denke, die Akkus haben 32 Bit. Aber die restlichen 24 Bits werden genullt.
 
Hallo zusammen.
danke für Eure mühe.
Ich habe das Problem sogelöst:
L #IN_BYTE
T LB 0
U #BIT_7
SPB NEG

// positiv
L #IN_BYTE
L 2#1111111 // 7Bit wert Vorzeichen ausblenden
UW
T #OUT_INT
SPA OVER

// negativ
NEG: L W#16#FF00
L #IN_BYTE
OW
T #OUT_INT

OVER: NOP 0
L #OUT_INT
ITD
DTR
T MD 410
Gruß Uwe
 
Hallo zusammen.
danke für Eure mühe.
Ich habe das Problem sogelöst:
L #IN_BYTE
T LB 0
U #BIT_7
SPB NEG

// positiv
L #IN_BYTE
L 2#1111111 // 7Bit wert Vorzeichen ausblenden
UW
T #OUT_INT
SPA OVER

// negativ
NEG: L W#16#FF00
L #IN_BYTE
OW
T #OUT_INT

OVER: NOP 0
L #OUT_INT
ITD
DTR
T MD 410
Gruß Uwe


So wird es nicht funzen :rolleyes:
 
Soweit ich das sehe, sollte es schon gehen. Zwar sind einige Zeilen drin, die nicht sein müssten, aber es funktioniert. Kürzer, aber eventuell schwerer verständlich, ist dies:

L #IN_BYTE
T LB 0
UN #BIT_7
SPB OVER
OD DW#16#FFFFFF00 // ITD wird implizit erledigt
OVER: DTR
T MD 410
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Soweit ich das sehe, sollte es schon gehen. Zwar sind einige Zeilen drin, die nicht sein müssten, aber es funktioniert. Kürzer, aber eventuell schwerer verständlich, ist dies:

L #IN_BYTE
T LB 0
UN #BIT_7
SPB OVER
OD DW#16#FFFFFF00 // ITD wird implizit erledigt
OVER: DTR
T MD 410



ich kann leider kein BIT_7 eingeben
Ich bekomme einen Fehler (Rot):confused:
 
ich kann leider kein BIT_7 eingeben
Ich bekomme einen Fehler (Rot):confused:

Du musst dir in deinem temporären Variablenbereich die einzelnen Bits von 0-7 symbolisch anlegen.
Code:
VAR_TEMP
  BIT_0 : BOOL ;    
  BIT_1 : BOOL ;    
  BIT_2 : BOOL ;    
  BIT_3 : BOOL ;    
  BIT_4 : BOOL ;    
  BIT_5 : BOOL ;    
  BIT_6 : BOOL ;    
  BIT_7 : BOOL ;    
END_VAR
Wichtig ist dabei dass die Variablen direkt am Anfang des Temp-Bereiches liegen wenn du vorher im Code das Eingangsbyte an LB0 geschrieben hast.
Alternativ könntest du auch
U L 0.7
schreiben.
 
Hallo Uwe,

ich hatte mir da mal nen Baustein gebaut signed Byte -> INT

SBYT_INT (nicht frei!)

Dann kann man weitermachen mit ITD und DTR

André

*ROFL* Prima Hilfe, Danke auch!

@Thomas_v2.1

Jo, so kann man das machen, mit den Lokaldaten, aber das kann sich leicht verschieben. Hab meine Bausteine daher umgeschrieben und lade die Adresse von #BIT_0, Schreibe dann das Byte über die Adresse. Damit kann man später auch mal etwas in die Lokaldaten einschieben, ohne, daß man die Adressen berichtigen muß.

Code:
L     P##BIT_0
LAR1  
L     #In_Byte
T     LB [AR1,P#0.0]

Nun kannst du ganz normal wie gehabt mit

L #BIT_7 dein Bit abfragen.

PS: Ist für den Fall nicht zwingend nötig, nur zur Anregung.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
einer- oder zweierkomplement? ich meine, das macht schon einen unterschied!
darüber hinaus: LB 0 und L 0.7 bringt mich zum brechen ... warum nicht UW benutzen und die funktion sauber programmieren?

[edit] ralle war schneller und der pointer macht natürlich auch sinn! [/edit]
 
Jo, so kann man das machen, mit den Lokaldaten, aber das kann sich leicht verschieben. Hab meine Bausteine daher umgeschrieben und lade die Adresse von #BIT_0, Schreibe dann das Byte über die Adresse. Damit kann man später auch mal etwas in die Lokaldaten einschieben, ohne, daß man die Adressen berichtigen muß.

Danke für die Idee mit dem Zeiger! Bei meinen FU-Bausteinen kopiere ich sonst auch die PEWs in Strukturen der Lokaldaten, um dann auf die Bits einfach zugreifen zu können. Ich habe zwar am Bausteinanfang sowas kommentiert, aber mit der Gültigkeit von Kommentaren ist das ja immer so eine Sache.

darüber hinaus: LB 0 und L 0.7 bringt mich zum brechen ... warum nicht UW benutzen und die funktion sauber programmieren?

Bei einem Baustein wie diesem mit ca. 10 Codezeilen halte ich es durchaus für legitim auch direkt mit den Lokaldaten zu programmieren.
Aber die Idee kam auch nicht von mir ;-)
 
Bei einem Baustein wie diesem mit ca. 10 Codezeilen halte ich es durchaus für legitim auch direkt mit den Lokaldaten zu programmieren.
Aber die Idee kam auch nicht von mir ;-)

legitim ist, was funktioniert - LEIDER! sauber ist, was andere nachvollziehen können ohne die genaue speicherbelegung des bausteins zu kennen! ... UND: mit zehn zeilen code kann ich aus OSB EPA-brot machen :ROFLMAO:
 
Zurück
Oben