Ankündigung

Einklappen
Keine Ankündigung bisher.

Zählimpulse im EibPC auswerten

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

    Zählimpulse im EibPC auswerten

    Hallo Zusammen,

    ich möchte die Zählimpulse eines Stromzählers (oder Wasseruhr) im EibPC auswerten und visualisieren.

    Zur Berechnung des Momentanverbrauchs (bzw. Leistung) ist prinzipiell ja nur der Zeitraum zwischen zwei Zählimpulsen auszuwerten.

    Dazu gibt es aber bisher zwei unterschiedliche Ansätze.

    Bei meinem Ansatz messe ich über cycle(0,1) die Zeit zwischen zwei Zählimpulsen und setze die Zeitmessung anschließend auf Null zurück.

    Beim Enertex kwH Makro wird etwas aufwendiger auf Basis eines durchlaufenden Timers die Anfangszeit t1 bei einem Zählimpuls festgehalten und beim nächsten Zählimpuls die Endzeit t2.

    Mir ist bisher nicht klar, ob der etwas aufwendigere Weg Vorteile in der EibPC Abarbeitung hat.

    Beide Ansätze führen aber zu dem Problem, dass zwischen einem sehr geringen Verbrauch (lange Zeit zwischen zwei Impulsen) und keinem Verbrauch (unendliche Zeit zwischen zwei Impulsen) nicht unterschieden werden kann.

    Brick hat dazu bereits einen interessanten Ansatz mit einem zeitlich befristeten Timer zu arbeiten. Dieser läuft z.B. immer 30s hoch und fängt dann bei 0 an. Damit ist alles nach 30s kein Verbrauch. Nachteil ist, dass kleine Leistungen nicht zu sehen sind.

    Hier mein aktueller Code:

    [highlight=epc]
    // Berechnung des Momentanverbrauchs in W aus den Impulsen des Stromzählers
    // Der Umrechnungsfaktor ist auf dem Stromzähler abzulesen (z.B. Ferraris Stromzähler = 1/75kWh)
    // Das heißt, bei 75 Umdrehungen in einer Stunde ist der Momentanverbrauch = 1kW.
    // Momentanverbrauch = Umrechnungsfaktor * (Anzahl Umdrehungen / Zeit)
    // P = UF * (n/t) [n in Anzahl, t in h]
    // P = UF * n * 3600 / t [n in Anzahl, t in s]
    // P = 1/75kW * n * 3600 / t [n in Anzahl, t in s]
    // P = 48kW * n / t [n in Anzahl, t in s]
    Stromzaehler_WP_Umdrehungszeit = 0u32
    Stromzaehler_WP_Zaehlimpuls = convert("Stromzaehler Waermepumpe-8/0/2" * UF_Impulszaehler, 0u32)
    Stromzaehler_WP_Momentanverbrauch = 0u32
    if cycle(0,1) then \\
    Stromzaehler_WP_Umdrehungszeit = Stromzaehler_WP_Umdrehungszeit + 1u32 \\
    endif
    if change(Stromzaehler_WP_Zaehlimpuls) then \\
    Stromzaehler_WP_Momentanverbrauch = 48000u32 / Stromzaehler_WP_Umdrehungszeit; \\
    Stromzaehler_WP_Umdrehungszeit = 0u32; \\
    endif
    [/highlight]

    In dem dazugehörigem Chart wundern mich die relativ hohen Leistungen meiner Wärmepumpe (25.000W Peak Verbrauch bei einer 10kW Wärmepumpe ?!?).

    Freue mich über jede Idee oder Anregung zu diesem Thema.

    Viele Grüße

    Michael
    Angehängte Dateien

    #2
    Merkwürdig, offensichtlich ist für den EibPC dies:

    UF_Stromzaehler = 1u32 / 75u32
    Stromzaehler_WP_Impulszaehler = convert("Stromzaehler Waermepumpe-8/0/2" * UF_Impulszaehler, 0u32) * UF_Stromzaehler

    nicht gleich dies:

    UF_Stromzaehler = 75u32
    Stromzaehler_WP_Impulszaehler = convert("Stromzaehler Waermepumpe-8/0/2" * UF_Impulszaehler, 0u32) / UF_Stromzaehler

    Nach der Änderung sehen die Momentanverbräuche jetzt korrekt aus.

    Kommentar


      #3
      Warum merkwürdig?

      Wie willst Du denn 1u32/75u32 (=0,013333...als f32) als u32 darstellen? Das sollte automatisch 0 werden mit dem Ergebnis, das 0 * irgendwas auch 0 ergibt.

      Gruß,
      Bernd

      Kommentar


        #4
        Ok, wirklich nicht merkwürdig.

        Ich Hornochse habe nur in der zweiten Zeile gedacht und dort gedanklich die Variable eingesetzt.

        Kommentar


          #5
          Mit diesem Code sehen die Daten nun sauber aus.

          Die Messabweichung ist bei hohen Vebräuchen (schnell drehende Scheibe) ca. 4%, da der EibPC (cycle) nichts unterhalb einer Sekunde messen kann.

          Das Erkennen von 0W Verbrauch ist mit einem Ferraris relativ schwierig, da er sich bei 1kWh Verbrauch nur 75x in der Stunde dreht. Das heißt um 1W Verbrauch noch darstellen zu können und alles darunter als 0W herauszufiltern sind immer noch 48.000s bzw. 800Min. Impulsabstand notwendig.

          Daher "dreht" sich ein EHZ-Zähler 1000x bei 1kWh und kann somit bei kleinen Momentanverbräuchen viel feiner ausgewertet werden.

          [highlight=epc]
          // Umrechnungsfaktoren definieren
          UF_Stromzaehler = 75u32
          UF_Impulszaehler = 100.0f16

          // Stromzähler Haus definieren
          Stromzaehler_Haus_Zaehlerstand = 26825u32
          Stromzaehler_Haus_Impulszaehler = convert("Stromzaehler Haus-8/0/0" * UF_Impulszaehler, 0u32) / UF_Stromzaehler
          Stromzaehler_Haus = Stromzaehler_Haus_Zaehlerstand + Stromzaehler_Haus_Impulszaehler
          Stromzaehler_Haus_Jahresanfang = 23390u32
          Stromzaehler_Haus_Tagesanfang = 0u32

          // Stromzähler Wärmepumpe definieren
          Stromzaehler_WP_Zaehlerstand = 29081u32
          Stromzaehler_WP_Impulszaehler = convert("Stromzaehler Waermepumpe-8/0/2" * UF_Impulszaehler, 0u32) / UF_Stromzaehler
          Stromzaehler_WP = Stromzaehler_WP_Zaehlerstand + Stromzaehler_WP_Impulszaehler
          Stromzaehler_WP_Jahresanfang = 26177u32
          Stromzaehler_WP_Tagesanfang = 0u32

          // Aktuelle Zählerstände visualisieren
          if Init == EIN \\
          or change(Stromzaehler_Haus) then \\
          pdisplay(ID_Energie_Haus_Stromzaehler,convert(Stro mzaehler_Haus,$$) + $ kWh$,INFO,INACTIVE,GREY,PageID_Energieverbrauch) \\
          endif
          if Init == EIN \\
          or change(Stromzaehler_WP) then \\
          pdisplay(ID_Energie_WP_Stromzaehler,convert(Stromz aehler_WP,$$) + $ kWh$,INFO,INACTIVE,GREY,PageID_Energieverbrauch) \\
          endif

          // Berechnung des Momentanverbrauchs in W aus den Impulsen des Stromzählers
          // Der Umrechnungsfaktor ist auf dem Stromzähler abzulesen (z.B. Ferraris Stromzähler = 1/75kWh)
          // Das heißt, bei 75 Umdrehungen in einer Stunde ist der Momentanverbrauch = 1kW.
          // Momentanverbrauch = Umrechnungsfaktor * (Anzahl Umdrehungen / Zeit)
          // P = UF * (n/t) [n in Anzahl, t in h]
          // P = UF * n * 3600 / t [n in Anzahl, t in s]
          // P = 1/75kW * n * 3600 / t [n in Anzahl, t in s]
          // P = 48kW * n / t [n in Anzahl, t in s]
          Stromzaehler_Haus_Umdrehungszeit = 0u32
          Stromzaehler_Haus_Zaehlimpuls = convert("Stromzaehler Haus-8/0/0" * UF_Impulszaehler, 0u32)
          Stromzaehler_Haus_Momentanverbrauch = 0u32
          Stromzaehler_WP_Umdrehungszeit = 0u32
          Stromzaehler_WP_Zaehlimpuls = convert("Stromzaehler Waermepumpe-8/0/2" * UF_Impulszaehler, 0u32)
          Stromzaehler_WP_Momentanverbrauch = 0u32
          if cycle(0,1) then \\
          Stromzaehler_Haus_Umdrehungszeit = Stromzaehler_Haus_Umdrehungszeit + 1u32 \\
          endif
          if change(Stromzaehler_Haus_Zaehlimpuls) then \\
          Stromzaehler_Haus_Momentanverbrauch = 48000u32 / Stromzaehler_Haus_Umdrehungszeit; \\
          Stromzaehler_Haus_Umdrehungszeit = 0u32; \\
          endif
          if cycle(0,1) then \\
          Stromzaehler_WP_Umdrehungszeit = Stromzaehler_WP_Umdrehungszeit + 1u32 \\
          endif
          if change(Stromzaehler_WP_Zaehlimpuls) then \\
          Stromzaehler_WP_Momentanverbrauch = 48000u32 / Stromzaehler_WP_Umdrehungszeit; \\
          Stromzaehler_WP_Umdrehungszeit = 0u32; \\
          endif
          if change(Stromzaehler_Haus_Momentanverbrauch) then \\
          pdisplay(ID_Energie_Haus_Verbrauch_Aktuell,convert (Stromzaehler_Haus_Momentanverbrauch,$$) + $ W$,INFO,INACTIVE,GREY,PageID_Energieverbrauch) \\
          endif
          if change(Stromzaehler_WP_Momentanverbrauch) then \\
          pdisplay(ID_Energie_WP_Verbrauch_Aktuell,convert(S tromzaehler_WP_Momentanverbrauch,$$) + $ W$,INFO,INACTIVE,GREY,PageID_Energieverbrauch) \\
          endif

          // Momentanverbrauch in Charts schreiben
          Stromzaehler_Haus_Momentanverbrauch_Chart = convert(Stromzaehler_Haus_Momentanverbrauch, 0.0f16)
          Stromzaehler_Haus_Zaehlimpulsanzahl = 0u32
          if change(Stromzaehler_Haus_Zaehlimpuls) then \\
          Stromzaehler_Haus_Zaehlimpulsanzahl = Stromzaehler_Haus_Zaehlimpulsanzahl + 1u32 \\
          endif
          Stromzaehler_WP_Momentanverbrauch_Chart = convert(Stromzaehler_WP_Momentanverbrauch, 0.0f16)
          Stromzaehler_WP_Zaehlimpulsanzahl = 0u32
          if change(Stromzaehler_WP_Zaehlimpuls) then \\
          Stromzaehler_WP_Zaehlimpulsanzahl = Stromzaehler_WP_Zaehlimpulsanzahl + 1u32 \\
          endif
          if Stromzaehler_Haus_Zaehlimpulsanzahl > 3u32 \\
          and change(Stromzaehler_Haus_Momentanverbrauch) then \\
          mpchart(ID_Energie_Haus_Chart_Stromverbrauch,WebZe it,Stromzaehler_Haus_Momentanverbrauch_Chart,0,Pag eID_Energieverbrauch) \\
          endif
          if Stromzaehler_WP_Zaehlimpulsanzahl > 3u32 \\
          and change(Stromzaehler_WP_Momentanverbrauch) then \\
          mpchart(ID_Energie_WP_Chart_Stromverbrauch,WebZeit ,Stromzaehler_WP_Momentanverbrauch_Chart,0,PageID_ Energieverbrauch) \\
          endif

          // Tagesstromverbrauch berechnen und visualisieren
          if htime(00,00,00) then \\
          Stromzaehler_Haus_Tagesanfang = Stromzaehler_Haus; \\
          Stromzaehler_WP_Tagesanfang = Stromzaehler_WP \\
          endif
          Stromverbrauch_Haus_AktuellerTag = Stromzaehler_Haus - Stromzaehler_Haus_Tagesanfang
          Stromverbrauch_WP_AktuellerTag = Stromzaehler_WP - Stromzaehler_WP_Tagesanfang
          if (Init == EIN \\
          or change(Stromverbrauch_Haus_AktuellerTag)) \\
          and Stromzaehler_Haus_Tagesanfang >0u32 then \\
          pdisplay(ID_Energie_Haus_Verbrauch_AktuellerTag,co nvert(Stromverbrauch_Haus_AktuellerTag,$$) + $ kWh$,INFO,INACTIVE,GREY,PageID_Energieverbrauch) \\
          endif
          if (Init == EIN \\
          or change(Stromverbrauch_WP_AktuellerTag)) \\
          and Stromzaehler_WP_Tagesanfang > 0u32 then \\
          pdisplay(ID_Energie_WP_Verbrauch_AktuellerTag,conv ert(Stromverbrauch_WP_AktuellerTag,$$) + $ kWh$,INFO,INACTIVE,GREY,PageID_Energieverbrauch) \\
          endif

          // Jahresstromverbrauch berechnen und visualisieren
          Stromverbrauch_Haus_AktuellesJahr = Stromzaehler_Haus - Stromzaehler_Haus_Jahresanfang
          Stromverbrauch_WP_AktuellesJahr = Stromzaehler_WP - Stromzaehler_WP_Jahresanfang
          if Init == EIN \\
          or change(Stromverbrauch_Haus_AktuellesJahr) then \\
          pdisplay(ID_Energie_Haus_Verbrauch_AktuellesJahr,c onvert(Stromverbrauch_Haus_AktuellesJahr,$$) + $ kWh$,INFO,INACTIVE,GREY,PageID_Energieverbrauch) \\
          endif
          if Init == EIN \\
          or change(Stromverbrauch_WP_AktuellesJahr) then \\
          pdisplay(ID_Energie_WP_Verbrauch_AktuellesJahr,con vert(Stromverbrauch_WP_AktuellesJahr,$$) + $ kWh$,INFO,INACTIVE,GREY,PageID_Energieverbrauch) \\
          endif
          [/highlight]

          Achtung, der Code ist auf eine Siemens Tasterschnittstelle ausgerichtet. Diese rechnet für jeden Impuls 0.01f16. Daher ganz oben der Umrechnungsfaktor von 100.0f16. Bei Tasterschnittstellen mit 1 Impuls = 1.0f16 ist der Umrechnungsfaktor auf 1.0f16 zu setzen oder zu entfernen.
          Angehängte Dateien

          Kommentar


            #6
            Zitat von Jambala Beitrag anzeigen
            4%, da der EibPC (cycle) nichts unterhalb einer Sekunde messen kann.
            Doch, seit der letzten Firmware gibt es Delayc und Afterc. Beide messen Zeiten in ms-Auflōsung. Im Handbuch gibt es Beispiele, soweit ich mich erinnere. Habe hier ich schon Beispiele gepostet.
            offizielles Supportforum für den Enertex® EibPC: https://knx-user-forum.de/eibpc/
            Enertex Produkte kaufen

            Kommentar


              #7
              Ihr seit ja lustig bei Enertex ...

              Im Handbuch sind zu Afterc zahlreiche Beispiele. Dieser beinhalten aber alle After und nicht AfterC.

              Edit: Bei Delayc ist dies auch so.

              Kommentar


                #8
                Eigentlich müßte eine 100ms Abtastung auch nur mit after() umsetzbar sein:

                Timer = 0u32
                Start = AUS
                if INIT == EIN then Start = EIN endif
                if after(Start == EIN, 100u64) then Timer = Timer + 1u32; Start = AUS endif
                if after(Start == AUS, 100u64) then Timer = Timer + 1u32; Start = EIN endif

                Kommentar


                  #9
                  und so setzt du alle 100 ms den Timer um 1 sec nach oben ??

                  du könntest auch timer = timer + 0.1f32 machen.. oder ???
                  Die Selbsthilfegruppe "UTF-8-Probleme" trifft sich diesmal abweichend im groüen Saal.

                  Kommentar


                    #10
                    Ich hab da mal ne allgemeine Frage:
                    Wo greift man die Impulse eines Stromzählers ab??
                    ( Soweit ich das mitgeschnitten hab, darf man die nicht öffnen)

                    Kommentar


                      #11
                      Zitat von Brick Beitrag anzeigen
                      und so setzt du alle 100 ms den Timer um 1 sec nach oben ??

                      du könntest auch timer = timer + 0.1f32 machen.. oder ???
                      Ich würde das später umrechnen, aber klar das geht so auch direkt. Hauptsache das doppelte after() führt zu 100ms Zyklen.

                      Kommentar


                        #12
                        Zitat von yapon Beitrag anzeigen
                        Ich hab da mal ne allgemeine Frage:
                        Wo greift man die Impulse eines Stromzählers ab??
                        ( Soweit ich das mitgeschnitten hab, darf man die nicht öffnen)
                        Ich taste die Zählerscheibe mit einem Reflexkoppler optisch ab. Dieser hängt an einer Tasterschnittstelle.

                        Kommentar


                          #13
                          und ich mit sowas..

                          Gruß Martin
                          Die Selbsthilfegruppe "UTF-8-Probleme" trifft sich diesmal abweichend im groüen Saal.

                          Kommentar


                            #14
                            Zitat von Jambala Beitrag anzeigen
                            Eigentlich müßte eine 100ms Abtastung auch nur mit after() umsetzbar sein:
                            das macht aber eigentlich nur die Genauigkeit bei großem Verbrauch (höhere Impulsfrequenz) genauer... bei kleinen Verbräuchen bringt das nicht viel...
                            und gerade das wüsste ich gern... letztendlich ist es mir egal ob ich 3000 Watt oder 3100 Watt (Momentan-) verbrauche... interessanter finde ich es ob ich 10 oder 150 Watt verbrauche...

                            alle Werte unter 60 Watt sind da meiner Meinung nach schwer darzustellen da die Messzeit dann über 60 Sec. betragen muss. (bei deinem 75 n/kwh ist es ja noch viel schlimmer)...

                            Gruß Martin
                            Die Selbsthilfegruppe "UTF-8-Probleme" trifft sich diesmal abweichend im groüen Saal.

                            Kommentar


                              #15
                              Zitat von Jambala Beitrag anzeigen
                              Eigentlich müßte eine 100ms Abtastung auch nur mit after() umsetzbar sein:
                              Ist etwas ungenau, wenn die Zykluszeit z.b. Auf 20 ms eingestellt ist, da dann ein Jitter von 20 bis 30 Prozent entsteht.
                              offizielles Supportforum für den Enertex® EibPC: https://knx-user-forum.de/eibpc/
                              Enertex Produkte kaufen

                              Kommentar

                              Lädt...
                              X