Bitweise Fehlerauswertung

Einklappen
X
 
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge
  • keineahnung
    Extension Master
    • 05.03.2023
    • 197

    #1

    Bitweise Fehlerauswertung

    Hallo,
    ich bin neue in diesem Thema. Ich nutze den Miniserver zur Visualisierung unser PV-Anlage.

    Die meisten Daten habe ich schon per ModbusTCP ausgelesen. Angekommen bin ich jetzt bei den Fehlerregistern, leider komme ich nicht weiter... vielleicht könnt ihr mir ja helfen.


    Auszug aus dem Handbuch:
    Appendix 1.3 Fault code instructions
    Inverter fault analysis by bit:
    For example:
    Inverter alarm: 0x00102000 (0001 0000 0010 0000 0000 0000b)
    bit13 & bit20 is set.
    According the following table, the low word base code of the inverter alarm is 70 and the high word base code is 500. So the bit13 represents a fault code of 083 (i.e. 70+13), and the bit20 represents a fault code of 504 [i.e. 500+(20-16)].

    Das mit dem Bit 13 und dem Offset von 70 verstehe ich ja noch. Aber ich stehe auf dem Schlauch, warum bei bit20 504 und nicht 520 raus kommen soll.

    Meine Zweite Frage ist wie ich dies WORD dann in der Loxone Config "verarbeite" ich empfange in der Config ja immer Dez. Zahlen...

    Danke vorab für eure Hilfe.

    Gruß

    Mathias
  • Labmaster
    Lox Guru
    • 20.01.2017
    • 2594

    #2
    Ist ja ein sehr merkwürdiges Codierungsschema,

    Aber egal hier mal was zur Lösung deines Problems:

    Bei Modbus ist innerhalb der Übertragung alles in 16Bit Word zerlegt.
    Der FaultCode besteht also eigentlich aus zwei Modbus Words (16bit unsigned)

    Betrachten wir mal den 32bit Wert aus dem Beispiel: 0x00102000
    -der obere Wert (Modbus Register) ist hex: 0x0010 bzw. bin: 0000 0000 0001 0000 (Bit Nr. 4 gesetzt) bzw. dez: 16
    -der untere Wert (Modbus Register) ist hex: 0x2000 bzw. bin: 0010 0000 0000 0000 (Bit Nr. 13 gesetzt) bzw. dez: 8192

    Die Codierung ist ja nun wie folgt: (zumindest hab ich das so verstanden)
    Gesetzes Bit Nr. des oberen Registers (0 bis 15) + 500
    Gesetztes Bit Nr. des unteren Registers (0 bis 15) + 70

    Ergibt im Beispiel
    500+4 = 504
    70+13 = 83

    So ganz geht aber aus der Doku von dir nicht hervor ob auch mehr als ein Bit pro Register gesetzt sein könnte, falls nein, dann wäre es jedenfalls relativ einfach das umzurechnen:

    Berechnen könntest du das ganze dann mit jeweils einem Formelbaustein, hier die Lösung wenn du die beiden Register einzelen als 16bit Wert vom Modbus holst und dann jeweils den Formel Bausteinen an I1 zuführst.



    Formel: int(log(i1)/log(2))+500 am I1 Eingang der Inhalt (16bit) des oberen Modbus Registers
    Formel: int(log(i1)/log(2))+70 am I1 Eingang der Inhalt (16bit) des unteren Modbus Registers


    Möchtest du den Modbus Wert als 32 bit (unsigned) per Modbus auslesen und direkt verwenden, dann müsstest du den oberen 16bit teil und den unteren 16bit teil entsprechen z.B. in der Formel separieren. um dann jeweils die bit Berechnung zu machen.
    Mit folgenden Formeln könntest du beide bei I1 jeweils mit dem 32bit Wert füttern und würdest am Ausgang einmal den oberen und einmal den unteren Wert raus bekommen.

    Formel: int(log(int(i1 / 65536))/log(2))+500
    Formel: int(log(I1-(65536*int(i1/65536)))/log(2))+70

    Dann hast du immerhin schon mal die beiden Config Words so wie es in der Doku angegeben ist.
    Diese könntest du dann z.B. einzeln in jeweils einen Status Baustein füttern wo du dann für jeden laut Doku sinnvollen Wert einen Text hinterlegst welche du nann anzeigen lässt. (Visu) Im selben Status Baustein könntest du zusätzlich auch für jeden Eingangcode einen numerischen Wert hinterlegen welche am Numerischen Ausgang ausgegeben wird. Damit wären separate Fehler Trigger möglich, z.B. über einen Binärdekoder Baustein , oder oder oder ...
    Das musst du selbst wissen für was du das benötigst.


    Das ganze hab ich nicht getestet, kann also sein, dass es nicht auf Anhieb funktioniert und ich noch irgendetwas übersehen habe.
    Zuletzt geändert von Labmaster; 07.04.2023, 15:14.

    Kommentar

    • keineahnung
      Extension Master
      • 05.03.2023
      • 197

      #3
      Hallo Labmaster,
      danke für deine schnelle Antwort. (Ich denke, es können auch mehrere Bits gesetzt werden. Im Beispiel steht ja bit13 & bit20 is set.)

      Ich habe mich mal an deiner Lösung versuchen. Komme aber noch nicht weiter. Aus deiner Formel kommen ja 16 Bit. Wenn ich die jetzt auf einen Binärdecoder schieben möchte, muss dies ja wieder "aufgeteilt werden. Oder nicht?

      Und die ersten 16 Bit geben 160,51 (ohne offset 90,51) aus.


      Klicke auf die Grafik für eine vergrößerte Ansicht

