String to Real und in Bytes aufteilen

Nyquist
2007-12-03
2007-12-05
  • Nyquist - 2007-12-03

    Hallo

    ich möchte einen String (eine zahl z.b 2765.678)

    in eine Real wandeln und diese dann verunden mit 16#000000FF

    um das erste Byte zuhaben und dieses dann in einem Array als Byte abspeichern.das ganze viermal sodass ich die RealZahl komplett in Bytes

    gespeichert habe denn ich kann nur Byteweise Messwerte übertragen.

    Hat vielleicht jemand eine Ahnung

    wäre echt nett

    Mit ferundlichem Gruß

    Nyquist

     
  • Oberchefe - 2007-12-03

    String_to_real, Ergebnis geteilt durch 100 (in ein Byte) schreiben, Byte mal 100 vom Ergebnis wieder abziehen, Rest in nächstes Byte, dieses plus 100 mal erstes Byte vom ersten Ergebnis abzeiehen , usw. usw.

     
  • Nyquist - 2007-12-03

    was????

    tut mir Leid aber das kapier ich auf keinem Auge

    könntest bitte mal ein Beispiel schreiben bei mir kommt nämlich nur müll raus

    bzw. Ich hab die Zahl schon in 4 Bytes zerlegt nur wie bekomme ich Sie ohne

    REAL TO String wieder zurück. WIe ist eine Real zahl in 32 Bit aufgeteilt. Das sollte ich wissen.

    Vielen Dank schonmal für deine Bemühungen

    MFG

     
  • Oberchefe - 2007-12-03

    sowas in der Richtung:

    MeinString:='2765.678';
    FloatTemp:= STRING_TO_REAL(MeinString);
    Byte1:=REAL_TO_BYTE(TRUNC(FloatTemp/100));
    Byte2:=REAL_TO_BYTE(TRUNC(FloatTemp-(Byte1*100)));
    Byte3:=REAL_TO_BYTE(TRUNC(100*(FloatTemp-((Byte1*100)+Byte2))));
    Byte4:=REAL_TO_BYTE(100*(FloatTemp-(BYTE_TO_REAL(Byte1)*100)+BYTE_TO_REAL(Byte2)+(BYTE_TO_REAL(Byte3)/100)));
    
     
  • J Schohaus - 2007-12-04

    Eine echte Zerlegung einer variable läst sich recht schnell durch Doppeldeklaration von Speierbereiche erledigen

    z.B.

    RealIN  AT %MB0 :  REAL := 5.0 ;
    
    Byte1 AT %MB0 : BYTE ;
    
    Byte2 AT %MB1 : BYTE ;
    
    Byte3 AT %MB2 : BYTE ;
    
    Byte4 AT %MB3 : BYTE ;
    

    Es ist nichts extra zu Programmieren da der Inhalt vom real auch gleichzeitig als Inhalt im bereich von den Byts ist.

    Ich weis es ist nicht ganz elegant aber es funktioniert und ist einfach!

    mfG Jochen Schohaus

     
  • Uwe - 2007-12-04

    Hallo Nyquist,

    ich stimme dir zu, der Ansatz on Oberchefe ist etwas gewöhnungsbedürftig

    und erreicht am Ende sicherlich nicht dein Ziel.

    Aber die Wandlung von String in Real kann man gefahrlos von Oberchefe übernehmen.

    rVar := STRING_TO_REAL(MeinString)

    Zum zerlegen in einzelne Bytes ist sicherlich der Weg von H. Schohaus der

    bessere Weg.

    Man könnte das aber auch über einen Pointer erreichen

    z.B.

    VAR
     ptByte         : POINTER TO ARRAY[0..3] OF BYTE;
     rVar            : REAL;
     Byte_1        : BYTE;
     Byte_2        : BYTE;
     Byte_3        : BYTE;
     Byte_4        : BYTE;
    END_VAR
     ptByte := ADR(rVar);
     Byte_1 := ptByte^[0];
     Byte_2 := ptByte^[1];
     Byte_3 := ptByte^[2];
     Byte_4 := ptByte^[3];
    

    Realzahlen sind als 32-Bit-Gleitkommazahlen mit single precision nach IEEE 754 codiert.

    D.h. 24 Bit Mantisse und 8 Bit Exponent.

    http://de.wikipedia.org/wiki/IEEE_754

    Du willst diese Werte ja, wenn ich das richtig verstanden habe, auf ein anderes System übertragen.

    Dort must du schauen welcher Datentyp dem REAL entspricht.

    Z.B. im Visual Basic gibt es den Datentyp SINGLE der dem Datentyp REAL

    entspricht und diesselbe Codierung aufweist (lediglich die Byteorder ist evtl. eine Andere).

    Gruß

    Uwe

     
  • Nyquist - 2007-12-04

    Hallo Uwe,

    ich muss sagen deine Antwort ist die sinnvollste.

    ich hab mir ein Array aus Real gebastelt und dort meine Messwerte reingelegt.

    von der Anfangsadresse aus bin ich dann mit einem POINTER OF BYTE

    durch dieses Array gegangen. Funktioniert einwandfrei

    Vielen Dank

    Herzliche Grüße Nyquist

     
  • Oberchefe - 2007-12-05

    Zitat:
    der Ansatz on Oberchefe ist etwas gewöhnungsbedürftig

    ich hatte das auch so verstanden daß immer zwei Ziffern in einem Byte landen sollen, würde dann ja auch nur funktionieren wenn es jeweils maximal 4 Stellen vor und 4 Stellen nach dem Komma sind.

     

Log in to post a comment.