Zuviel Werbung? - > Hier kostenlos beim SPS-Forum registrieren

Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 12

Thema: Wandlung 32Bit Real nach 16Bit Gleitkomma

  1. #1
    Registriert seit
    20.01.2005
    Beiträge
    179
    Danke
    37
    Erhielt 13 Danke für 10 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo,
    hat jemand schon mal Codesys dazu bewegt eine 32Bit Real in einen 16Bit Real Wert (ja das gibt es wirklich!) zu wandeln, zur besseren Verständigung:

    16Bit Real soll sein:

    15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
    S E E E E M M M M M M M M M M M
    WERT := (-1)^S * (0.01*M) * 2^(E)

    Nun muß ich aber leider andersrum
    Mach ich mir das zu schwer oder ist das so kompliziert?

    Danke für Tips
    Michael
    Geändert von BadTaste (02.02.2010 um 15:12 Uhr)
    Zitieren Zitieren Wandlung 32Bit Gleitkomma nach 16Bit Gleitkomma  

  2. #2
    Registriert seit
    27.05.2004
    Ort
    Thüringen/Berlin
    Beiträge
    12.263
    Danke
    537
    Erhielt 2.708 Danke für 1.957 Beiträge

    Standard

    Hier http://de.wikipedia.org/wiki/Gleitkommazahl ist ja eine ganze Menge zum Thema zu lesen, inkl. einiger Rechenbeispiele. Reicht das vielleicht schon?
    Gruß
    Ralle

    ... there\'re 10 kinds of people ... those who understand binaries and those who don\'t …
    and the third kinds of people … those who love TIA-Portal

  3. #3
    Registriert seit
    19.05.2008
    Beiträge
    651
    Danke
    118
    Erhielt 136 Danke für 105 Beiträge

    Standard

    Hallo BadTaste,

    das hört sich nach einer schönen Aufgabe an.
    Aber was ist der Hintergrund?
    Hat das die Marketing-Abteilung versprochen,
    oder hat es technische Hintergründe?

    Letzteres kann ich mir schwer vorstellen, da es
    auf 2 Byte inzwischen ja nicht mehr so sehr ankommt.

    Als ganz einfache Lösung würde ich mit Interger arbeiten.
    Sofern der Zahlenraum ausreicht mit einem Faktor 100
    oder 1000 rechnen. Das sind dann indirekt deine 2 oder 3
    Nachkommastellen...

    Wenn das zu einfach ist, hilft nur dem Link von Ralle zu folgen...

    Gruß
    Chräshe
    Zitieren Zitieren Wieso einfach wenn's auch schwierig geht...  

  4. #4
    Registriert seit
    28.03.2008
    Beiträge
    142
    Danke
    19
    Erhielt 25 Danke für 25 Beiträge

    Standard

    Hier ein Thread mit einem ganz ähnlichen Thema, aber auch ohne Ergebnis:
    http://sps-forum.net/showthread.php?p=217071
    Komm und wecke den Teufel unter meiner Schädeldecke. Das Chaos hat die Macht!

  5. #5
    Avatar von BadTaste
    BadTaste ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    20.01.2005
    Beiträge
    179
    Danke
    37
    Erhielt 13 Danke für 10 Beiträge

    Standard

    Neinnein ich lese ein komisches Gerät über Modbus aus und die Japaner fanden das sie es nicht zu einfach für die Europäer machen sollten und nutzten das alte 16Bit Real Format.
    @Ralle
    Da habe ich auch schon geschaut aber bei log2(wert) hörte es dann mit codesys auf, dann dachte ich ist doch nicht so schlimm nehme ich eben die Bits aus der Real 32Bit und swap die auf den 16Bit... Mantisse zu Mantisse und Exp zu Exp Vorzeichen ist ja einfach.
    Nun habe ich aber das Problem das ich die Realzahl in Codesys gar nicht in Bits zerlegt bekomme. Dann habe ich (weil Wago841) gedacht da ja MD0 Bit x der Merker MX0.x sein muß kann ich ja dann die zahl selber zusammenbauen. Nun habe ich also folgendes gemacht:

    Code:
    FUNCTION_BLOCK FB_REA
    VAR_INPUT
        REAL32 AT %MD0 :REAL;
    END_VAR
    VAR_OUTPUT
        REAL32_to_REAL16:WORD;
    END_VAR
    VAR
        WORD_TEMP: WORD;
        E_OUT_TEMP:DWORD;
    END_VAR
    
    
    E_OUT_TEMP:=%MD0;
    
    (*        ### Vorzeichen ###        *)
    WORD_TEMP.15:=%MX0.15;
    (*        ### Exponent ###            *)
    WORD_TEMP.14:=%MX1.14;
    WORD_TEMP.13:=%MX1.13;
    WORD_TEMP.12:=%MX1.12;
    WORD_TEMP.11:=%MX1.11;
    (*        ### Mantisse ###            *)
    WORD_TEMP.10:=%MX0.10;
    WORD_TEMP.9:=%MX0.9;
    WORD_TEMP.8:=%MX0.8;
    WORD_TEMP.7:=%MX0.7;
    WORD_TEMP.6:=%MX0.6;
    WORD_TEMP.5:=%MX0.5;
    WORD_TEMP.4:=%MX0.4;
    WORD_TEMP.3:=%MX0.3;
    WORD_TEMP.2:=%MX0.2;
    WORD_TEMP.1:=%MX0.1;
    WORD_TEMP.0:=%MX0.0;
    
    REAL32_to_REAL16:=WORD_TEMP;
    Was aber komisch ist das das Bitmuster von E_OUT_TEMP unterschiedlich ist als REAL32

    Ich steh komplett auf dem Schlauch, mir würde schon reichen wie ich Bitx aus einer realzahl bekomme.

    schönen Abend
    Michael
    Geändert von BadTaste (02.02.2010 um 19:30 Uhr)

  6. #6
    Registriert seit
    27.05.2004
    Ort
    Thüringen/Berlin
    Beiträge
    12.263
    Danke
    537
    Erhielt 2.708 Danke für 1.957 Beiträge

    Standard

    Irgendwie glaube ich nicht daran, daß man das so einfach ummappen kann, denn Mantisse und Exponent beziehen sich ja bei jedem Gleitkommaformat auf unterschiedliche Formeln. Bei Codesys sollte es ja auch IEEE 754 sein oder?

    32-Bit Gleitkomma:

    Die Formel wäre:

    und für 64-Bit:

    Im Prinzip mußt du also die Formel für deine 16-Bit-Gleitpunkt kennen und daraus mit der zugehörigen Formel deinen Dezimalzahl berechnen. Anders herum mußt die nach dem Schema bei Wikipedia die Dezimalzahl in Mantisse und Exponent zerlegen, da kommst du um den log wohl nicht herum.
    Gruß
    Ralle

    ... there\'re 10 kinds of people ... those who understand binaries and those who don\'t …
    and the third kinds of people … those who love TIA-Portal

  7. #7
    Avatar von BadTaste
    BadTaste ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    20.01.2005
    Beiträge
    179
    Danke
    37
    Erhielt 13 Danke für 10 Beiträge

    Standard

    Hi,
    kann man denn den log zur Basis 2 mit codesys rechnen? Oder was mich auch brennend intressiert kann man ein Bit aus einer Realzahl separieren?

    schönen Tag
    Michael

  8. #8
    Registriert seit
    30.08.2005
    Beiträge
    280
    Danke
    41
    Erhielt 96 Danke für 66 Beiträge

    Standard

    Zitat Zitat von BadTaste Beitrag anzeigen
    Hi,
    kann man denn den log zur Basis 2 mit codesys rechnen? Oder was mich auch brennend intressiert kann man ein Bit aus einer Realzahl separieren?

    schönen Tag
    Michael
    Bitzugriffe, Rotate und Shift (Funktionen die du vermutlich brauchst) werden tatsächlich nicht für Real unterstützt. Aber CoDeSys unterstützt Pointer, bau dir doch deine Real Zahl in einem DWORD zusammen und verwende dieses DWORD dann über einen POINTER TO REAL,
    ptReal := ADR(dword);
    Dann kannst du entweder über den Pointer arbeiten oder mit
    realvar := ptReal^;
    den Wert in eine Realzahl kopieren. Umgekehrt geht das natürlich genauso.
    ptDword := ADR(real);
    dwordVar := ptDword^;
    Dann hast du das real in deinem DWORD und mit dem kannst du alles machen, was du willst.
    Ich würde mal im Internet nach C-Code suchen, der das erledigt, sowas muss eigentlich zu finden sein. Und wenn du's hinbekommst wäre das wohl ein guter Beitrag zur Veröffentlichung hier im Forum.
    Nachtrag: LOG2 gibts nicht in CoDeSys, aber ich kann mir fast nicht vorstellen, dass der notwendig sein wird. Eigentlich bin ich der Meinung, dass es reichen
    müsste den Exponent anzupassen und die Mantisse zu kopieren (sofern der Wertebereich passt).
    Geändert von Werner29 (03.02.2010 um 08:59 Uhr)

  9. Folgender Benutzer sagt Danke zu Werner29 für den nützlichen Beitrag:

    BadTaste (03.02.2010)

  10. #9
    Registriert seit
    11.07.2004
    Beiträge
    1.597
    Danke
    10
    Erhielt 213 Danke für 183 Beiträge

    Standard

    kann man denn den log zur Basis 2 mit codesys rechnen?
    Sicher, zwar nicht direkt, aber indirekt.
    Codesys kann mit dem natürlichen Logarithmus rechnen, das reicht aus. Die Formel sieht dann so aus:
    Code:
    Ergebnis:=LN(Eingangszahl)/LN(2);
    Natürlich sicherstellen dass nur mit Positiven Zahlen <> 0 gerechnet wird!

  11. Folgender Benutzer sagt Danke zu Oberchefe für den nützlichen Beitrag:

    BadTaste (03.02.2010)

  12. #10
    Avatar von BadTaste
    BadTaste ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    20.01.2005
    Beiträge
    179
    Danke
    37
    Erhielt 13 Danke für 10 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo werner29,
    danke für die guten Tips, so bekomme ich das hin!
    Auf den Pointer bin ich nicht gekommen dabei liegt es auf der Hand, inzwischen habe ich mir auch eine Lösung gebastelt, da ich eine temperatur übertrage und die sich nur zwischen 18 und 50°C liegt habe ich den Exp fest auf 4 eingestellt und arbeite dann mit multiplikation den Wert wieder richtig, da die zeit mich drängt werde ich mich später noch einmal damit befassen... ist ja nicht uninteressant.

    @Obercheffe
    na dann kann ich ja alles zusammenbauen... Thx
    Danke
    Michael

Ähnliche Themen

  1. DTR - Ganzzahl-Wandlung to real - AWL
    Von schneijo im Forum Simatic
    Antworten: 4
    Letzter Beitrag: 26.08.2011, 16:19
  2. Wandlung Real zu Int
    Von GerhardPtl im Forum Simatic
    Antworten: 46
    Letzter Beitrag: 07.03.2011, 14:24
  3. S7-200 - Wandlung Dezimalzahl nach Hex
    Von smartie im Forum Simatic
    Antworten: 5
    Letzter Beitrag: 05.05.2009, 13:36
  4. Umwandlung Integer(32bit) in Integer(16bit)
    Von Kojote im Forum Simatic
    Antworten: 4
    Letzter Beitrag: 18.08.2005, 10:56
  5. Wandlung von Real => INT
    Von Heinz im Forum Simatic
    Antworten: 4
    Letzter Beitrag: 29.07.2005, 12:33

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •