Re: SO-Schnittstelle Stromzähler Kategorie: Sonstige Hardware (von Ralf Schroeder - 25.03.2009 22:40) | ||
Als Antwort auf Re: SO-Schnittstelle Stromzähler von André H. - 15.10.2006 17:24 | ||
| ||
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: var.W[0]=(Impcnt*400)/3; 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: var.P[0]=(Imp_prev)* (48000000/timer2); 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 stports.get() 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 immer 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: >> 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; >> } >> } >> >> 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. | ||
Antwort schreiben Antworten: |