Ankündigung

Einklappen
Keine Ankündigung bisher.

Umrechnen 4* Byte in Unsigned Long

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

    HS/FS Umrechnen 4* Byte in Unsigned Long

    ich bekomme einen Wert in der Form

    Byte1, Byte2, Byte3, Byte4

    geliefert und muss diesen in einen unsigned Long verwandeln.

    kann mir bitte jemand sagen, wie das geht?
    Danke Peter
    never fummel a running system...

    #2
    Zitat von TRex Beitrag anzeigen
    ich bekomme einen Wert in der Form

    Byte1, Byte2, Byte3, Byte4

    geliefert und muss diesen in einen unsigned Long verwandeln.

    kann mir bitte jemand sagen, wie das geht?
    Danke Peter
    Kommt darauf an, in welcher Reihenfolge die Bytes sortiert sind
    Byte1 *2^24 + Byte2 *2^16 + Byte3 *2^8 +Byte4
    wenn Byte 1 das höherwertige ist.
    offizielles Supportforum für den Enertex® EibPC: https://knx-user-forum.de/eibpc/
    Enertex Produkte kaufen

    Kommentar


      #3
      Fast alles ist möglich, das lässt sich sicher lösen aber erzähl uns doch mal woher und wohin die Bytes kommen
      HS? KO? UDP?

      Makki
      EIB/KNX & WireGate & HS3, Russound,mpd,vdr,DM8000, DALI, DMX
      -> Bitte KEINE PNs!

      Kommentar


        #4
        @TRex
        In welche Sprache programmierst du eigentlich?
        Gruß
        Saihtam

        >>> www.phoenixcontact.de <<<

        Kommentar


          #5
          oh sorry,
          das sind die Betriebsstunden und Einschalthäufigkeiten meiner Heizung via MOXA / UDP und sie sehen folgendermassen aus:

          29.10.2009 06:55:16 (Prot: UDP) (Port: 4002) (Absender-IP: 192.168.178.6)
          (Recv: 72) 0xfc 0x20 0xc 0x1 0x29 0x10 0x46 0x6 0x0 0x39 0x2 0x15 0x2 0x76 0x1 0xae 0x1 0x8 0x0 0x0 0x1 0xc0 0xfe 0xd8 0x1 0x6a 0xfe 0xda 0x1 0xe5 0x1 0x91 0x1 0xa6 0xd9 0xfc 0x22 0xc 0x2 0x0 0xc8 0x0 0x0 0x1 0xd5 0x0 0x0 0x1 0xf4 0x2 0x58 0x13 0x85 0x0 0x0 0x0 0xbe 0x0 0x0 0x1 0x81 0x0 0xff 0x0 0x0 0x1 0x0 0x1 0x64 0x0 0x37 0x73

          Es handelt sich um die kenntlich gemachten und ich will das in eine echte zahl umwandeln.
          never fummel a running system...

          Kommentar


            #6
            Also, es kommt natürlich drauf an, wie es definiert ist aber falls die gesuchte Zahl 385 ist hätten wir da
            0x00(Byte1)*256*256*256 + 0x00(Byte2)*256*256 + 0x01*256 + 0x81

            (oder in python (0x00<<24) + (0x00<<16) + (0x01<<8) + 0x81 aber die bitshifterei muss einem liegen, ersteres finde ich verständlicher )

            Makki
            EIB/KNX & WireGate & HS3, Russound,mpd,vdr,DM8000, DALI, DMX
            -> Bitte KEINE PNs!

            Kommentar


              #7
              danke, Makki
              never fummel a running system...

              Kommentar


                #8
                Zitat von makki Beitrag anzeigen
                Also, es kommt natürlich drauf an, wie es definiert ist aber falls die gesuchte Zahl 385 ist hätten wir da
                0x00(Byte1)*256*256*256 + 0x00(Byte2)*256*256 + 0x01*256 + 0x81

                (oder in python (0x00<<24) + (0x00<<16) + (0x01<<8) + 0x81 aber die bitshifterei muss einem liegen, ersteres finde ich verständlicher )
                Bitte aus Geschwindigkeits- und Stabilitätsgründen Polynome richtig ausrechnen:
                Code:
                (((Byte1)*256 + Byte2)*256 + Byte3)*256 + Byte4
                (Oder die Bit-Shift Lösung nehmen)

                Zugegeben: bei diesem kleinen Beispiel mit Integer-Werten macht das keinen großen Unterschied, doch wenn das Polynom etwas größer wird oder sobald mit Gleitkomma-Werten (float, double) gerechnet wird mach das einen Unterschied...
                TS2, B.IQ, DALI, WireGate für 1wire so wie Server für Logik und als KNX Visu die CometVisu auf HomeCockpit Minor. - Bitte keine PNs, Fragen gehören in das Forum, damit jeder was von den Antworten hat!

                Kommentar


                  #9
                  Habs mal in FUP gemacht mit Bit-Shift.
                  Angehängte Dateien
                  Gruß
                  Saihtam

                  >>> www.phoenixcontact.de <<<

                  Kommentar


                    #10
                    Und hier mal mit deinen Werten.
                    Angehängte Dateien
                    Gruß
                    Saihtam

                    >>> www.phoenixcontact.de <<<

                    Kommentar


                      #11
                      danke, habe mir für die Multiplikation einen kleinen Baustein geschrieben, den habe ich dann einfach hintereinander gehängt. Ist ja so einfach, wenn man weiss wie.

                      Da ich teilweise die Angaben in 0,1 habe ist darin auch der Teiler berücksichtigt.

                      Siehe Anhang...
                      Peter
                      Angehängte Dateien
                      never fummel a running system...

                      Kommentar


                        #12
                        Kannst du mal zeigen wie du ihn geschrieben hast? Nicht jeder kann .hsl-Dateien lesen.
                        Gruß
                        Saihtam

                        >>> www.phoenixcontact.de <<<

                        Kommentar


                          #13
                          ist kein Hexenwerk, mit dem normalen Editor reinsehen...
                          Anbei der Inhalt:

                          ### Peter Hoegg (c) 2005 ###

                          #### 2 Byte-Umwandlung (2Byte -> 16 Bit )
                          5000|"Wandler\2*1ByteTo16Bit"|0|3|"1 Eingang 1 Byte"|"2 Eingang 1 Byte"|"Divisor"|1|"16-Bit"

                          5001|3|1|0|1|0

                          5002|1|0|0
                          5002|2|0|0
                          5002|3|1|0

                          5003|1|1|0

                          5004|1|0|0|1 #A1



                          #Fehlerfall, division durch Null vermeiden
                          5012|0|"EN[3]==0"|"1"|""|0|0|1|0
                          5012|0|"EN[3]<>0"|"EN[3]"|""|0|0|1|0


                          5012|0|""|"((int(EN[1]) * 256) + int(EN[2])) / SN[1]"|""|1|0|0|0
                          never fummel a running system...

                          Kommentar


                            #14
                            Peter, ich sehe in Deinem Baustein mindestens ein Problem
                            Wie soll ichs erklären, die Bausteine werden ja pro Eingangsänderung abgearbeitet, dass die beiden Eingangsbytes aus derselben Messung kommen oder in der Richtigen Reihenfolge eintreffen ist nicht sichergestellt:

                            Nehmen wir mal an, Du bekommst zweimal einen 2byte Wert herein,
                            #1 0x00 0xFF
                            #2 0x01 0x02 (drei mehr als der letzte Wert)

                            Durchläufe Deines Bausteins:
                            1:
                            E1 0x00
                            E2 <unbekannt>
                            2:
                            E1 0x00
                            E2 0xFF
                            3:
                            E1 0x01
                            E2 0xFF
                            4:
                            E1 0x01
                            E2 0x02

                            Das Problem jeweils Fett, nur bei Durchlauf 2&4 wirst du den richtigen Wert am Ausgang haben! Einfachste Lösung: beide Bytes auf einen Eingang, Bedingung EC[1] und dann intern auftrennen und "in einem rutsch" rechnen:
                            (je nachdem wie sie vorliegen nehmen wir mal an als ASCII-String "000F" - ins blaue!)

                            5012|0|"EC[1]"|"((int(EN[1][0:2],16) * 256) + int(EN[1][2:4],16)) / SN[1]"|""|1|0|0|0

                            Makki
                            EIB/KNX & WireGate & HS3, Russound,mpd,vdr,DM8000, DALI, DMX
                            -> Bitte KEINE PNs!

                            Kommentar


                              #15
                              problem erkannt....
                              danke
                              aber wie bekomm ich die Werte dann vom Moxa - ip einlesen?
                              Einfach statt 1Byte 2 Byte einlesen?

                              bedeutet das 9:2 denn die die ersten 2 stellen?
                              "((int(EN[1][0:2],16) * 256) + int(EN[1][2:4],16)
                              never fummel a running system...

                              Kommentar

                              Lädt...
                              X