Ankündigung

Einklappen
Keine Ankündigung bisher.

brauche Hilfe bei Datentypen

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

  • makki
    antwortet
    Bis auf die leicht geänderte (ohne den Fehler bei Werten unter -20,47) kann ich Dir auch nur folgendes anbieten:

    Code:
    sub encode_dpt9 { # 2byte signed float
        my $state = shift;
        my $data;
    
            my $sign = ($state <0 ? 0x8000 : 0);
        my $exp  = 0;
        my $mant = 0;
    
        $mant = int($state * 100.0);
        while (abs($mant) > 2047) {
            $mant /= 2;
            $exp++;
        }
        $data = $sign | ($exp << 11) | ($mant & 0x07ff);
        return $data >> 8, $data & 0xff;
    }
    Zahl rein, die zwei bytes auf den Bus raus, fertig.
    Den ganzen Topf mit Spaghetticode - garantiert frei von OO&Klassen - gibts hier (in der sub knx_write sollten die 4 Zeilen zu finden sein, das dann auch via eibd rauszubringen)

    Makki

    Einen Kommentar schreiben:


  • boxerfahrer
    antwortet
    Ich möchte das Thema EIS5 und perl nochmal aufwärmen. Ich habe verschiedene Temperaturen im float Format, die nicht aus dem EIB kommen, die ich aber auf den Bus schicken will.

    Ich nutze mistereib und habe daher die EIB5 Klasse in perl zu Verfügung, aber ich komme damit mangels tiefer perl Kenntnisse nicht zurecht. Kann mir vielleicht jemand Hilfestellung leisten, wie ich die encode (und vielleicht auch decode) Methoden in meinem perl code (der als deamon ausserhalb von mistereib arbeitet) nutzen kann? Ich bin auch für jeden Hinweis dankbar, wie das ohne die EIB5 Klasse funktioniert.

    Vielen Dank!
    Gruss Boxerfahrer

    Einen Kommentar schreiben:


  • Uwe!
    antwortet
    Hallo Gamma,

    so auf die Schnelle kann ich Dir glaube ich nicht folgen...

    2 hoch 0 ist 1.
    Richtig, so wie 3 hoch 0 und 4 hoch 0 auch 1 ist weil alles hoch 0 1 ist, oder?

    (mantisse *0.01) * 2 ^Exponent
    ok, das *2 hab ich "unterschlagen"? Aber trotzdem ist doch jede Wert hoch 0 1, oder? Und bei Hex "00 1C" hab ich bin "00000000 00011100". Der Exponent sind die Bits 2-5 vom "linken" Byte, also 0, demzufolge müsste nach meinem Verstandis die Rohdaten "00 1C" bei Interpretation als "float" (9.001) eine 1 ergeben (28*0,01*2 hoch 0= arrrrggghhh!!!!
    Jetzt wo ich die Formel mal richtig aufschreibe wird's klar, ich hab "Punkt vor Strich" nicht beachtet:

    (28*0,01) * (2^0) => die letzte Klammer nur zur Verdeutlichung, wo mein Fehler lag!
    (0,28) * (1)
    =0,28
    Sprich es wird nicht "hoch 0" sonder "mal 2 hoch 0" gerechnet.

    Ok, jetzt erlaube ich mir mal den Spaß und rechne die "0A F0" per Hand nach. In bin ist das 00001010 11110000, damit haben wir einen Exponnet "0001"=1 und eine Mantisse "01011110000"=752, ergibt:
    (752*0,01) * 2^1
    7,52 * 2
    =15,04

    Passt!

    Danke!

    Einen Kommentar schreiben:


  • Gamma
    antwortet
    Hallo Uwe,
    versuchs doch mal mit (mantisse *0.01) * 2 ^Exponent,
    Mantisse 11Bit, dann 4 Bit exponent, dann Vorzeichen der mantisse.
    Die Mantisse ist im 2erKomplement gespeichert,
    Der Exponent geht von 0..15.

    2 hoch 0 ist 1.

    Grüsse von Gamma!

    Einen Kommentar schreiben:


  • Uwe!
    antwortet
    ok, hab's verstanden. 2-Byte Werte könne (u. a.) "signed value" (-32.768 bis +32.767), "unsigend value" (0 bis 65.535) oder "float" (-671.088,64 bis +670.760,96) sein. Bei "signed" und "unsigend" ist der Wert "normal" als Hex-Zahl gespeichert, bei "float" sind ein paar Bits die Mantisse und ein paar Bits der Exponent, also einfach ein x hoch y, wobei die Basis als 0,01 definiert ist, also 0,01 mal Mantisse hoch Exponent.

    Zu meinem Beispiel:

    bei "00 1C" sind nur Bits der Mantisse auf 1

    bei "0A F0" sind auch Bits vom Exponent auf 1, daher kommt da plötzlich ein völlig anderes Ergebnis raus und nicht das 100fache von "00 1C".

    => was nicht ganz logisch ist: im ersten Fall ist der Exponent eigentlich 0, was als Ergbnis immer 1 liefern müsste, das Ergbnis ist aber so, als ob der Exponent 1 wäre?!

    was ich nicht wusste: Wenn ich in der ETS als DPT "Temperatur in °C" auswähle, interpretiert die ETS das autoamtsich als "float", ich dachte es gibt auch einen "signed value als °C", aber das ist wohl nicht definiert.

    Lehre: wenn ich einen Wert als "signed Value" auf den Bus schicke, kann ich ihn nicht als Temperatur interpretieren, dazu muss ich ihn als "float" schicken!

    Einen Kommentar schreiben:


  • Uwe!
    antwortet
    Hallo Makki,

    da geht es Dir wie mir....

    Also die Excel-Formel liefert so wie die ETS einmal 0,28 und einmal 15,04. Hab zwar noch nicht verstanden, warum, aber da werd ich wohl die Konnex-Doku zu den Datentypen noch mal studieren.

    Heißt für mich aber, dass die Funktion "Multipliziere mit 100" völliger Quatsch ist, weil dass durch die "Mantissen-Codierung" zu unbrauchbaren Werten führt, wenn einfach nur die Rohdaten multipliziert werden.

    Einen Kommentar schreiben:


  • makki
    antwortet
    Ohne das jetzt nachzuprüfen ob sich dabei um sowas handelt:
    es gib da einen (IMHO ziemlich lustigen oder kranken - je nach Tageszeit) EIS5
    das ist nach einem Mathe-Leistungskurs (den ich dummerweise verpasst habe) sicher alles ganz übersichtlich aber wenn man "Mantisse" so wie ich eher für einen Unterart der Mantelrochen hält kann das ganz schön nerven
    Nachdem ich kürzlich dazu eine Stoffsammlung erstellt habe, ohne mich dafür zu interessieren was zum Henker Mantissen sind und warum man in 2 Byte nicht einfach den Wert mit Vorzeichen reinschreiben kann oder halt gigantische 4 Byte nehmen kann

    Das hier uvm bei der Suche nach EIS5 in Excel

    In Perl gibts auch was, suche misterhouse + eis5

    Makki

    Einen Kommentar schreiben:


  • Uwe!
    hat ein Thema erstellt KNX/EIB brauche Hilfe bei Datentypen.

    brauche Hilfe bei Datentypen

    Hallo,

    brauch mal eure Hilfe bei Der Darstellung von Werte bei bestimmten Datentypen.

    Ein Gerät sendet als 2 Byte Wert die Rohdaten 00 1C. Das ganze ist eigentlich ein Temperaturwert von 28°C. Wenn ich es in der ETS als 2-Byte-mit-Vorzeichen anzeigen lasse, sehe ich 28, lasse ich es Temperatur anzeigen sehe ich 0,28°C

    1. Frage: Wird ein Tempwert immer als "Hundertstel" interpretiert?

    Ich kann dem Gerät Konvertierungsregeln mitgeben, in dem Fall hab ich es mit "Multiplikation mit 100" versucht.

    Als Rohdaten kommen jetzt 0A F0 an, das ist das 100fache von 00 1C. Als 2-Byte mit Vorzeichen wird 2800, angezeigt, das 100fache von 28. Als Temperatur wird 15,04°C angezeigt, das ist NICHT das 100fache von 0,28°

    2. Frage: wie erfolgt hier die Umrechnung???

    Danke für eure Hilfe!

    Uwe
Lädt...
X