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

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

Thema: Gleitzahl in Mantisse und Exponent zerlegen

  1. #1
    Registriert seit
    15.09.2004
    Beiträge
    86
    Danke
    13
    Erhielt 0 Danke für 0 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo,

    ich habe eine Simatic S7-300 315-2 DP, und als Software die Simatic Step 7 V 5.2

    Von einem Profibusteilnehmer bekomme ich einen Messwert als Gleitzahl im Bereich zwischen 1000 und 0,5 E -10
    Das Display in welchem der Wert angezeigt werden soll kann nur Integerzahlen darstellen.

    Jetzt suche ich einen eleganten Weg um die Gleitpunktzahl 32 Bit in eine 4stellige Mantisse und einen 2stelligen Exponenten mit Vorzeichen zu zerlegen.

    Im Moment würde ich die Zahl wiederholt mit 10 multiplizieren, oder durch 10 dividieren, bis das Ergebnis größer, bzw. kleiner 1 ist, um so den Exponent zu ermitteln. Danach würde ich die Mantisse durch Division bzw. Multiplikation mit der ursprünglichen Zahl mit dem Exponenten bestimmen, auf 4 Stellen kürzen usw...
    Das erscheint mir aber als keine sehr elegante Lösung, hat vielleicht jemand eine bessere Idee?

    mfG
    emtewe
    Zitieren Zitieren Gleitzahl in Mantisse und Exponent zerlegen  

  2. #2
    Registriert seit
    19.06.2003
    Beiträge
    2.200
    Danke
    85
    Erhielt 259 Danke für 175 Beiträge

    Standard

    Zitat Zitat von emtewe
    Hallo,

    ich habe eine Simatic S7-300 315-2 DP, und als Software die Simatic Step 7 V 5.2

    Von einem Profibusteilnehmer bekomme ich einen Messwert als Gleitzahl im Bereich zwischen 1000 und 0,5 E -10
    Das Display in welchem der Wert angezeigt werden soll kann nur Integerzahlen darstellen.
    Was soll es denn darstellen bei z.B. 0,456 ?
    0, dann reicht runden.

    Oder willst du Mantisse und Exponent anzeigen? Das nehme ich mal an.

    Den Exponenten kannst du über Logarithmen bestimmen: Bei einer Zahl zwischen 1000 und 9999.9... hat der Logarithmus zur Basis 10 die 1. Stelle 3. Der ganzzahlige Anteil des Logarithmus ist dein Exponent. Wenn du ihn vom Logarithmus abziehst und 10 hoch (Nachkommastellen des Logarithmus) rechnest, bekommst du die Mantisse.

    Weiß jetzt nicht, ob die S7 die Funktion "Logarithmus zur Basis 10" (dekadischer Logarithmus) hat.
    Wenn nicht: Logarithmus zur Basis 10(x) = natürlicher Logarithmus(x)/ natürlicher Logarithmus(10) .
    Zitieren Zitieren Re: Gleitzahl in Mantisse und Exponent zerlegen  

  3. #3
    Registriert seit
    28.06.2003
    Ort
    Nähe Bonn
    Beiträge
    291
    Danke
    15
    Erhielt 92 Danke für 71 Beiträge

    Standard

    Hallo emtewe,

    Du kannst die Mantisse und den Exponenten auch durch ausmaskieren aus der Gleitpunktzahl holen. Das Format von Gleitpunktzahlen ist sehr gut in der Hilfe zu S7 (Zahlendarstellung, Gleitpunkt) beschrieben.

    vill jröß (viele Grüße)

    Peter

  4. #4
    Registriert seit
    27.05.2004
    Ort
    Thüringen/Berlin
    Beiträge
    12.218
    Danke
    533
    Erhielt 2.696 Danke für 1.948 Beiträge

    Standard

    Hallo emtewe

    Hier mal eine Delphi-Funktion, da kannst du rausnehmen was du benötigst.

    Code:
    //Übergabe einer Gleitpunktzahl von S7 an Delphi
    //eingelesen werden 4 Byte, diese werden zu einer Integer-Zahl aufaddiert (-->Daten)
    //und müssen dann in eine Delphi-Gleitpunktzahl umgewandelt werden
    function S7_Float(Daten: Integer): Real;
    var
      Exp, Mant, Count: Integer;
      Mant_r, D_Real: Real;
    begin
      Exp := ((Daten shl 1) shr 24) - 127;
      Mant := (Daten shl 9) shr 9;
    
      Mant_r := 0;
      Count := 1;
      while Count <= 23 do
      begin
        //nachsehen, ob Bit an Stelle Count 0 oder 1
        if &#40;&#40;Mant and &#40;1 shl &#40;23 - Count&#41;&#41;&#41; > 0&#41; then
          Mant_r &#58;= Mant_r + Power&#40;2 , -Count&#41;;
        Count &#58;= Count + 1;
      end;
      //eine echte Null erzeugen !!!
      if &#40;&#40;Exp = -127&#41; and &#40;Mant = 0&#41;&#41; then
        Mant_r &#58;= 0
      else
        Mant_r &#58;= 1 + Mant_r;
      D_Real &#58;= Mant_r * Power&#40;2, Exp&#41;;
      //Vorzeichen testen und einrechnen
      if &#40;&#40;Daten shr 31&#41; > 0&#41; then
        S7_Float &#58;= -D_Real
      else
        S7_Float &#58;= D_Real;
    end;
    Ist vieleicht etwas umständlich, funktioniert aber
    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

  5. #5
    emtewe ist offline Benutzer
    Themenstarter
    Registriert seit
    15.09.2004
    Beiträge
    86
    Danke
    13
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Danke an alle, ich werde erstmal die Maskierungsmethode probieren, das scheint mir für die Zykluszeiten die beste Lösung.

    viele Grüße, besonders um die Ecke nach Niederkassel aus Troisdorf
    Michael

  6. #6
    Registriert seit
    19.06.2003
    Beiträge
    2.200
    Danke
    85
    Erhielt 259 Danke für 175 Beiträge

    Standard

    Zitat Zitat von Peter Wahlen
    Hallo emtewe,

    Du kannst die Mantisse und den Exponenten auch durch ausmaskieren aus der Gleitpunktzahl holen. Das Format von Gleitpunktzahlen ist sehr gut in der Hilfe zu S7 (Zahlendarstellung, Gleitpunkt) beschrieben.
    Na ja, aber die interne Darstellung nach IEE754 verwendet Exponenten zur Basis zwei, nicht 10. So etwas anzuzeigen ist nicht besonders sinnvoll. Den Zehner- aus dem Zweierexponenten zu bestimmen ist natürlich möglich, wegen des gebrochenen Umrechnungsfaktors können aber nicht normierte Ergebnisse (z.B. 10.0002 E3 statt 1.00002 E4 oder 0.0999E2 statt 0.999E1 auftreten).

  7. #7
    Anonymous Gast

    Standard

    Zitat Zitat von Zottel
    Na ja, aber die interne Darstellung nach IEE754 verwendet Exponenten zur Basis zwei, nicht 10. So etwas anzuzeigen ist nicht besonders sinnvoll. Den Zehner- aus dem Zweierexponenten zu bestimmen ist natürlich möglich, wegen des gebrochenen Umrechnungsfaktors können aber nicht normierte Ergebnisse (z.B. 10.0002 E3 statt 1.00002 E4 oder 0.0999E2 statt 0.999E1 auftreten).
    Stimmt. Werde wohl doch auf die Variante mit Logarithmenberechnung zurückgreifen. Ich werde den LN 10 als Variable speichern um mir jedesmal die Berechnung zu ersparen.

    danke nochmal an alle
    Gruß
    Michael

  8. #8
    Anonymous Gast

    Standard

    Hallo Emtewe,

    falls dein Display Strings anzeigen kann, kannst du mit dem
    FC 30 (R_STRNG) aus der IEC Bibliothek deinen Real wert in einen String verwandeln

    Die Funktion FC 30 wandelt eine Variable im REAL *Format in eine Zeichenkette. Die Zeichenkette wird mit 14 Stellen darstellt:

    ±v.nnnnnnnE±xx
    ±Vorzeichenv
    1 Vorkommastellen
    7 Nachkommastellenx
    2 Exponentenstellen
    Da du ja nur ein 4-stellige Mantisse haben willst, kannst du die überflüssigen Zeichen mit dem FC 4 (DELETE) aus der IEC Bibliothek löschen.

    mfg
    marlob
    Zitieren Zitieren Gleitzahl in Mantisse und Exponent zerlegen  

  9. #9
    emtewe ist offline Benutzer
    Themenstarter
    Registriert seit
    15.09.2004
    Beiträge
    86
    Danke
    13
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Zitat Zitat von Gast
    Hallo Emtewe,
    falls dein Display Strings anzeigen kann, kannst du mit dem
    FC 30 (R_STRNG) aus der IEC Bibliothek deinen Real wert in einen String verwandeln
    Gute Idee, danke. Das Display (Ebelt BT 1000) kann Zeichenketten darstellen, aber die Daten die zum Display geschickt werden landen auch in einem Datenlogger der daraus ein ASCII File erstellt welches anschliessend mit Excel ausgewertet wird. Eine Zeichenkette würde dort als 14 ASCII Zahlen ankommen. Das könnte zwar umgewandelt werden, mir wäre es aber lieber dort nur Zahlenformate abzulegen.
    Gruß
    emtewe
    Zitieren Zitieren Re: Gleitzahl in Mantisse und Exponent zerlegen  

  10. #10
    Registriert seit
    17.06.2004
    Ort
    Offenau
    Beiträge
    3.745
    Danke
    209
    Erhielt 421 Danke für 338 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    du kannst doch den exponent und die mantisse direkt aus der gleitpunktzahl auslesen...

    L ED 1 //Dein Eingangswort
    L DW#16#7F800000 //maskieren des exponenten
    SRD 23
    T EXPONENT

    deann müsstes du den exponenten im akku haben.

    L ED 1
    L DW#16#7FFFFF
    T MANTISSE

    nun kannst du ja mantisse und exponenten entsprechend deinen wünschen weiterverarbeiten..
    ---------------------------------------------
    Jochen Kühner
    https://github.com/jogibear9988/DotN...ToolBoxLibrary - Bibliothek zur Kommunikation mit PLCs und zum öffnen von Step 5/7 Projekten

Ähnliche Themen

  1. Exponent im SCL Code
    Von paula23 im Forum Simatic
    Antworten: 26
    Letzter Beitrag: 08.09.2013, 19:40
  2. Darum zerlegen in SCL
    Von holgero im Forum Simatic
    Antworten: 3
    Letzter Beitrag: 25.09.2011, 22:24
  3. Word im FB zerlegen
    Von Willy im Forum Simatic
    Antworten: 5
    Letzter Beitrag: 27.12.2010, 11:43
  4. Antworten: 3
    Letzter Beitrag: 28.03.2009, 09:47
  5. Mantisse und Exponent zu REAL
    Von Anonymous im Forum Simatic
    Antworten: 13
    Letzter Beitrag: 16.09.2005, 19:53

Lesezeichen

Berechtigungen

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