Ankündigung

Einklappen
Keine Ankündigung bisher.

Umwandlung Dezimal -> DPT9

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

    Umwandlung Dezimal -> DPT9

    Moin zusammen,

    eher zufällig habe ich gerade rausgefunden dass meine per knxd gesendeten Werte auf den Bus "ungenau" gesendet werden. Vermutlich ist es aber ein Thema in der Umrechnung vorher. Mein Mathe reicht leider nicht aus dafür, kann jemand erkennen wo das "Problem" ist?

    LG
    Tobias


    PHP-Code:
    $x =  DECtoDPT9(1000);
    echo (
    $x);

    // ergebnis: 36 1A (und auf dem Bus dann: 999,68) 


    Ergebnis: 36 1A (und im Gruppenmonitor in der ETS5 "so ungefähr" 1000, nämlich genau 999,68).

    PHP-Code:
    function DECtoDPT9($DEC)
       {
       
    $DEC *= 100;
       
    $dpt9 0;
       
    $exponent 0;
       if (
    $DEC 0)
          {
          
    $dpt9 0x08000;
          
    $DEC = -$DEC;
          }
       while (
    $DEC 0x07ff)
          {
          
    $DEC >>= 1;
          
    $exponent++;
          }
       if (
    $dpt9 != 0$DEC = -$DEC;
       
    $dpt9 |= $DEC 0x7ff;
       
    $dpt9 |= ($exponent << 11) & 0x07800;

       return 
    strtoupper(chunk_split(str_pad(dechex($dpt9 0x0ffff),4,'0',STR_PAD_LEFT),2,' '));
       } 

    #2
    dpt 9 ist nicht genau, da sind nicht sämtliche Zwischenschritte möglich!

    Kommentar


      #3
      OK, dann fang ich mal komplett von der anderen Seite an

      Wie kann ich den Wert 1000 per knxd sauber auf den Bus senden? Hatte ihn bisher mit obiger Funktion umgewandelt, aber erst heute zufällig gesehen dass die Werte nicht exakt sind...

      Kommentar


        #4
        dpt 7, dpt8, dpt16?
        Viele Wege führen nach Rom!
        hängt auch davon ab, wer es empfangen soll und welche Datentypen dort verstanden werden.

        Kommentar


          #5
          Mir würde momentan schon was reichen wo ich es mit dem knxd schon wieder exakt auslesen kann, es geht momentan um einen Zählerstand, am besten eine 6-stellige Zahl mit 2 (oder besser 4) nachkommsatellen, damit sollte sich alles abdeckan lassen...

          Kommentar


            #6
            DPT14 hätte 7-8 signifikante Ziffern (siehe https://de.wikipedia.org/wiki/Einfache_Genauigkeit)

            Kommentar


              #7
              Oder wenn es ganzzahlige Werte sein sollen (Komma weglassen) vielleicht DPT12, Wertebereich 0…4 294 967 295

              Kommentar


                #8
                Beides total gerne, ich finde nur leider kein Rechenbeispiel wie ich die Zahl umrechnen kann (Komma weglassen kann man ja auch mit ein bisschen Multiplizieren lösen ;-) aber die eigentliche Umrechnung...

                Hat jemand von euch eine DECtoDTPxxx-Funktion?

                LG
                Tobias

                Kommentar


                  #9
                  Was willst du den. Bei Ganzzahlen umrechnen? Da gibts doch nichts umzurechnen

                  Kommentar


                    #10
                    Also DPT12 ist einfach ein Longinteger.

                    dpt12.jpg

                    Für deinen Wert 1000 wäre das einfach die Hexdarstellung der Zahl 1000 => 3E8, und davor mit Nullen aufgefüllt, insgesamt 8 Bytes.

                    dpt12_debug.jpg

                    Oder die 1000 mit den zwei Nachkomma-Stellen angehängt dann 100000 => hex 0001 86A0
                    Zuletzt geändert von Gast1961; 29.12.2020, 18:19.

                    Kommentar


                      #11
                      Vielleicht ist der Wurm woanders, aber wenn ich die Hex-Werte sende, erkennt der Gruppenmonitor nicht mal die "Rohwerte"...

                      Bildschirmfoto 2020-12-29 um 18.27.29.png

                      Bildschirmfoto 2020-12-29 um 18.27.51.png
                      Angehängte Dateien

                      Kommentar


                        #12
                        Du sendest offenbar den falschen Datentyp, im Gruppenmonitor sind das irgendwie alles 2-byte-Telegramme und nicht 8 byte.

                        Mit knxd kann ich leider nicht helfen.

                        Kommentar


                          #13
                          Du musst mindestens der ETS sagen, was das für ein DPT ist. Sprich die Gruppenadresse anlegen und den richtigen DPT zuweisen. Dann am besten mal eine Zahl mit der ETS senden und schauen wie der knxd (im vbusmonitorX) es anzeigt.

                          Kommentar


                            #14
                            Danke, das hat mir sehr geholfen! Das HEXen und mit Nullen auffüllen und hinterher wieder DECen klappt perfekt, ich war wohl zu sehr auf die Zwischenkontrolle mit dem Gruppenmonitor fixiert. Der fehlende Datentyp führte datz dass die Werte hier falsch angezeigt wurden.

                            Kommentar

                            Lädt...
                            X