Ankündigung

Einklappen
Keine Ankündigung bisher.

Hexadezimal in Dezimal umwandeln

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

    #16
    Wir sind morgen noch auf der L&B, nächste Woche wieder mehr hier von meiner Seite - wir haben leider oder Gottseidank keine Zeit während der Messe groß ins Forum zu schauen.
    So soll es doch auf einer Messe sein (auch wenn die Füße einem ständig etwas anderes einreden wollen...)

    Kommentar


      #17
      Hi Bernd,

      also auch wenn es strange aussieht, es funktioniert.

      Vielen Dank an Dich, dass ich heute doch nicht frustriert ins Bett gehen muß.

      Dann baue ich jetzt einmal ein L2BEI-Makro (Little to Big Endian Inverter).

      Viele Grüße

      Michael

      Kommentar


        #18
        Hallo Zusammen,

        ich stoße nun wieder auf ein mir bereits bekanntes Umsetzungsproblem bei der Auslagerung von Code in ein Makro.

        An sich ist diese Auslagerung ja kein Problem, außer es ist ein Mehrfachaufruf des Makros aus einer if-Abfrage im Spiel.

        Im realen Programm greife ich bis zu 20x aus einer if-Abfrage mit Split auf den Buffer_WP zu.

        Wenn ich hier wegen des Makros gleiche Variablen vermeiden würde und somit WPSplit1 bis WPSplit20 und WPInverter1 bis WPInverter20 definieren würde, müßte ich diese 40 Variablen auch vor der if-Abfrage definieren. Somit spare ich mit dem Makro in Summe nicht wirklich viele Code-Zeilen ein.

        Wie löst man das Auslagern in ein Makro anhand dieses Beispiels am sinnvollsten?

        Viele Grüße

        Michael


        [highlight=epc]
        if change(Buffer_WP) then \\
        WPSplit=split(Buffer_WP,52u16,55u16);\\
        WPInverter=split(WPSplit,3u16,4u16)+split(WPSplit, 2u16,3u16)+split(WPSplit,1u16,2u16)+split(WPSplit, 0u16,1u16);\\
        WP_Temperatur_Vorlauf=convert(stringcast(WPSplitIn verter,0u32,0u16),0f16)/10.0f16;\\
        WPSplit=split(Buffer_WP,56u16,59u16);\\
        WPInverter=split(WPSplit,3u16,4u16)+split(WPSplit, 2u16,3u16)+split(WPSplit,1u16,2u16)+split(WPSplit, 0u16,1u16);\\
        WP_Temperatur_Ruecklauf=convert(stringcast(WPSplit Inverter,0u32,0u16),0f16)/10.0f16;\\
        WPSplit=split(Buffer_WP,60u16,63u16);\\
        WPInverter=split(WPSplit,3u16,4u16)+split(WPSplit, 2u16,3u16)+split(WPSplit,1u16,2u16)+split(WPSplit, 0u16,1u16);\\
        WP_Temperatur_Ruecklauf_Soll=convert(stringcast(WP SplitInverter,0u32,0u16),0f16)/10.0f16;\\
        ...
        ...
        ...
        endif
        [/highlight]

        Kommentar


          #19
          Hallo Michael,

          [highlight=epc]
          if change(Buffer_WP) and (hier mindestlänge des Puffers prüfen um fehlerhafte Werte zu verhindern) then {
          WP_GetF16( WP_Temperatur_Vorlauf, Buffer_WP, 52u16)
          WP_GetF16( WP_Temperatur_Ruecklauf, Buffer_WP, 56u16)
          WP_GetF16( WP_Temperatur_Ruecklauf_Soll, Buffer_WP, 60u16)
          /* ... und so weiter ... */
          } endif

          // Makro dazu:

          :begin WP_GetF16( IntoVar, FromBuffer, PosInBuffer )
          :info $einen 4-Byte Wert der WP spiegeln, in float umwandeln und durch 10 dividieren$ \\
          $Variable, die den WP-Wert erhalten soll$ \\
          $Puffer in dem die Zeichen stehen$ \\
          $Position (0-basierend) im Puffer an der der Wert beginnt$
          :shortinfo $4-Byte Float von Wärmepumpe aus Puffer holen$
          :return {
          IntoVar = convert( \\
          stringcast( split(FromBuffer,PosInBuffer+3u16,PosInBuffer+4u16 )\\
          +split(FromBuffer,PosInBuffer+2u16,PosInBuffer+3u1 6)\\
          +split(FromBuffer,PosInBuffer+1u16,PosInBuffer+2u1 6)\\
          +split(FromBuffer,PosInBuffer+0u16,PosInBuffer+1u1 6),0u32,0u16),0f16)/10.0f16;
          }
          :end
          [/highlight]

          wäre ein Ansatz. Ich habe es aber derzeit nicht getestet, ist so aus dem Gedächtnis und Deinen Vorgaben aufgeschrieben...

          Gruß,
          Bernd

          Kommentar


            #20
            Hallo Bernd,

            respekt, die einfachsten sind doch immer die besten Wege.

            Um keine Variablen-Kollision durch den Mehrfachaufruf aus der einen if-Abfrage zu haben verwendest Du einfach keine Variablen.

            Da habe ich gestern Abend bei meinen zahlreichen Versuchen mit dem Makro einfach zu kompliziert gedacht...

            Vielen Dank, werde ich nachher direkt ausprobieren.

            Viele Grüße

            Michael

            Kommentar


              #21
              Nachdenken hilft manchmal:
              obiges Makro kann nicht richtig funktionieren aus zwei Gründen:
              1.) der EibPC macht eine Stringverkettung. Das aber nur bis zum 0-Zeichen wenn ich richtig liege.
              2.) der Split-Befehl nimmt immer 2 Bytes statt nur eines

              Aus dem Speicherauszug 00 00 00 ed ...
              kommt wahrscheinlich Blödsinn raus.

              Besser also:

              [highlight=epc]
              if change(Buffer_WP) and (hier mindestlänge des Puffers prüfen um fehlerhafte Werte zu verhindern) then {
              WP_GetF16( WP_Temperatur_Vorlauf, Buffer_WP, 52u16)
              WP_GetF16( WP_Temperatur_Ruecklauf, Buffer_WP, 56u16)
              WP_GetF16( WP_Temperatur_Ruecklauf_Soll, Buffer_WP, 60u16)
              /* ... und so weiter ... */
              } endif

              :begin WP_GetF16( IntoVar, FromBuffer, PosInBuffer )
              :info $einen 4-Byte Wert der WP spiegeln, in float umwandeln und durch 10 dividieren$ \\
              $Variable, die den WP-Wert erhalten soll$ \\
              $Puffer in dem die Zeichen stehen$ \\
              $Position (0-basierend) im Puffer an der der Wert beginnt$
              :shortinfo $4-Byte Float von Wärmepumpe aus Puffer holen$
              :var temp@ = $0123$
              :return {
              /* wir nehmen ein Byte von hinten und schreiben es bei temp@ vorne rein, dann weiter nach vorne beim Puffer und weiter nach hinten beim Temp@ */
              stringset( temp@, stringcast( FromBuffer,0u08, PosInBuffer+3u16),0u16);
              stringset( temp@, stringcast( FromBuffer,0u08, PosInBuffer+2u16),1u16);
              stringset( temp@, stringcast( FromBuffer,0u08, PosInBuffer+1u16),2u16);
              stringset( temp@, stringcast( FromBuffer,0u08, PosInBuffer+0u16),3u16);

              /* Jetzt sollte in temp@ lt. Urbeispiel aus 0 0 0 ed ein ed 0 0 0 geworden sein. */
              IntoVar = convert(stringcast(temp@,0s32,0u16),0f16)/10.0f16;
              }
              :end
              [/highlight]

              Mußt Du aber bitte nochmal prüfen ...

              Gruß,
              Bernd

              Kommentar


                #22
                Danke für den Korrekturhinweis Michael,

                [highlight=epc]
                :var temp@ = $0123$
                [/highlight]

                muss geändert werden in:

                [highlight=epc]
                :var temp@
                temp@ = $0123$
                [/highlight]

                Gruß,
                Bernd

                Kommentar

                Lädt...
                X