Ankündigung

Einklappen
Keine Ankündigung bisher.

Modbus float64 auswerten

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

    Modbus float64 auswerten

    Moin,
    wie kann ich ein Modbus float64 Register im Experten auswerten?
    Hab da schon einiges versucht mit konvertieren (u64/u32/u16) aber keine realistischen Werte bekommen.

    Gruß
    Michael
    Meine Installation: VM Debian Buster SH NG 1.8.1, SmartVISU 3.0, KNX, DMX, 1-wire, Fortigate 30E IPS, VMware vSphere 6.7

    #2
    Wird wohl etwas doof. Du musst den Wert als erstes als u64 laden und dann Vorzeichen, Exponent und Mantisse manuell zerlegen, da der EibPC keine 64-Bit Fließkommawerte unterstützt.

    Hast du schon verifiziert, dass der u64-Wert insgesamt passt, also mal im Debugger angeschaut und in einen Online-Konverter geworfen?

    Kommentar


      #3
      Zitat von foobar0815 Beitrag anzeigen
      Hast du schon verifiziert, dass der u64-Wert insgesamt passt, also mal im Debugger angeschaut?
      Ja habe mir den u64-Wert im Debugger angesehen. Der Wert passt nicht.


      Angehängte Dateien
      Meine Installation: VM Debian Buster SH NG 1.8.1, SmartVISU 3.0, KNX, DMX, 1-wire, Fortigate 30E IPS, VMware vSphere 6.7

      Kommentar


        #4
        Und wie sieht er im Debugger (Rohdaten!) aus, so dass man ggf drauf schließen kann, was nicht passt? (Word/Byte-Order)

        Kommentar


          #5
          image.png

          image.png

          Wenn ich da jetzt 5kWh nachlade ändert sich nur etwas in den letzten 6/7 Stellen​​.
          Der korrekte Werte ist aktuell 55,838kWh
          Zuletzt geändert von yachti; 16.04.2024, 11:31.
          Meine Installation: VM Debian Buster SH NG 1.8.1, SmartVISU 3.0, KNX, DMX, 1-wire, Fortigate 30E IPS, VMware vSphere 6.7

          Kommentar


            #6
            Wie geschrieben, bitte mit Rohdaten im Debugger. Exemplarisch:

            image.png

            Kommentar


              #7
              Zitat von foobar0815 Beitrag anzeigen
              Wie geschrieben, bitte mit Rohdaten im Debugger.
              ups, sorry
              image.png
              Meine Installation: VM Debian Buster SH NG 1.8.1, SmartVISU 3.0, KNX, DMX, 1-wire, Fortigate 30E IPS, VMware vSphere 6.7

              Kommentar


                #8
                hilft euch das?
                https://knx-user-forum.de/forum/%C3%...49#post1905649

                EPIX
                ...und möge der Saft mit euch sein...
                Getippt von meinen Zeigefingern auf einer QWERTZ Tastatur

                Kommentar


                  #9
                  Zitat von EPIX Beitrag anzeigen
                  hilft euch das?
                  Danke, das hatte ich mir schon angesehen bin damit aber nicht weiter gekommen.
                  Meine Installation: VM Debian Buster SH NG 1.8.1, SmartVISU 3.0, KNX, DMX, 1-wire, Fortigate 30E IPS, VMware vSphere 6.7

                  Kommentar


                    #10
                    Der Wert selbst passt:
                    image.png

                    Jetzt musst du den noch manuell konvertieren. Als neue Makrobibliothek anlegen:

                    Code:
                    :begin f64Inu64Tof32(uIn)
                    :shortinfo $f64 encoded in u64 to f32 converter$
                    :info $Convert u64 value to floating point number mit max. possible precision$ \\
                    $Input value (u64)$
                    
                    // 1 Bit
                    :var uSign@
                    uSign@=convert(shift(uIn, -32s08),0u32) and 0x80000000u32
                    
                    // 11 Bit, davon nur 8 verwendbar 1 .. 254, −126 .. +127. 1 .. 2046 −1022 .. +1023.
                    :var sExp@
                    sExp@=convert(shift(uIn, -52s08) and 2047u64, 0s32)
                    
                    :var sExpUnbias@
                    sExpUnbias@ = sExp@ - 1023s32
                    
                    :var uNewExp@
                    uNewExp@=0u32
                    
                    // denormalisierte Zahlen: uExo == 0
                    
                    // Max. darstellbarer Exponent -> Inf
                    if change(sExpUnbias@) then {
                        if sExpUnbias@ < -126s32 or sExpUnbias@ > 127s32 then uNewExp@ = 255u32 endif;
                        // Sonderfall +/-0 muss erhalten bleiben
                        if sExpUnbias@ == -1023s32 then uNewExp@ = 0u32 endif;
                        if sExpUnbias@ >= -126s32 and sExpUnbias@ <= 127s32 then uNewExp@ = convert(sExpUnbias@ + 127s32, 0u32) endif;
                    } endif
                    
                    // 52 Bit, davon nur 23 verwendbar
                    :var uMantissa@
                    uMantissa@=uIn and 4503599627370495u64
                    
                    :var uNewMantissa@
                    uNewMantissa@=convert(shift(uMantissa@, -29s08), 0u32)
                    
                    :var bSpecial@
                    bSpecial@=uNewExp@ == 0u32 or uNewExp@ == 255u32
                    
                    // Mantisse != 0 muss erhalten bleiben um Inf von NAN zu unterscheiden
                    if change(uMantissa@) then {
                        if bSpecial@ and uMantissa@ != 0u64 and uNewMantissa@ == 0u32 then uNewMantissa@ = 1u32 endif;
                    } endif
                    
                    :var zTmp@
                    zTmp@=$$c4
                    :var uTmp@
                    uTmp@=0u32
                    
                    :var fRes@
                    fRes@=0f32
                    
                    if change(uSign@) or change(uNewExp@) or change(uNewMantissa@) then {
                        uTmp@ = uSign@ or shift(uNewExp@, 23s08) or uNewMantissa@;
                        stringset(zTmp@, uTmp@, 0u16);
                        fRes@ = stringcast(zTmp@, 0f32, 0u16)
                    } endif
                    
                    :return fRes@
                    :end​
                    Und in einem Expertenprogramm aufrufen:

                    Code:
                    u64=4677907129867173888u64
                    
                    result=f64Inu64Tof32(u64)​
                    Liefert
                    image.png

                    Kommentar


                      #11
                      foobar0815 super vielen Dank. Funktioniert perfekt
                      Meine Installation: VM Debian Buster SH NG 1.8.1, SmartVISU 3.0, KNX, DMX, 1-wire, Fortigate 30E IPS, VMware vSphere 6.7

                      Kommentar

                      Lädt...
                      X