DEZ zu HEX ??

Einklappen
X
 
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge
  • mike1976
    Azubi
    • 08.11.2015
    • 9

    #1

    DEZ zu HEX ??

    Hallo,

    bräuchte mal ein wenig hilfe bitte.
    Stehe auf der Leitung.
    Habe einen Modbus Server von dem ich auch erfogreich Werte erhalte.
    Nur müsste ich die Erhaltenen Werte irgendwie umwandel damit die Anzeige Stimmt.

    Erhalte aus dem Register zb.:
    1214564 das wäre wenn ich in Hex umwandle 128864 und genau so würde ich es als anzeige benötigen.

    Jemand eine Idee?

    LG
    Angehängte Dateien
  • Thomas M.
    Lebende Foren Legende
    • 25.08.2015
    • 3252

    #2
    Ohne jetzt ein Programmierer zu sein, würde ich es mit picoC versuchen ...
    Meine C++ Vergangenheit ist ewig und 3 Tage her.

    https://www.c-plusplus.net/forum/top...nd-hex-mit-c/4

    Kommentar

    • mike1976
      Azubi
      • 08.11.2015
      • 9

      #3
      hi,

      habe gerade mal geschaft das ich den input 0 zu output 0 bekomme

      while(TRUE) {

      setoutput(0,getinput(0));
      sleep(100);
      }



      wie "bastle" ich jetzt die umwandlung rein?
      sorry

      Kommentar

      • Labmaster
        Lox Guru
        • 20.01.2017
        • 2574

        #4
        mike1976
        Du könntest es mal damit probieren:

        Eingang am Analog Input 1 (AI1)
        Ausgang am Textausgang 1 (TQ1)

        Code:
        int nEvents;
        char strBuf[16];
        
        while(TRUE)
        {
        nEvents = getinputevent(); // read Input changeflag bits
        if (nEvents & 0x08) // check only change on AI1
        {
        
        sprintf(strBuf, "%x", getinput(0) );
        setoutputtext(0,strBuf);
        
        }
        sleep(10); // give 10ms back to system
        }

        Du hast da halt ein kleines Problem
        HEX Werte enthalten halt auch Buchstaben (a bis f) , somit lässt sich ein darstellbarer Hexwert nicht als Dezimalzahl handhaben sondern ist ein String, also ein Text.

        Noch was:
        -für was wird der Hexwert dann überhaupt verwendet ?
        -das Script ist ungetestet.
        Zuletzt geändert von Labmaster; 26.11.2021, 08:41.

        Kommentar


        • mike1976
          mike1976 kommentierte
          Kommentar bearbeiten
          Wie müsste es ausehen wenn ich es auf AQ1 ausgeben will? Muss zu, schluss noch eine kommastelle dazu

        • mike1976
          mike1976 kommentierte
          Kommentar bearbeiten
          und wie würde das script aussehen bei 15 eingänge?
          Habe 15 Zähler die ich auslese, jetzt habe ich für jeden ein eigenes gemacht, doch leider bei dem 9 war schluss
          "Too much Programs"
          :-(
      • mike1976
        Azubi
        • 08.11.2015
        • 9

        #5
        Hallo,

        danke Labmaster

        Habe von der Firma Wachendorf einen Gateway M-Bus Master / Modbus TCP Server
        HD67044-B2-XX

        Der mir den M-Bus der Heizung ausliest und per Modbus TCP Server weitergibt.
        Bis jetzt hatte ich das ganze auf einem Raspberry pi3 laufen bzw läuft noch.
        Nun wollte ich Interesse halber mal testen ob es bei loxone auch möglich ist.

        Die werte kommen als Dez und wenn ich sie umwandle in hex, dann passen sie 1 zu 1 mit der anzeige am Heizungszähler.

        Dein Script scheint zu funktionieren.

        Lg
        Angehängte Dateien

        Kommentar

        • Labmaster
          Lox Guru
          • 20.01.2017
          • 2574

          #6
          mike1976
          Du kannst mal folgende probieren:

          Sollte halt aber über Modbus mal eine Dezimalzahl daherkommen welche einen Hexwert produziert welche einen Buchstaben enthält, dann kracht es eventuell, da dann atoi() einen nicht gültigen Nummernstring bekommt.

          Ich verstehe seitens des Herstellers nicht wie man so einen Mist machen kann.
          Kann es nicht sein, dass die richtige Heizungsanzeige die nicht umgewandelte Zahl ist und man die Anzeige auf dem Heizungszähler eher in dezimal umwandeln müsste ? Das wäre viel logischer.

          Eingang: AIx
          Ausgang: AQx
          (also AI1 zu AQ1, AI2 zu AQ2 .....)


          ### Variante als linearer Code ###

          Code:
          int nEvents;
          char strBuf[16];
          
          while(TRUE)
          {
          nEvents = getinputevent(); // read Input changeflag bits
          
          if (nEvents & 0x08) // check only change on AI1
          {
          sprintf(strBuf, "%x", getinput(0) ); // output as unsigned integer
          setoutput(0, atoi(strBuf) );
          }
          if (nEvents & 0x10) // check only change on AI2
          {
          sprintf(strBuf, "%x", getinput(1) ); // output as unsigned integer
          setoutput(1, atoi(strBuf) );
          }
          if (nEvents & 0x20) // check only change on AI3
          {
          sprintf(strBuf, "%x", getinput(2) ); // output as unsigned integer
          setoutput(2, atoi(strBuf) );
          }
          if (nEvents & 0x40) // check only change on AI4
          {
          sprintf(strBuf, "%x", getinput(3) ); // output as unsigned integer
          setoutput(3, atoi(strBuf) );
          }
          if (nEvents & 0x80) // check only change on AI5
          {
          sprintf(strBuf, "%x", getinput(4) ); // output as unsigned integer
          setoutput(4, atoi(strBuf) );
          }
          if (nEvents & 0x100) // check only change on AI6
          {
          sprintf(strBuf, "%x", getinput(5) ); // output as unsigned integer
          setoutput(5, atoi(strBuf) );
          }
          if (nEvents & 0x200) // check only change on AI7
          {
          sprintf(strBuf, "%x", getinput(6) ); // output as unsigned integer
          setoutput(6, atoi(strBuf) );
          }
          if (nEvents & 0x400) // check only change on AI8
          {
          sprintf(strBuf, "%x", getinput(7) ); // output as unsigned integer
          setoutput(7, atoi(strBuf) );
          }
          if (nEvents & 0x800) // check only change on AI9
          {
          sprintf(strBuf, "%x", getinput(8) ); // output as unsigned integer
          setoutput(8, atoi(strBuf) );
          }
          if (nEvents & 0x1000) // check only change on AI10
          {
          sprintf(strBuf, "%x", getinput(9) ); // output as unsigned integer
          setoutput(9, atoi(strBuf) );
          }
          if (nEvents & 0x2000) // check only change on AI11
          {
          sprintf(strBuf, "%x", getinput(10) ); // output as unsigned integer
          setoutput(10, atoi(strBuf) );
          }
          if (nEvents & 0x4000) // check only change on AI12
          {
          sprintf(strBuf, "%x", getinput(11) ); // output as unsigned integer
          setoutput(11, atoi(strBuf) );
          }
          if (nEvents & 0x8000) // check only change on AI13
          {
          sprintf(strBuf, "%x", getinput(12) ); // output as unsigned integer
          setoutput(12, atoi(strBuf) );
          }
          
          sleep(20); // give 20ms back to system
          }


          ### Variante mit Schleife ###

          PHP-Code:
          char i;
          int nEvents;
          char strBuf[16];
          
          while(TRUE)
          {
          nEvents = getinputevent(); // read Input changeflag bits
          
          for(i=0; i<13; i++)
          {
          if (nEvents & (0x08<<i)) // check only change on AIx
          {
          sprintf(strBuf, "%x", getinput(i) ); // output as unsigned integer
          setoutput(i, atoi(strBuf) );
          }
          }
          sleep(20); // give 20ms back to system
          } 
          
          Zuletzt geändert von Labmaster; 07.12.2021, 17:03.

          Kommentar

          • mike1976
            Azubi
            • 08.11.2015
            • 9

            #7
            Hi, danke für deine Antwort.
            Werde versuchen es am Abend zu testen.

            Bezüglich des Heizungszählers.
            Der ist von Qundis heat 5 mit einem
            M-Bus-Aufsatzmodul Q module.

            Da der Q heat auch ohne modul arbeitet und das ja nur ein zusatzt ist,
            ist die angezeigte Wärme schon die Richtige.
            Habe ja auch die Software von Qundis zum auslesen der einzelnen Zähler.

            Es kann natürlich auch sein das ich beim anlegen im Modbus server bei den Variablen was falsch gemacht habe.
            War damals schon froh das ich die werte auf dem pi bekommen habe und sie richtig darzustellen.


            Angehängte Dateien

            Kommentar

            • jensmh
              Smart Home'r
              • 25.08.2015
              • 98

              #8
              Ich lese den Qundis heat 5.5. mit dem M-Bus Aufsetzmodul aus (mit einem RasPi + M-Bus "Hat") - da kommen nur Dezimalzahlen an, allerdings in der Dimension "100 Wh" - also um auf kWh zu kommen muss man die Zahl durch 10 dividieren

              Kommentar

              Lädt...