Für dieses Forum muß Javascript im Browser aktiviert werden!
Kommentar: Einfügen von HTML im Kommentar: Link einfügen: <a href="LINKURL" target="_blank">LINKTITEL</a> Bild einfügen: <img src="BILDURL"> Text formatieren: <b>fetter Text</b> <i>kursiver Text</i> <u>unterstrichener Text</u> Kombinationen sind auch möglich z.B.: <b><i>fetter & kursiver Text</i></b> C2 Quellcode formatieren: <code>Quellcode</code> ASM Quellcode formatieren: <asm>Quellcode</asm> (Innerhalb eines Quellcodeabschnitts ist kein html möglich.) Wichtig: Bitte mache Zeilenumbrüche, bevor Du am rechten Rand des Eingabefeldes ankommst ! > Hallo Gemeinde, > hier ein kurzer, klärender eMail-Verkehr, evtl. hilft es dem Einen oder Anderen Anfänger, wie ich einer bin, weiter. > > Zitat Beginn *************************************** > Hallo Herr Schroeder, > > > ich bin derzeit ein wenig blind, evtl. koennen Sie mir die Augen oeffnen. > > Ich wuerde gerne Ihren Code aus dem Forum nutzen, um meinen Stromzaehlerstand zu loggen, und > > den aktuellen Verbrauch zu berechnen, nur erzeugt mein Zaehler 75 Impulse pro kWh, statt der > > von Ihnen dokumentierten 2000. Wo versteckt sich im Code der Faktor 2000 ? > > Die Erklärung ist einfach: > Ich rechne nicht mit 2000 Impulsen pro kWh, sondern mit 0,5Wh pro Impuls. > Das kommt zwar im Endeffekt auf dasselbe heraus, jedoch enthält die Berechnung dann keinen > Faktor 2000. > Beim Wert für die Arbeit (W) ist es folgende Zeile: > var.W[0]=Impcnt*5; > Hier beträgt der Faktor 5. in var.W[] steht zentel-Wh. > Kurz, gezählt wird in 0,5Wh-Schritten. > Um dies nun für einen Zähler mit 75Imp./kWh zu ändern, müßte der Falktor > entsprechend 133 1/3 lauten. Zugegeben ein blöder Faktor, da sich so Ungenauigkeiten > einschleichen. > Besser ist es hier auf jeden Fall, die Anzahl der aufgelaufenen Impulse erst mit > 400 zu multiplizieren, und dann durch 3 zu teilen: > <b>var.W[0]=(Impcnt*400)/3;</b> > Die Klammern sind hier wichtig, um die Rundungsdifferenzen klein zu halten. > Der Fehler bleibt so mei max. 0,1Wh. > Wenn eine Genauigkeit von 1Wh reicht kann man stattdessen auch in Wh statt in 0,1Wh zählen. > Der Faktor ändert sich dann von 400 auf 40. Die 3 bleibt. > > Nun zur Leistungsbestimmung: > Es gibt zweimal die Zeile > var.P[0]=(Imp_prev)* (3600000/timer2)/2; > Beide müssen analog geändert werden. > Die Leistung wird mit einer Auflösung von 1W gemessen. > Ein Impuls hat 0,5Wh. Um dies auszugleichen wird durch 2 geteilt. > Die 3600000 entsprechen einer Stunde in ms. > Der Wert wird durch die vergangende Zeit geteilt, um den Anteil einer Stunde zwischen > zwei (oder mehr) Impulsen zu ermitteln. > Das Ergebnis wird mit der Anzahl der erfaßten Impulse seit der letzten Messung multipliziert. > Statt durch zwei zu teilen, muß hier mit 13 1/3 multipliziert werden. > Der Genauigkeit halber wird hier wieder mit 40 Multipliziert und anschließend durch 3 geteilt: > var.P[0]=(Imp_prev)* ((3600000/timer2)*40)/3; > Es ergeben sich hier teoretisch zwangsläufig Rundungsdifferenzen. > Man kann aber die Zeilte folgendermaßen ändern, um das zu umgehen: > var.P[0]=(Imp_prev)* ((3600000*40)/(timer2*3)); > Daraus ergibt sich folgendes: > <b>var.P[0]=(Imp_prev)* (48000000/timer2);</b> > > Was noch angepaßt werden muß, sind die Werte für das Timeout. > Es beträgt hier 90 Sekunden. D.h. wird nach 90 Sekunden kein weiterer Impuls erfaßt, > wird von 0W ausgegangen. Bei einem Zähler mit nur 75Imp./KWh ist das ein zu kleiner > Wert. Welcher Wert am Sinnvollsten ist, hängt von der Grundlast ab. > Bei 1kW wären es 75 Impulse pro Minute. Mit 90Sek. würde das heißten, Daß Lasten > unter ca. 830W also 0W gedeutet würden bzw., daß es zu einer Schwankenden Anzeige kommt. > Wenn man nun 100W als Mindestleistung ansetzt, muß man 750sek.(=12,5Min.) ansetzen, also den > Wert 750000. > > Die If-Abfrage unter dem Timeout sorgt dafür, daß die Leistung interpoliert wird, wenn > der letzte Impuls länger als das doppelte der letzten Dauer ausbleibt. > > MfG André Helbig > > > > > > > > > > herzlichen Dank fuer Ihre Hilfe im voraus. > > mfg Ralf Schroeder > Zitat Ende *************************************** > > > > >> Hallo Sascha, > >> > > >> Entwarnung ! > >> > Nach durchforsten meines Handbuchs fand ich heraus, daß die Ports P00-P04 wohl nicht > >> > geeignet sind für eine Zählung.... > > >> > >> > Stimmt das, das die Ports nur als Ausgang funktionieren ??? > >> > >> Diese Ports heißen PO.0 bis PO.4, nicht P0.0 bis P0.4. > >> Nach dem P folgt der Buchstabe O, nicht die Ziffer Null. > >> Das O steht für Out. > >> Es sind Ausgänge der Schieberegister in der Station. Es sind keine Ports der CC2 selbst. > >> Daher sind diese Port nur Ausgänge und könne nicht als Eingänge benutzt werden.. > >> Das Zurücklesen der Portzustände über <code>stports.get()</code> dient nur > >> dazu die aktuellen (Soll-)Schaltzustände zurückzulesen, welche in > >> zwei Bytes gespeichert werden. > >> > >> Zum Erfassen von Impulsen brauchst Du die Counter-Ports welche an P1H liegen. > >> Die 8 Ports von P1H sind bei der Station mit P0 bis P8 beschriftet. > >> Angesteuert werden diese über ports.c2 als Port 8 bis 15. > >> P1H.0 bis P1H.3 sind die Counterports. > >> Die Auswertung erfolgt mit ports.getcount() mit Parameter 0 bis 3. > >> > >> Den S0-Ausgang des Zählers mußt Du zwischen Port(+) und GND(-) anschließen. > >> Bei der CC2-Station muß Du zusätzlich Pull-Up-Widerstände(10k) an > >> die 4 Counter-Ports anschließen, welche der Ersteller der Station vergessen hatte. > >> Diese Pull-Up-Widerstände müssen <u>immer</u> an diese 4 Ports gesetzt werden, > >> da ansonsten unkontrolliert Interrupts ausgelöst werden können, wenn diese Ports > >> kein festes Potential besitzen. Das kann im Extremfall dazu führen, daß Programme > >> deutlich langsamer ausgeführt werden. > >> > >> Zur Auswertung des Zählers kann ich Dir folgenden Thread geben: > >> <code>thread getL1 > >> { > >> long Impcnt; > >> long Imp_old,Imp,Imp_prev,timer,timer2; > >> Imp_old=0; > >> var.W[0]=0; > >> var.P[0]=0; > >> Impcnt=0; > >> Imp_old=0; > >> loop > >> { > >> timer=system.timer(); > >> do > >> { > >> Impcnt= Impcnt+ ports.getcount(0); > >> if timer <= system.timer()-90000 var.P[0]=0; > >> if (system.timer()-timer) > timer2 shl 1 > >> { > >> timer2=timer2+(system.timer()-timer); > >> var.P[0]=Imp_prev * (3600000/timer2)/2; > >> } > >> } while Impcnt==Imp_old; > >> var.W[0]=Impcnt*5; > >> timer2=system.timer()-timer; > >> Imp_prev=Impcnt-Imp_old; > >> var.P[0]=(Imp_prev)* (3600000/timer2)/2; > >> Imp_old=Impcnt; > >> } > >> }</code> > >> > >> Es ist einer der Threads für die Zähler meines PÖL-BHKWs. (Einzelerfassung der Phasen) > >> var.W und var.P sind Longarrays für die Arbeit in 0,1Wh und für die Leistung in Watt. > >> Meine Zähler geben 2000 Impulse pro kWh aus, also 0,5Wh pro Impuls. > >> Die Routine berechnet nach jedem Impuls die aktuelle Leistung und die Arbeit. > >> Die Routine beinhaltet auch eine Berechnung der vermutlich aktuellen Leistung, > >> wenn nach mind. der zweifachen Zeit zweischen den beiden letzten Impulsen > >> kein weiterer folgt. > >> In der Routine wird nicht beachtet, daß der interne System-Timer einen Tick schneller > >> läuft, als die Uhr, und somit u.U. eine zu geringe Leistung berechnet wird. > >> Allerdings liegt dies im Promille-Bereich und kann vernachlässigt werden. > >> > >> MfG André H. >