Ankündigung

Einklappen

Serverwartung 21.2.



Am 21.2. im Laufe des späten Abends wird eine Serverwartung durchgeführt. Das Forum ist dadurch für gut zwei Stunden nicht erreichbar.
Es wird eine Wartungsseite geschaltet.

Mehr anzeigen
Weniger anzeigen

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