Ankündigung

Einklappen
Keine Ankündigung bisher.

Gira X1 Nummer zu Gleitkommazahl

Einklappen
Dieser Beitrag wurde beantwortet.
X
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

    Gira X1 Nummer zu Gleitkommazahl

    Für das Auslesen mehrer Parameter aus meinem Fronius Wechselrichter verwende ich den Modbus TCP Block im X1. Protokoll in der Fronius API aktiviert und die ersten Werte passen schon mal. Nun gibt es zwei SunSpec Model Typen:
    • int + SF -> funktioniert soweit, aber da sich der Skalierungsfaktor auch laufend ändern muss man immer zwei Register auslesen um einen Wert zu erhalten. Zudem lasst sich das Senden nicht über einen externen Trigger synchronisieren. Daher wäre mir 'float' lieber.
    • float -> dachte das sei einfach, "Number" Datentyp des Blocks einfach über Typ-Konverter führen und fertig. Dem ist aber leider nicht so, denn die konvertierte Zahl wurde nicht auf float gecastet.
    Hat das schon jemand probiert, bzw. kann mir jemand sagen wie ich von dem gelesenen 2 words (Datentyp laut Fronius Register Map ist float32) auf den Float/Dezimalwert Datentype im X1 konvertieren kann?

    Auszug Fronius Register Map:

    2022-12-09 12_01_13-Gen24_Primo_Symo_Inverter_Register_Map_Float.xlsx [Protected View] - Excel.png

    ​SunSpec float32 Definition:

    2022-12-09 12_22_20-SunSpec Device Information Model Specification.png
    Modbus TCP Float - jämmerlich versagt :-)

    2022-12-09 12_04_16.png
  • Als Antwort markiert von mrrobot am 18.12.2022, 15:11.

    Habs eben schnell mal probiert und funktioniert soweit super. Für mich ist die Genauigkeit der Mantissa auch mit wenigen Bits ausreichen. Anbei die nicht mehr überschaubare Formel:

    Math.Pow(-1.0,(uint){raw:N}>>31)*Math.Pow(2,((int)((uint){ra w:N}> >23)&0xFF)-127)*(1+(((uint){raw:N}>>22)&1)*0.5+(((uint){raw:N }>>21)&1)*0.25+(((uint){raw:N}>>20)&1)*0.125+(((u i nt){raw:N}>>19)&1)*0.0625+(((uint){raw:N}>>18)&1)* 0.03125+(((uint){raw:N}>>17)&1)*0.015625+(((uint){ raw:N}>>16)&1)*0.0078125)
    Im Formelbaustein sieht das ganze dann so aus:

    image.png

    Hoffe nur dass der X1 das nicht performancemäßig merkt, hätte gerne ein paar mehr Werte aus dem Wechselrichter. hyman hast du Erfahrung damit?​
    Zuletzt geändert von mrrobot; 16.12.2022, 09:49.

    Kommentar


      #2
      Welchen Datentyp hat der Datenpunkt Virtuell-DEBUG-Float?
      Nach KNX entspricht IEEE 754 32 Bit einem DPT 14.000 mit passender Einheit.

      Kommentar


        #3
        Mit einem Rechenbaustein mit 1.0 multiplizieren geht nicht?

        Kommentar


          #4
          Der Datentyp von Virtuell-DEBUG-Float ist "Dezimalwert", der existiert nur in GPA. Habe aber auch mal einen in ETS angelegt und die 14.056 Leistung/Watt. Jetzt kommt zwar eine Gleitkommazahl raus, aber die ist nicht richtig und ändert sich in der Simulation nicht, obwohl der Ausgang des Typkonverters sich ständig aktualisiert.

          2022-12-09 16_51_52_modbus1.png

          Wenn ich eine Multiplikation mit 1,0 versuche sieht es genauso aus:

          2022-12-09 16_51_52_modbus2.png

          Wenn ich mal die Leistungsaufnahme im SmartMeter auslese (hier ist der Erwartungswert laut Webinterface zum Auslesezeitpunkt etwa 1500W)
          Auslesewert ist in Number: 1153456538 = 0x44C0599A => IEEE 754 konvertiert: 1538.80004883 Watt. Der Wert stimmt also, nur die Umreichnung zeigt wieder Mist an und funktioniert nicht 😵

          2022-12-09 16_51_52_modbus3.png

          Kommentar


            #5
            Dann musst Du wohl die Bits mit einer Formelberechnung auseinanderklambüsern ...

            Kommentar


              #6
              Habs eben schnell mal probiert und funktioniert soweit super. Für mich ist die Genauigkeit der Mantissa auch mit wenigen Bits ausreichen. Anbei die nicht mehr überschaubare Formel:

              Math.Pow(-1.0,(uint){raw:N}>>31)*Math.Pow(2,((int)((uint){ra w:N}> >23)&0xFF)-127)*(1+(((uint){raw:N}>>22)&1)*0.5+(((uint){raw:N }>>21)&1)*0.25+(((uint){raw:N}>>20)&1)*0.125+(((u i nt){raw:N}>>19)&1)*0.0625+(((uint){raw:N}>>18)&1)* 0.03125+(((uint){raw:N}>>17)&1)*0.015625+(((uint){ raw:N}>>16)&1)*0.0078125)
              Im Formelbaustein sieht das ganze dann so aus:

              image.png

              Hoffe nur dass der X1 das nicht performancemäßig merkt, hätte gerne ein paar mehr Werte aus dem Wechselrichter. hyman hast du Erfahrung damit?​
              Zuletzt geändert von mrrobot; 16.12.2022, 09:49.

              Kommentar


                #7
                Du kannst das selber prüfen. Auf der "Diagnose"-Seite des X1 http://<ipAdresse>/system findet sich im Bereich "Prozesse" die gewünschte Information:
                • Oben links steht die Speicherauslastung (bei mir aktuell Mem: 329048K used, 705000K free mit haufenweise Logikblättern, die reichlich Formelberechnungen enthalten)
                • Darunter eine Tabelle mit allen laufenden Prozessen u. a. mit ihrer Prozessorauslastung (in der Spalte %CPU, bei mir langweilt sich die CPU fast nur)

                Kommentar


                  #8
                  hyman Danke für den Hinweis. Habs in den letzten Tagen etwas beobachtet und scheint tatsächlich kein Problem zu sein :-)

                  Kommentar


                    #9
                    Kurze Frage zur Speicherauslastung. Ich habe das früher mal beobachtet und gesehen das nach dem Booten ca. 280K belegt waren und danach der belegte Speicher durchaus bis auf >700K angewachsen ist. Und zwar ohne das es ein Memory Leakage gab, sondern hauptsächlich nur durch größeren cache/buffer.

                    Der durch die Logik belegte Speicher (Prozeß usr/bin/mono/…) blieb nach anfänglicher geringer Zunahme konstant. Daher denke ich auch, das es kein Leakage gab.

                    Ist das bei Euch auch so?
                    Gruß Bernhard

                    Kommentar


                      #10
                      willisurf Hätte ich noch nicht beobachtet, kann aber mal ein Auge darauf werfen.

                      Aktuell:
                      Service gestartet: 12/16/2022, 10:08:50 AM​
                      Mem: 412788K used, 620624K free, 2820K shrd, 136620K buff, 138100K cached

                      Kommentar


                        #11
                        ~4 Tage Laufzeit:
                        Mem: 428160K used, 605252K free, 3016K shrd, 145080K buff, 138424K cached
                        Minimal erhöht aber meiner Meinung nach nicht dramatisch :-)

                        Kommentar


                          #12
                          Hallo,
                          ich habe dasselbe Problem jetzt wie der Postersteller und habe die Lösung mit der Formelberechnung nicht ganz verstanden... Wie genau wurde der Baustein denn eingebunden? Viele Grüße

                          Kommentar


                            #13
                            Zitat von AileenR Beitrag anzeigen
                            eingebunden
                            Wert kommt -> Baustein Formelbrechnung -> Wert geht. (Screenshots sind ja oben schon dabei)

                            Reicht das so? Oder wolltest Du das Logikblatt in voller Grösse vom eigentlichen TE?

                            Kommentar


                              #14
                              Um einen Baustein wie die Formelberechnung in den GPA zu importieren kann diese Anleitung helfen: https://knx-user-forum.de/forum/supp...38#post1356438

                              Kommentar


                                #15
                                Den Formelberechnungsbaustein habe ich importiert. Ich habe nur das Problem, dass ich zwei Register einlesen muss und mir nicht sicher bin, wie ich diese auf einen Ausgang bekomme. Aktuell bekomme ich nur fehlerhafte Werte raus. Das ist aktuell meine Verknüfung. Die Modbus-Schnittstelle ist auf little-endian eingestellt.
                                Zuletzt geändert von AileenR; 07.02.2025, 14:31.

                                Kommentar

                                Lädt...
                                X