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

Ergebnis 1 bis 5 von 5

Thema: C# Ganzzahl wandeln in Gleitpunktzahl IEEE 754

  1. #1
    Registriert seit
    18.12.2009
    Beiträge
    8
    Danke
    0
    Erhielt 0 Danke für 0 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo

    Ich suche eine Funktion mit der ich in C# eine Dezimalzahl in eine Gleitpunktzahl im STEP7 Format bekomme.

    In Step7 kann man in Varibalen Beobachten Steuern einfach das Anzeige Format ändern, wo man dann auch die beiden Werte sehen kann.

    Operand Anzeigeformat Statuswert
    DB5.DBD 80 DEZ L#1056964608
    DB5.DBD 80 GLEITPUNKT 0.5

    Ein einfachse Konvertieren zu double oder float in C# funktioniert nicht.

    In S7 gibt es den Befehl DTR der das macht.
    Dieser Befehl hält sich an die Norm IEEE 754.

    Ich konnte aber leider keine fertige Funktion finden die eine Saubere Umwandlung hinbekommt.

    Habe selbst versucht das nachzuprogrammieren. Meine Funktion zeigt vor dem Komma richtige aber nach dem Komma falsche Werte an.
    Außerdem stürzt das Programm bei bestimmten Werten ab...


    Kennt da jemand eine Lösung?
    Würde mich über Antwort freuen.

    Gruß
    Sparx
    Zitieren Zitieren C# Ganzzahl wandeln in Gleitpunktzahl IEEE 754  

  2. #2
    Registriert seit
    21.10.2010
    Beiträge
    158
    Danke
    21
    Erhielt 29 Danke für 17 Beiträge

    Standard

    Keine Ahnung wie man das in C# macht, aber in C würde ich das so machen:
    Code:
    #include <stdio.h>
    #include <stdlib.h>
    int main()
    {
        int test = 1056964608;
        float *test2 = &test;
        float test3 = *test2;
        printf("%f", test3);
        return 0;
    }

  3. #3
    Registriert seit
    08.08.2007
    Ort
    Dresden
    Beiträge
    9.648
    Danke
    1.059
    Erhielt 2.046 Danke für 1.627 Beiträge

    Standard

    aus der S7net:

    Code:
    *
            #region ToByteArray
            public static byte[] ToByteArray(double value)
            {
                double wert = (double)value;
                string binString = "";
                byte[] bytes = new byte[4];
                if (wert != 0f)
                {
                    if (wert < 0)
                    {
                        wert *= -1;
                        binString = "1";
                    }
                    else
                    {
                        binString = "0";
                    }
                    int exponent = (int)Math.Floor((double)Math.Log(wert) / Math.Log(2.0));
                    wert = wert / (Math.Pow(2, exponent)) - 1;
    
                    binString += ValToBinString((byte)(exponent + 127));
                    for (int cnt = 1; cnt <= 23; cnt++)
                    {
                        if (!(wert - System.Math.Pow(2, -cnt) < 0))
                        {
                            wert = wert - System.Math.Pow(2, -cnt);
                            binString += "1";
                        }
                        else
                            binString += "0";
                    }
                    bytes[0] = (byte)BinStringToByte(binString.Substring(0, 8));
                    bytes[1] = (byte)BinStringToByte(binString.Substring(8, 8));
                    bytes[2] = (byte)BinStringToByte(binString.Substring(16, 8));
                    bytes[3] = (byte)BinStringToByte(binString.Substring(24, 8));
    
                }
                else
                {
                    bytes[0] = 0;
                    bytes[1] = 0;
                    bytes[2] = 0;
                    bytes[3] = 0;
                }
                return bytes;
            }
    [SIGNATUR]
    Ironie setzt Intelligenz beim Empfänger voraus.
    [/SIGNATUR]

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

    Standard

    Aus libnodave.net.cs:

    Code:
    public static void putFloatat(byte[] b, int pos, Single value)
            {
                byte[] bytes = BitConverter.GetBytes(value);
                if (BitConverter.IsLittleEndian)
                {
                    b[pos + 3] = bytes[0];
                    b[pos + 2] = bytes[1];
                    b[pos + 1] = bytes[2];
                    b[pos] = bytes[3];
                }
                else
                    Array.Copy(bytes, 0, b, pos, 4);
            }
    ---------------------------------------------
    Jochen Kühner
    https://github.com/jogibear9988/DotN...ToolBoxLibrary - Bibliothek zur Kommunikation mit PLCs und zum öffnen von Step 5/7 Projekten
    Zitieren Zitieren Aus libnodave.net  

  5. #5
    sparx ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    18.12.2009
    Beiträge
    8
    Danke
    0
    Erhielt 0 Danke für 0 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Danke für die Antworten.

    Meine kommt hier etwas sehr spät da ich zwischenzeitlich keine Zeit zum testen hatte.
    Mir gefiel funkey´s Lösung am besten weils einfach die Simpelste ist.
    Ich habe da etwas rum Probiert und mit folgenden änderungen läufts.

    So funktioniert es:

    Code:
    static void Main(string[] args)
            {
                unsafe
                {
                    int test = 1056964608;
                    float* test2 = (float*)(int*)&test;
                    float test3 = *test2;
                    Console.WriteLine(test3.ToString());
                }
            }

Ähnliche Themen

  1. Wandeln von IEEE 754 Zahlen bei der Modbus-RTU Biliothek
    Von WaEv im Forum CODESYS und IEC61131
    Antworten: 0
    Letzter Beitrag: 14.01.2010, 19:26
  2. BCD-Zahl in Ganzzahl (16 Bit) wandeln
    Von baui im Forum Programmierstrategien
    Antworten: 3
    Letzter Beitrag: 05.03.2009, 17:08
  3. Antworten: 13
    Letzter Beitrag: 25.01.2007, 10:06
  4. IEEE 754 -> S5 KG
    Von volker im Forum Simatic
    Antworten: 1
    Letzter Beitrag: 22.11.2005, 18:09
  5. IEEE-754 Fliesskommazahl und S5
    Von Ingo dV im Forum Simatic
    Antworten: 3
    Letzter Beitrag: 01.12.2004, 08:34

Lesezeichen

Berechtigungen

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