Ankündigung

Einklappen
Keine Ankündigung bisher.

2 BYTE Gleitkomma Temperaturwert aus INT errechnen

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

    KNX/EIB 2 BYTE Gleitkomma Temperaturwert aus INT errechnen

    Hallo zusammen,

    habe folgendes Problem:
    In meinem KNX System hängt eine Industriesteuerung (S7-1200) über ein Gateway PN<->KNX
    Ich möchte nun eine Temperatur von meiner S7 auf den Bus senden. Ich weiß das der Temperaturwert von KNX 9.001 ein HEX Wert ist der mit Mantisse und Exponent errechnet werden muss.

    Von KNX auf INT ist das auch kein Problem mit der Formel
    z.B. (Quelle: https://knx-user-forum.de/forum/%C3%...bei-mdt-sensor)
    0CBA = 0000 1100 1011 1010 binär

    Vorzeichen 0 => positive Zahl
    Exponent 0001 = 1
    Mantisse 100 1011 1010 = 1210 dezimal

    1210 * 2^1 = 2420
    geteilt durch 100 wegen 0.01°C Auflösung => 24.2 °C

    aber wie bekomme ich aus einer Temperatur z.B. 2420 (24.2 °C) einen 2 BYTE Gleitkomma HEX Wert für KNX ???
    Woher oder wie kann ich Exponent und Mantisse berechnen?

    Vielen Dank


    #2
    Hallo Andy, herzlich willkommen im Forum!

    Vielen Dank für die Frage - das wäre ein prima Grundlagenbeitrag.
    1. Die Mantisse mit VZ+11 Binärstellen deckt einen Zahlenbereich ab von M = [-2 048 ... 2 047], siehe #4 Deiner Quelle.
    2. Die 24.2 °C sind (2420 * 0,01 °C) - das ist vollkommen richtig gedacht. 2420 ist aber größer als 2047 und daher nicht darstellbar. Die Hürde ist zu überwinden.
    Daher muss die Auflösung reduziert werden:
    • 24.20 °C sind auch (1210 * 0,2 °C) und 1210 sind umgerechnet 0x04BA
    • Mit dem Exponent 0001 ergibt sich 0x0CBA = 0000 1100 1011 1010 binär
    Es wird bei der Implementierung helfen, dass die S7 auch Zahlenvergleiche und bedingte Sprünge beherrscht für die Optimierung = Berechnung der idealen Auflösung. Der Lösungsweg ist nicht eindeutig, der Ausgangspunkt ist immer die Begrenzung der Mantisse auf den Zahlenbereich M = [-2 048 ... 2 047]

    Kommentar


      #3
      Was ist denn das für ein Gateway? Kann das nicht Real to DPT9.?

      Kommentar


        #4
        Danke für die erste Hilfe schon mal!

        zu ollu77: Es ist ein Gateway von Wachendorff
        https://www.wachendorff-prozesstechn...D67818-KNX-B2/
        Es gibt einfach nur Daten weiter und wandelt nichts dabei.

        Zahlen im Positiven bereich habe ich nun hinbekommen.

        aber wenn ich in den minusberech mich bewege, funktioniert das nicht mehr.
        Ich verstehe das so das ich für minus nur das Vorzeichen 0 auf 1 ändern muss
        das wäre dann in HEX= 0CBA entspräche in BIN = 1000 1100 1011 1010

        KNX zeigt mir aber dann -16,7°C an??

        Kommentar


          #5
          Zitat von SPS Andy Beitrag anzeigen
          Ich verstehe das so das ich für minus nur das Vorzeichen 0 auf 1 ändern muss
          Das Zweierkomplement funktioniert aber anders. Mit dem Beispiel aus Wikipedia rechnet sich das mit -24.20 °C so:
          1. Vorzeichen ignorieren und Mantisse ins Binärsystem umrechnen: BIN = 100 1011 1010
          2. Invertieren: Not[100 1011 1010] = 011 0100 0101
          3. Eins addieren: 011 0100 0101 + 000 0000 0001 = 011 0100 0110
          4. Vorzeichen und Exponent hinzufügen: 1000 1011 0100 0110
          -16,7°C
          1. Mantisse = 100 1011 1010
          2. Invertieren = 011 0100 0101
          3. Eins addieren = 011 0100 0110
          4. 0x346 ist Dez = 838
          5. mit Exponent 1 ergibt das 16,76
          6. mit Vorzeichen und Einheit: -16,76 °C
          Das Zweierkomplement wird zur Arithmetik verwendet, also nicht wundern, wenn die Umrechnung in beide Richtungen gleich funktioniert.

          Kommentar


            #6
            Danke knxPaul,

            hab das eben mit dem 2er Komplement auch gefunden, muss zugeben kannte ich bis dato nicht.

            Kommentar


              #7
              Hallo,

              habe mir jetzt (muss zugeben mit viel versuchen) ein Baustein für Siemens S7 SCL erstellt:

              Code:
              IF #int >= 0 THEN
              #"erg. exp" := #int / 2047;
              
              CASE #"erg. exp" OF
              0:
              #"temp 2byte real" := #int;
              
              1:
              #"temp int" := #int / 2;
              #"temp 2byte real" := (#"temp int" + 2048);
              
              2:
              #"temp int" := #int / 4;
              #"temp 2byte real" := (#"temp int" + 4096);
              
              3:
              #"temp int" := #int / 8;
              #"temp 2byte real" := (#"temp int" + 6144);
              
              4:
              #"temp int" := #int / 16;
              #"temp 2byte real" := (#"temp int" + 8192);
              
              ELSE
              #error := true;
              
              END_CASE;
              
              #"2Byte REAL" := #"temp 2byte real";
              
              ELSE
              #"temp int bereinigt" := #int * -1;
              #"erg. exp" := #"temp int bereinigt" / 2047;
              
              CASE #"erg. exp" OF
              0:
              #"temp 2byte real" := #int;
              
              1:
              #"temp int" := #int / 2;
              #"temp 2byte real" := (#"temp int" + 2048);
              
              2:
              #"temp int" := #int / 4;
              #"temp 2byte real" := (#"temp int" + 4096);
              
              3:
              #"temp int" := #int / 8;
              #"temp 2byte real" := (#"temp int" + 6144);
              
              4:
              #"temp int" := #int / 16;
              #"temp 2byte real" := (#"temp int" + 8192);
              
              ELSE
              #error := true;
              
              END_CASE;
              
              #"2Byte REAL" := #"temp 2byte real" + (-30720);
              
              END_IF;
              hab ihn soweit von -50°C bis + 70°C getestet trotzdem ohne Gewähr.
              Zuletzt geändert von SPS Andy; 12.04.2021, 09:37.

              Kommentar

              Lädt...
              X