Name: Bit.jpg
Ansichten: 295
Größe: 45,5 KB
ID: 386493

      Gruß

      Mathias

      Kommentar


      • Labmaster
        Labmaster kommentierte
        Kommentar bearbeiten
        Die Frage ist ob pro 16Bit Modbus (oben ODER unten) mehr als 1 Bit gesetzt wird.
        Das PRO 16Bit Modbus Adresse (wie im Beispiel) jeweils ein Bit gesetzt werden können muss ist ja logisch.

        Die oberen beiden Formeln sind dafür da, wenn du die beiden 16Bit Werte per Modbus als einzelnen 16Bit register abholst. )also nicht so wie in deinem Bild dargestellt)

        Wenn du die beiden Modbus Register gemeinsam (als 32bit) wert vom Modbus abholst, dann musst die beiden langen Formeln verwenden., die splitten jeweils den 32bit Wert in oberes und untere 16Bit bevor dann die Bit Nr. gerechnet wird.



        Ich hatte auch geschrieben, dass man z.B. einen Status Baustein zwischen dem Formausgang und dem Binärdekoder setzen kann, damit könnte man dann im Statusbaustein komfortabeln auf einen Eingangswert vergleichen und dann am Ausgang einen 8Bit wert (0 bsi 255) setzen um einen Binärdekoder anzusteuern.


        FEHLER !!! FEHLER !!! FEHLER !!! FEHLER !!! FEHLER !!! FEHLER !!! FEHLER !!! FEHLER !!! FEHLER !!!
        Sorry, hatte mal wieder schneller getippt als nachgedacht, blöde Angewohnheit im Alter ;-)
        Die Umkehrfunktion von x^2 ist natürlich nicht die Quadratwurzel sondern Log2 (leider kann Loxone im Formelbaustein kein Log2 deshalb die umständlichere Berechnung)
        Hab es in den Formeln oben im Post korrigiert.
        Zuletzt geändert von Labmaster; 07.04.2023, 15:35.
    • keineahnung
      Extension Master
      • 05.03.2023
      • 197

      #4
      Ich vergesse den Binärdekoder mal wieder. Ich habe gerade ins Handbuch geschaut, dort sind die Fehlercode aufgelistet.

      z.B.
      Alarm-ID Beschreibung Korrekturmaßnahmen
      502,503,504, 507, 508, 510, 513, 516, 515, 516, 517, 518 Systemalarm Der Wechselrichter kann den normalen Betrieb aufnehmen.
      1. Überprüfen Sie, ob die entsprechenden Kabelverbindungen und Anschlüsse und die Umgebungsbedingungen den Anforderungsbedingungen entsprechen. Wenn ja, ergreifen Sie entsprechende Korrekturmaßnahmen.
      2. Wenn der Alarm weiterhin besteht, wenden Sie sich an SUNGROW.​

      Hier wäre ein Statusbaustein, wie du schon geschrieben hast, die beste Wahl.

      Ich habe aber die langen Formel benutzt:
      Formel: sqrt(int(i1 / 65536)) + 500​ = 504
      Formel: sqrt(i1 - (65536 * int(i1 / 65536))) + 70 = 160,51

      Angehängte Dateien

      Kommentar

      • Labmaster
        Lox Guru
        • 20.01.2017
        • 2594

        #5
        Sorry, hab nen bösen Fehler bei den Formeln gemacht, hab das korrigiert.

        Und hier mal der Vorschlag mit dem Statusbaustein, da kannst du hinter raus eben immer noch Werte über AQ rausgeben welche dann z.B. über nen Binärdekoder irgendwelche Zusatzdinge auslösen, (Lampe Anschalten, durchsage machen ....)
        Klicke auf die Grafik für eine vergrößerte Ansicht  Name: xyz123.jpg Ansichten: 0 Größe: 346,6 KB ID: 386510

        Der Statustext wird an TQ rausgegeben.
        Der Statuswert an AQ
        Zuletzt geändert von Labmaster; 07.04.2023, 15:39.

        Kommentar

        • Labmaster
          Lox Guru
          • 20.01.2017
          • 2594

          #6
          Ich befürchte das ganze war aber umsonst.
          Wen ich mir die Fehlernummern so anschaue (Alarm über 516) dann können da wohl mehr wie ein Bit pro Modbus 16bit Register gesetzt sein, damit funktioniert so eine einfache Umrechnung dann nicht mehr.

          Kommentar

          • keineahnung
            Extension Master
            • 05.03.2023
            • 197

            #7
            Hallo,
            ich hoffe ihr hatte schöne Ostertage.

            Ich habe mir weiter Gedanken gemache... aber wirklich schlauer bin ich aus der Beschreibung auch nicht geworden.
            Aktuell lese ich die Fehlerregister aus und zeiche eine Statistik auf (Jede Änderung [... Speicher wird belastet....]). so bekommt man zumindest mit, ob ein Fehler aufgetretten ist.

            Und es ist einer aufgetretten. Fehler 714 (laut iSolarCloud App) loxone liefert den Wert 16384 da kommt 714 raus...

            Batteryfault
            13066 - 13067
            Low byte base code: 700​
            High word base code: 716​

            vielleicht hilft jemenden "meine" Lösung.

            Danke für eure Hilfe!

            Gruß

            EDIT:
            weiß jemand ob man sich die Änderung von den Registern als Pushnachricht schicken lassen kann? und wenn ja wie
            Zuletzt geändert von keineahnung; 13.04.2023, 18:13.

            Kommentar

            Lädt...