PowerPredictor

alternative Firmware?
 
Erdorf
Moderator
Avatar
Geschlecht:
Alter: 54
Beiträge: 3267
Dabei seit: 12 / 2009
Betreff:

Re: PowerPredictor

 · 
Gepostet: 20.09.2013 - 09:43 Uhr  ·  #101
Hi XXLRay,

Zitat
Wenn du einfach mit jedem Logwert die Summe und Anzahl der Messwerte (für Jahr, Monat, Tag, ...) addierst, braucht die eigentliche Mittelwertberechnung auch nicht lange.

Ja, das ist korrekt, so ungefähr, ist ja auch mein Ansatz, die Mittelwerte direkt während dem Loggen zu berechnen.

Das von Uwe skizzierte Problem einer späteren Ertragsprognose auf Basis (arithmetisch) gemittelter Werte bleibt dann immer noch bestehen.
Deswegen ja die Aussage von Uwe solche Prognosen IMMER auf den Sekunden Werten zu machen.
Das ist zweifelsfrei das genauste, leider 'Brute Force': Datenmengen Problem (Langzeitdatenspeicherung länger als 1 Jahr ) und ein erhebliches Zeitproblem.

Deswegen ja mein Ansatz: zusätzlich zu den (normal gemittelten) Werten, die Energie im Wind (pro m²) als sekundäre, abgeleitete Größe mit zu loggen.
(Temperatur und Luft-Feuchte könnte man, falls vorhanden ja auch sofort mit berücksichtigen)
Hier sind dann wieder Summen (und Summen von Summen) möglich ohne ein energetisch falsches Bild zu vermitteln.

Mit einem mittleren Wirkungsgrad und der Rotor Fläche lässt sich dann damit schon was abschätzen.
Richtig genau wird es wenn man Leistungskurven von einem oder mehreren Windrädern eingibt.
a) Im Nachhinein, dann muss man wieder auf den Rohdaten (langsam)
b) Im Nachhinein, hierbei setzt man auf die Häufigkeitsverteilungen des Windes auf (flott).
c) man gibt ein (oder mehrere Leistungskurven) vorher ein und der Powerpredictor berechnet während der Messung schon die 'virtuellen' Erträge (flott).

Alles was während der Messung läuft, liefert dann Prognosen geschätzt innerhalb von max. < 10s :D

Das ist alles natürlich viel Arbeit :'(

@Marko,
Magst du mir das mit den nötigen 32 Bitwerten für die Zeitmessung (mit ca. 10Khz) noch erklären :-)

Gruß Frank
...
 
Avatar
 
Betreff:

Re: PowerPredictor

 · 
Gepostet: 20.09.2013 - 10:12 Uhr  ·  #102
die 32 Bit kommen daher ... wenn ich den Timer mit Vorteiler 8 laufen lasse (der ist nicht ganz frei wählbar), dann läuft der Timer bei Systemtakt 16 MHz (Berechnung 16000000 / 65536/8) mit 30 Hz über ... das bedeutet, dass Umdrehungen unter 30 pro Sekunde nicht gemessen werden könnten.
Nun geht man hin und lässt im Timer Overflow Interrupt ne Variable mit hochzählen, ok bei der ersten Berechnung hatt ich irgendwo nen Fehler drinnen, wenn nich da ne Bytevariable (8 Bit) hochzählen lasse, dann komm ich runter auf 0,11 Hz Messung, das wären dann aber insgesamt 24 Bit Daten, einmal die 16 vom Timer in Hardware, und ein höheres Bis für den Überlauf.

Bei Vorteiler 1 würde die Bytevariable nicht reichen, dann würds was 16-Bittiges werden und damit insgesamt 32 Bit mit dem Hardwaretimer zusammen.

Die TImervorteiler sind:
1 , 8, 32 , 64 , 256 oder 1024 in Hardware.

Aber das Timing steht noch nicht fest, evtl. geh ich auf nen Baudratenquarz für Modbus-Slave, damit der Baudratenfehler eben Null wird.

Gestern Nacht hab ich den Wikiabschnitt über die Wetterstation angefangen ... fehlt noch die Templateerstellung:

tools/powerpredictor/wiki/doku…terstation
Erdorf
Moderator
Avatar
Geschlecht:
Alter: 54
Beiträge: 3267
Dabei seit: 12 / 2009
Betreff:

Re: PowerPredictor

 · 
Gepostet: 20.09.2013 - 14:25 Uhr  ·  #103
Danke Marko,

ich kann jetzt wieder folgen O-)

# Hardwaretimer und IRQ Überlauf (ich rechne auch mal mit)
Ok, wir wollen jede Sekunde Werte liefern.
Dazu brauchen wir einen Timer, der die Sekunde möglichst gut auflösen kann.
Ein 16 Bit Timer mit z.B. 16Khz reicht hier aus, er kann 4 Sekunden mit dann 16 Bit auflösen oder die Sekunde durch 16000 teilen.
Bei 16Mhz Systemtakt wäre wohl ein prescaler von 1024 zu bevorzugen.
Um jede Sekunde dann die schon mehrfach gemittelte Frequenz des Signals (Windsensor, oder Rotordrehzahl) auszugeben,
reicht das, weil der Timer nicht innerhalb einer Sekunde überläuft.
In diesem Fall ist keine weitere Überlauf Behandlung erforderlich.
Wie kann man denn den 16 Bit Hardware Timer auslesen? Dauert das lange?

Davon unabhängig ist es nett, wenn man, warum auch immer, Zeitabstände im Minuten Bereich ermitteln zu können.
Den Überlauf, z.B. per IRQ zu behandeln und sozusagen die 4 Sekunden Intervalle mit zu zählen finde ich klasse.
So kann man (unter Verlust eines IRQ) aus dem Hardware 16 Bit timer einen 32 BIT Timer und mehr machen ^_^

Bei 8 Bit mehr läuft dieser (4s) Timer dann bei 1000 Sekunden über was grob 15 Minuten wären.
Bei 16 Bit mehr läuft dieser (4s) Timer dann bei 256000 Sekunden über was grob 70 h wären oder fast 3 Tage wären.
Wo willst du denn den Überlauf abspeichern? Im Register, dann kann ich deine 'Knauserei' verstehen.
Geht denn nicht im RAM? Wie viel RAM ist denn verfügbar?
Wie hast du vor den Controller zu programmieren? C oder ASM oder beides?
Was passiert eigentlich, wenn zwei IRQ's gleichzeitig anstehen?
Willst du alles über IRQ Routinen ab handeln?
Hätte den Vorteil nicht unterbrechbar zu sein?

Ich glaube ich ahne wo das Problem noch ist:
Man muss natürlich auch recht präzise den Sekunden Takt einhalten.
Kann die Echtzeituhr nicht diesen Takt liefern?

Sorry wieder viele Fragen,
ich finde es einfach klasse was du da 'treibst' und möchte es gerne verstehen :fgrin:

Gruß Frank
...
 
Avatar
 
Betreff:

Re: PowerPredictor

 · 
Gepostet: 20.09.2013 - 20:29 Uhr  ·  #104
:) immer her mit den Fragen, mitunter bringt einen ne Frage auch wieder auf neue Ideen, sehr nützlich ist das ;)

Nen Timer auszulesen dauert nicht lange, 20 Taktyzklen vom Controller sollten reichen, dann steht der Wert im RAM ...

Was wir ja messen wollen ist die Laufzeit des Rädchens für eine Umdrehung und zunächst nicht wieviele Umdrehungen pro Sekunde, die ergeben sich aus der Laufzeit dann zwangsläufig.
Das gleiche gilt natürlich auch für die Generatorfrequenz.
Gleichzeitig wollen wir ne Auslese- und Loggingfrequenz von 1Hz haben vom RaspPi, wobei diese weil ja n OS drauf läuft nur relativ präzise realisierbar sein wird, bin da selber schon gespannt.
Allerdings kann die Drehzahl bei der WIndmessung mitunter unter 1 Hz sein, auch da sollte man denk ich nen Wert ermitteln, also ne Torzeit von 4-5 Sekunden oder anders eben alle 4-5 Sekunden dann nen Messwert, der dann eben so lange fürs logging stehen bleibt sollte schon sein.
Der Controller kann klaro auch Mittelwerte ermitteln, also Sekundenmittel, 10 Sekunden Mittel etc. kein Problem, der Messwert steht aber in jedem Fall dann als quasi Zählwert a x Mikrosekunden zur Weiterverarbeitung im RasPi dann an. Erst dort darf die Umrechnung in Meter/Sekunde erfolgen, damit die Elektronik eben auf diverse Anemometer jeweils angepasst werden kann.
Von der Verarbeitung her wären die reinen Timerwerte von der Programmierung her ideal, weil eben 16 Bit, das geht flott von der Hand sozusagen

ok,rechnen wirs mal präzise aus ... der nächstegelegene Baudratenquarz wäre 14,7456 MHz, also 14745600 Programmschritte oder Zählzyklen je Sekunde.
wenn ich nun als Obergrenze der zu messenden Zeit 4-5 Sekunden nehme und nur die 16 Bit vom Counter verwende, dann komm ich
auf folgende Werte ...
Mit dem Vorteiler von 1024 komm ich auf 14400 Zählschritte je Sekunde, was dann bei 16 Bit eine maximale Laufzeit bis zum Überlauf von rund 4,5511 Sekunden ergibt. Daraus ergäbe sich ein äquivalent pro Bit bzw. Digit von 69,44µs. Die Drehzahl wär dann einfach 1/(Digits * 0,00006944)
oder andersherum hätten wir die Drehzah mit +/- 1/14400 U/s allerdings Programmzyklen und Signallaufzeiten in der Rechnung nicht berücksichtigt.
Wenn das nicht reichen sollte, dann kann man die Vorteiler kleiner wählen, dann wird die minimale Drehzahl kleiner, dann würde ich auf ne Hilfsvariable wechseln und dann eben auf 24 Bit oder 32 Bit gehen ... das würde ich aber vorerst vertagen, bis die Hardware ausprojektiert ist, da bin ich noch dabei, die Wetterstation hat mich etwas aufgehalten.

Der von mir favorisierte Controller ATMega hat quasi ne Liste an Interruptprioritäten. Die wird bei jedem Interrupt angesprungen und die Sprungadresse für den jeweiligen Interrupt ausgelesen, erst dann springt er im Programm in den IRQ bzw. in die ISR. Wenn nun mehrere Interrupts gleichzeitig anstehen, dann wird der, der in der Liste weiter vorne steht als erstes ausgeführt. Die Liste ist von der Reihenfolge her fest vorgegeben, kann nicht umsortiert werden bei dem Controller.
Man kann in einer Interruptroutine die Interrupts wiederum aktivieren, was dann dazu führt, dass er die ISR unterbricht und die Andere zuerst ausführt ... das macht man aber nicht so gerne, da können "interessante" Ergebnisse dabei herauskommen.
Generell gilt, eine Interruptroutine immer so kurz wie möglich zu gestalten, Berechnungen, Protokolle etc. nicht im Interrupt, sondern im Hauptprogramm.
In die IRQs gehören timingkritische Angelegenheitem, wie z.B. das Timer auslesen oder Datenempfang, der REst kommt in die Mainloop. Im Idealfall mach ich in der IRQ nur n Flag, aber das kann ich jetzt noch nicht genau sagen, kommt auf die Aufgaben, die der Controller noch so zu machen hat an.
der ATMega162 hat 1k SRAM, da kann man schon ne Menge reinpacken.

Ja, die RTC kann in Hardware nen Takt liefern, ich meine es wäre 1Hz als Pin ausgeführt.

Den Controller hatte ich vor in Basic und ASM zu Coden ... ASM in den IRQs .... C wäre auch möglich, find die Syntax aber immer irgendwie doof ... hängt damit zusammen, dass ich mir vor Ewigkeiten mit dem C64-Handbuch damals selber das Programmieren beibrachte und der konnte eben Basic 2.0, daher präfferiere ich da noch heute Basic als Syntax ... bin da aber flexibel, nehme immer die Sprache, die für die gestellte Aufgabe passt, das kann Basic, C, PHP, Java Script, C#, VBA oder sonstwas sein. Programmabläufe sind immer prinzipiell gleich, nur die Syntax und n paar Highlevelbefehle variieren. ;)
...
 
Avatar
 
Betreff:

Re: PowerPredictor

 · 
Gepostet: 21.09.2013 - 18:50 Uhr  ·  #105
Uwe Hallenga
SiteAdmin
Avatar
Geschlecht:
Alter: 63
Homepage: kleinwindanlagen.d…
Beiträge: 1602
Dabei seit: 03 / 2005
Betreff:

Re: PowerPredictor

 · 
Gepostet: 21.09.2013 - 19:00 Uhr  ·  #106
Was die Speicherung der Originaldaten betrifft:

Ausreichend ist sicherlich den Mittelwert einer Minute zu speichern und nicht tatsächlich jede Sekunde. Das enspricht dann auch eher den geplanten Mittelwertvorgabe zur Leistungskennlinienerfassung für Kleinwindanlagen.

Der Datenlogger von Willmers macht es eigentlich auch ganz raffiniert. Er speichert bis zu 24 Stunden mit Sekundenauflösung in einem seperaten "Ereignisspeicher" als Ringkern. Wenn "voll", dann wird der älteste Wert einfach wieder überschrieben.


Gruß Uwe
Erdorf
Moderator
Avatar
Geschlecht:
Alter: 54
Beiträge: 3267
Dabei seit: 12 / 2009
Betreff:

Re: PowerPredictor

 · 
Gepostet: 22.09.2013 - 20:54 Uhr  ·  #107
Hallo Marko,

Zitat
Gleichzeitig wollen wir ne Auslese- und Loggingfrequenz von 1Hz haben vom RaspPi, wobei diese weil ja n OS drauf läuft nur relativ präzise realisierbar sein wird, bin da selber schon gespannt.


Ja und nein, der RaspPi kann hier 'nix' garantieren ohne irgend etwas im Treiber (Kernelspace) zu machen.
Den Messtakt MUSS der Controller machen.
Der RaspPi kann z.B. bei Schreiben auf DISK mehrere Sekunden im Userspace blockieren.
Außerdem gibt es auf dem BUS Signal Laufzeiten ...

Also RaspPi sammelt 'nur' die Daten vom Bus und schreibt die Weg.
Wann wie viele Daten er bekommt schwankt viel zu stark.
Er muss sich hier auf die sekündliche Lieferung vom Controller verlassen, ggf. werden die Daten gequeued.
Anfänglich ist eine Synchronisation zu absoluten Zeiten (von der Echtzeituhr) erforderlich.
Wenn der Controller nicht exakt die absolute Sekunde einhalten kann,
wird auch zur Laufzeit eine Anpassung an die absolut Zeiten nötig sein.
Ich würde meinen, dass man so die absolute Zeiten +- 2 Sekunden genau halten kann.

Zitat
Allerdings kann die Drehzahl bei der Windmessung mitunter unter 1 Hz sein

Ja, kann sein, dann gibt es aber auch keinen Wind, zumindest keinen, der Energie genug hätte.
Es wird schwierig, das Lösen zu wollen, falls ja, müsste der Controller
a) Dynamisch, seine Update Rate bestimmen
b) Bei den Messwerten einen eigen (32 Bit) Zeitstempel mit liefern
c) Die Auswerte Software solche dynamischen Update Intervalle berücksichtigen
d) auch der (32 Bit) Zeitstempel läuft irgendwann über, das gilt es korrekt auf dem PI zu behandeln.
Lohnt sich dieser Aufwand für kaum Wind?
Alternativ kann der Controller zusätzlich zum 1 Sekunden (Mittel) alle 10 Sekunden auch z.B. ein 10 Sekunden Mittel liefern.
Hier wären dann Frequenzen von 0.1 Hz mit aufführbar. Wobei dann 16 Bit zur Darstellung nicht ausreichen, aber das wäre wohl verschmerzbar ...

Zitat
der Messwert steht aber in jedem Fall dann als quasi Zählwert a x Mikrosekunden zur Weiterverarbeitung im RasPi dann an

Ja, geht, muss aber nicht, der Controller könnte die schon gemittelte Periodendauer liefern, müsste jedoch dafür eine 16 Bit Division machen, was 'teuer' ist. Also count und summierte Periodendauer sind OK wie ich finde, den Rest macht der PI, klingt vernünftig.

Zitat
Von der Verarbeitung her wären die reinen Timerwerte von der Programmierung her ideal, weil eben 16 Bit, das geht flott von der Hand sozusagen

Ja, klar, im Controller so simple wie möglich, und so aufwändig wie nötig. Einfach binär hoch schubsen.

Zitat
der nächstegelegene Baudratenquarz wäre 14,7456 MHz

Das funktioniert genauso, wird halt was krummer auf dem PI zum umrechnen,
es gibt aber bestimmt 'nen vernünftigen Bruch, so dann man kein Float verwenden muss oder?

Mir ist was eingefallen, eigentlich ist kein externer 16 Bit Timer erforderlich.
Wenn man den Ausgang vom prescaler (1024) direkt an ein IRQ vom Controller anbringt
wird man alle 1024 Takzyklen, also dann mit einer Frequenz von 14,7456 KHz 'geweckt'.
Im IRQ dann ein 32Bit increment auf eine Adresse im Ram,
Fertig ist ein 32Bit Software Timer (die untersten 16 Bit laufen mit 14,7456 KHz oder so über).
Was meinst du?

Zitat
Ja, die RTC kann in Hardware nen Takt liefern, ich meine es wäre 1Hz als Pin ausgeführt.

Macht es Sinn, das auch als IRQ an den Controller zu binden?
Und das IRQ als Event zum Hochschubsen der Messwerte Richtung PI zu nutzen?
Damit geht man doch einigen Problemen aus dem Weg,
z.B. entfällt eine Zeitsynchronisation währen der Laufzeit zwischen Controller und PI.
Um die gelieferten Daten immer recht genau absoluten Zeiten zuzuordnen.
Wie viele IRQ's hat denn so ein Controller ;-)

Zitat
hängt damit zusammen, dass ich mir vor Ewigkeiten mit dem C64-Handbuch damals selber das Programmieren beibrachte

Good old times, da kenne ich noch was von :fgrin:
Tja Lehrer gab es damals keine die sich damit aus kannten, zumindest keine in meiner Nähe ...
Ich habe auch die ersten Schritte in Basic und nachher Assembler auf der Brotkiste gelernt :P
Achso, stimmt, ich habe auch Grundkenntnisse in ASM, mache einfach zu wenig mittlerweile damit.
Hin und wieder ASM lesen, wenn der c Layer 'esotherisch' wird hihi, ASM ist dann zweifelsfrei die gute Seite der Macht.

@Uwe
So wie ich es verstehe, bekommt die Lösung mit dem PI 'Probleme' wenn die Sekunden Daten mehrere Jahre vorgehalten werden sollen.
Mal sehen wo das Ganze dann tatsächlich landet, aber im Moment spricht nichts dagegen die Daten mindestens ein Jahr lang zu halten.

Für die gemittelten Daten könntest du ja mal ein paar Vorgaben machen,
Es geht um möglichst einheitliche und einfach vergleichbare Werte, was also üblich und praktikabel ist ..
1 s
1 min
1 h?
24 h?
7 Tage?
1 Monat?
1 Jahr?

Gruss Frank
...
 
Avatar
 
Betreff:

Re: PowerPredictor

 · 
Gepostet: 22.09.2013 - 23:14 Uhr  ·  #108
dann müsste aber der Controller als Master am Bus hängen ... eher nicht so ideal, würde den schon als Slave laufen lassen und ggf. eben nen 10stufigen Buffer vor den Output hängen, also die Messwerte über 10 Sekunden im Controller vorhalten, bis dann der Pi die ausliest.
Dann würde ich eher sagen, der Pi bekommt vom Controller nen Data Ready Pin Spendiert, der gesetzt wird wenn im Controller neue Daten abrufbar sind. Ist bei AD-wandlern ne gebräuchliche Methode DRDY.

Der ATMega162 hat, ich vermute mal, dass Du das meinst, 3 konfigurierbare und 16 Pin Change Interrupts. Der wesentliche Unterschied, die 3 kann man konfigurieren auf fallende, steigende Flanke oder Status High / Low. Die Pin Change reagieren immer beim Zustandswechsel und als ganzer Block.
Erdorf
Moderator
Avatar
Geschlecht:
Alter: 54
Beiträge: 3267
Dabei seit: 12 / 2009
Betreff:

Re: PowerPredictor

 · 
Gepostet: 23.09.2013 - 09:50 Uhr  ·  #109
Hallo Marko,

Zitat
dann müsste aber der Controller als Master am Bus hängen ... eher nicht so ideal, würde den schon als Slave laufen lassen

ja, ja, Slave ist das richtige, darf denn der Slave nicht spontan senden?
Master/Slave sollte sich doch nur im Kollisionsfall auswirken?

Schick mir doch bitte mal die genaue Bezeichnung des Bussystems (link auf wikipedia, ...)
ich lese mir dann mal ein paar Dinge an, das ist einfacher als jedes Detail von dir abzurufen ...

Wie auch immer, der Controller muss als Slave fungieren
und z.B. nach dem Hochlauf erst mal nichts machen, außer einen 'Listen' auf den BUS.
Der PI braucht eh länger zum hoch laufen und sollte die Messwertaufnahme per speziellem Kommando auf dem BUS starten (und stoppen können).
Also so etwas wie 'Master is ready to receive data) oder im Imperativ: (Controller Start measure X).
Ab dann kann der Controller, wenn der Bus das hergibt, eigentlich ohne weitere Aufforderungen die Daten
sekündlich oder wie auch immer 'hoch' zum PI schicken. Im PI wird dann vom Kernel gepuffert bis der Userspace sich die Daten abholt.
Das macht der Controller solange wie Strom da ist oder der Master (PI) das Stop Kommando schickt.
Mit Puffern im Controller geht zwar, (bedingt), sorgt für einen Nachlauf der zu Behandeln wäre,
die Puffer können überlaufen (wäre vom PI zu behandeln),
das ist immer so eine Sache, macht die Sache nicht wirklich einfacher, wenn vermeidbar, dann lieber vermeiden.

Es macht davon unabhängig wohl Sinn, ein einfaches Protokoll zu definieren:
8 Bit Sekunden Zeitstempel oder Laufzähler, einfache 8 Bit checksum, 8 Bit data len 8 Bit command ID ...
So kann der PI doppelte Daten oder Fehlerhafte Daten erkennen und verwerfen, wird stabiler.
Und man ist unabhängiger von den Garantien die der verwendete BUS liefert.

Noch etwas,
wenn du möchtest dass ich z.B. im Wiki mal etwas dokumentiere,
sag Bescheid (Kapitel, was du dir vorstellst),
ich möchte das, obwohl ich Schreibrechte habe, nicht machen ohne das mit dir abgesprochen zu haben.

Gruß Frank
...
 
Avatar
 
Betreff:

Re: PowerPredictor

 · 
Gepostet: 23.09.2013 - 11:49 Uhr  ·  #110
Du und auch Andere sind gerne willkommen das Wiki zu ergänzen, ändern überarbeiten, freue mich über jede Unterstützung.

Was die Master-Slave-Geschichte angeht, so darf der Slave nie ungefragt Pakete schicken, sonst wär das Multimaster und nicht einfacher zu implementieren.
Das hängt damit zusammen, dass die Uhr direkt am Pi hängt für die Systemzeit, der Pi muss pollen ... Uhr, Luftdruck ... und Controller.

Der Bus ist I²C:
http://de.wikipedia.org/wiki/I2C

Gruß

Marko
Erdorf
Moderator
Avatar
Geschlecht:
Alter: 54
Beiträge: 3267
Dabei seit: 12 / 2009
Betreff:

Re: PowerPredictor

 · 
Gepostet: 23.09.2013 - 13:05 Uhr  ·  #111
Hallo Marko,

danke für den Link, jetzt habe ich es verstanden.

Ich zitiere dann mal daraus "I²C ist als Master-Slave-Bus konzipiert. Ein Datentransfer wird immer durch einen Master initiiert".
Soweit so klar - "Multimaster" hört sich weder einfach, noch stabil an. O-)
Frage: muss denn der SLAVE innerhalb bestimmter Zeiten reagieren und antworten?

Falls nein, kann der MASTER quasi immer, sofort nach dem Empfang, erneut einen Request auf den I2C Bus geben.
Der Controller 'verzögert' dann die Antwort bis zum nächsten Sekunden Takt.
So wären präzise die sekündlichen Intervalle, auf dem Controller, einhaltbar.
Man kann dann zusätzlich, wie du schon gesagt hast, auf dem Controller einen 10er Ring Puffer treiben.
Dann muss der Controller beim Request, eventuelle angestaute Daten liefern oder eben verzögern bis neue Daten vorliegen.
Event getriebenes Polling nenne ich so etwas :P

Ohne Puffer, gehen halt Daten verloren, wenn der PI z.B. beim Schreiben auf die SD Karte für mehr als eine Sekunde blockiert.
Das so etwas auftritt, ist selten dafür aber sicher.
Man kann auf dem PI etwas 'tunen', z.B. indem man die write caches so schmal wie möglich konfiguriert -
ich glaube, zu wissen, dass es aber dann immer noch mindestens 1 MB sind (was an der angedachten Linux Distribution zu prüfen wäre).
Mehr als 10 Sekunden blockiert man, so eingestellt, dann mit an Sicherheit grenzender Wahrscheinlichkeit nicht
Ein 10 Sekunden Puffer, auf dem Controller, müsste genügen und hmm, ja, du hast recht ein Puffer auf dem Controller macht Sinn :D

Gruß Frank
...
 
Avatar
 
Betreff:

Re: PowerPredictor

 · 
Gepostet: 23.09.2013 - 14:21 Uhr  ·  #112
ich denk mir das in etwa so:

Der Controller zieht nen Pin auf High zur Meldung, dass Daten vorhanden.
Der Pi holt sich das erste Paket.
Ist der Controllerpuffer dann leer wird der Pin auf Low gezogen.
Hatte der Pi nen Hänger für mehrere Sekunden und Daten sind im Puffer noch vorhanden,
dann bleibt der Data Ready eben High, der Pi holt weiter ab, bis eben Puffer leer und somit Pin auf Low.

Von der Reihenfolge her würde ich es so machen wollen, erstes Paket ist dann T-0 Sekunden
, dann T-1, T-2 etc. bis T-10. Dann kann der Pi beim ersten Wert die aktuelle Zeit exakt zuordnen, die anderen ergeben sich automatisch daraus.

Die I2C kennt im Gegensatz zum SM-Bus kein Timeout, allerdings gilt das Timeout normalerweise nur für den Slave, der Master gibt den Takt vor, wenn der Slave zu lange braucht um die Bytes ins Ausgangsregister zu schaufeln, dann stimmt das Bit-Timing nichtmehr und es kommt Schrott heraus.
Die Kommunikation werd ich aus dem Grund auch auf Interrupt legen.

Die I2C kannst Du Dir wie ein Schieberegister vorstellen.
Erdorf
Moderator
Avatar
Geschlecht:
Alter: 54
Beiträge: 3267
Dabei seit: 12 / 2009
Betreff:

Re: PowerPredictor

 · 
Gepostet: 23.09.2013 - 15:04 Uhr  ·  #113
Hi Vitis,

Wenn der 'DATA Ready' ein Mechanismus des I2C ist, klingt das gut, das scheint mir aber nicht so zu sein.
'Ich kenne so etwas ähnliches von rs232, dort signalisiert CTS z.B. dem 'Master' dass er senden darf.
CTS ist jedoch fester Bestandteil von rs232.

Wenn Data Ready kein Mechanismus des I2C ist, ist das weniger gut,
weil ein eigentlich vollständiger Bus mit etwas erweitert wird was speziell und
eigentlich auch nicht erforderlich ist. Hört sich an, als ob das dann irgendwann 'Ärger macht' ...

Für den PI ist ein 'DATA Ready' nicht einfacher.
Wenn der PI immer, stur, nach jedem Empfang oder spätestens nach 3 Sekunden,
sofort wieder einen 'Request' schickt, ist das nicht schwer zu programmieren.
Der Controller verzögert ggf. solange bis neue Daten anstehen.
Das braucht dann kein 'DATA Ready' und ist genauso stabil.
So etwas geht quasi immer, mit jedem BUS und Protokoll.

Oder macht die Verzögerung beim Controller Schwierigkeiten?
Der muss doch sowieso warten bis die nächste Sekunde vorbei ist.
Ob er nun dann 'DATA Ready' setzt, wieder auf den Master wartet,
oder besser gleich die Daten auf die Reise schickt, (weil schon ein Request vom Master ansteht)
letzteres ist da besser, wie ich finde, weil flotter mit weniger Verzögerung :-)

Zitat
Die I2C kannst Du Dir wie ein Schieberegister vorstellen.

Ok, wird gemacht :D
Ja, klar, die low level Timings müssen eingehalten werden, sonst kommt 'Fliegendreck' dabei heraus.
Hört sich gut an, auch die Tatsache dass du den Controller mit 'ner' Bautrate passend für den I2C Bus laufen lassen willst.

Gruß Frank
...
 
Avatar
 
Betreff:

Re: PowerPredictor

 · 
Gepostet: 23.09.2013 - 18:56 Uhr  ·  #114
Der I2C hängt von der Geschwindigkeit vom langsamsten Teilnehmer ab, in dem Fall 100kHz Takt, leider, und der Bustakt kommt vom Pi, die Baudrate ist für die USART, da ich dem Controller noch ne RS485-Schnittstelle verpassen will, dann kan man das Modul nämlich auch standalone als Modbus-Slave nutzen ... das ist dann das zweite Protokoll, dass drauf laufen soll.
Damit wär die Geschichte z.B. für die Hausautomatisierung nutzbar, kann dann z.B. an ne SPS angehängt werden.

Beim Leiterplattendesign kostet mich so n Ready-Signal nichts, würde sagen ich designe das mit ein, wenns nicht gebraucht wird kann mans in der Software dann deaktivieren bzw. unbehandelt lassen.
Ich plane ganz gerne Reserven ein, hinterher mit Fädeldraht nacharbeiten ist mühseliger als jetzt in der CAD n Wire einzurouten.

Ein anderer Punkt ist, dass das permanente Pollen auch Prozessorlast bedeutet, das Polling muss ja sowohl vom Pi als auch vom Controller ja verarbeitet werden ... wie schon geschrieben, beim Pi bin ich Neuling, da muss ich mich erst noch einwursteln.
Erdorf
Moderator
Avatar
Geschlecht:
Alter: 54
Beiträge: 3267
Dabei seit: 12 / 2009
Betreff:

Re: PowerPredictor

 · 
Gepostet: 23.09.2013 - 21:11 Uhr  ·  #115
Hallo Vitis,

Zitat
Der I2C hängt von der Geschwindigkeit vom langsamsten Teilnehmer ab, in dem Fall 100kHz Takt

Das wären dann grob 10KB pro Sekunde,
wenn der Controller das Timing für die Messwertaufnahme regelt ist das kein Problem.
Wenn wir so auf 200 Bytes pro Sekunde kommen haben wir gerade mal 2% Buslast.

Zitat
Ein anderer Punkt ist, dass das permanente Pollen auch Prozessorlast bedeutet, das Polling muss ja sowohl vom Pi als auch vom Controller ja verarbeitet werden


Dem PI wird das relativ egal sein, wenn ein C-Programm geschrieben wird.
Der Controller muss jede Sekunde den Request zumindest weg lesen.
Daran ändert ein zusätzliches "DATA ready" Signal leider nichts,
im Gegenteil es macht noch mehr 'Arbeit' zur Laufzeit,
sowohl für Pi, als auch für den Controller.

Der Trick, den ich meine, ist halt, das der Controller auf den erforderlichen 'Poll' nicht sofort antwortet
sondern erst wenn auch neue Daten ermittelt wurden, so gibt dann immerhin der PI nicht das Timing für die Messwerte vor,
was ganz schlecht wäre, weil der PI halt zu unpräzise dafür ist.

Gruß Frank
Uwe Hallenga
SiteAdmin
Avatar
Geschlecht:
Alter: 63
Homepage: kleinwindanlagen.d…
Beiträge: 1602
Dabei seit: 03 / 2005
Betreff:

Re: PowerPredictor

 · 
Gepostet: 24.09.2013 - 04:40 Uhr  ·  #116
Zitat geschrieben von Erdorf

Es geht um möglichst einheitliche und einfach vergleichbare Werte, was also üblich und praktikabel ist

Gruss Frank


Also das Wichtigste ist wirklich der 1Minuten Mittelwert. Das ist der Wert der über kurz oder lang massgeblich die Maßeinheit im Kleinwindanlagenbereich sein wird zur Leistungskennlinienbestimmung und Ertragsberechnung.

Der zweite wichtige Wert wäre der 10Minuten-Mittelwert. Das ist der bisher weltweit gebräuchlichste Wert wenn es um Leistungs- und Ertragsberechnung in der Großanlagentechnik geht.

Alle weiteren Mittelwerte (Stunden, Tage, Wochen..... etc) sind eher uninteressant und dienen dann doch wohl eher der kleinen Spielerei zwischendurch. Richtig anfangen kann man damit eigentlich nicht viel, bis auf die vergleichende Darstellung von vielen Stationen gleichzeitig in einem Graph. Wenn man da ein ganzes Jahr gegenüberstellen will, würde das mit Minutenwerten nur ein buntes Gemische und da wäre dann die wahlweise Darstellung mit anderen Mittelwerten interessant.

Klasse wäre aber tatsächlich ein paralleler Ringspeicher der die Echtzeitwerte für einen begrenzten Zeitraum aufzeichnet (zB. 1 Tag, 14 Tage oder was auch immer möglich ist) um besondere Böenereignisse mit loggen zu können und so zB. Aussagen zur Böenstabilität und Reaktionsgeschwindigkeiten zu treffen.

Die immer wieder gerne geführte Diskussion (und Anfragen hier im Shop) um den Gesamtspeicher wird meiner Meinung nach völlig überbewertet. Ich empfehle grundsätzlich alle Daten möglichst kurzfristig und regelmässig auszulesen und separat abzulegen. Ein Ausfall des Loggers durch was auch immer (Sturm, Blitzschlag, Diebstahl, Vandalismus ......) hätte immer automatisch den Verlust aller nicht extern gespeicherten Daten zur Folge und wenn das Monate wären .... hätten mich Kunden bisher sicherlich einige Male erst geteert, gefedert und anschließend gevierteilt und erschossen. Wenn auf einer SD-Karte 3-6 Monate Daten Platz haben ist alles gut und ausreichend. ggfl. kann ja auch eine größere Karte eingesetzt werden so den der Controller auch größere Speicheradressen jenseits der 2GB adressieren kann.


Was aber für mich und andere sicherlich interessanter ist, wären die jeweiligen Maximal-, Minimalwerte sowie die Standartabweichung (aus der sich dann der Turbulenzanteil bestimmen läßt) aus jedem Mittelwert. Der einzige Logger im Kleinanlagenbereich der das sehr gut löst ist der AeoLog von Inensus.

Soweit aus Bulgarien ;-)

Gruß Uwe


PS. Soll ich mal Datenblätter von verschiedenen Sensoren auch bei Wiki hochladen? oder wie geht das dort mit solchen externen Daten?
...
 
Avatar
 
Betreff:

Re: PowerPredictor

 · 
Gepostet: 24.09.2013 - 15:06 Uhr  ·  #117
@Erdorf

Ein Delay, zeitverzögerte Antwort, ist beim I2C nicht zulässig, weil der Controller nicht aktiv senden kann / darf ... das läuft so ab.

Pi gibt Startsignal, sendet Slaveadresse und Anforderung. Dann sendet Pi Slave-Leseadresse und gibt Takt auf die Clockleitung vom Slave, der dann seine Daten schicken muss, ob er will oder nicht. Praktisch wäre es dann ohne Ready so, dass der Pi alle minimum 500ms pollen müsste, der Controller dann wenn keine neuen Daten vorhanden wären eben mit Null antworten müsste.

Unterschätze die Menge an Daten nicht, ich hab auch nicht schlecht gestaunt, als der Server vom Forum den Schieber dicht gemacht hat bei der Verarbeitung von nem 4MB File, bei dem dann über 100MB RAM angefordert wurden.

@Uwe Hallenga
Dateien sind im Wiki kein Problem, die werden einfach nach Anmeldung über den Menüpunkt Medienmanager hochgeladen und können dann auf ner Seite ganz einfach verlinkt werden, wenn Du magst mach ich das dann mit der Verlinkung, einfach hochladen. Wie, Du weißt das nicht, ist doch Dein Server und somit Dein Wiki ;)

Stellt sich noch die Frage nach der Strommessung für die Leistungsberechnung ... was für ein Messbereich?
5A 25A 50A 100A? bei der 3 kW-Anlage die irgendwann mal geliefert werden soll heists 15A Peak, da würde 25A reichen ... Zu bedenken, es kann nur ein Strang gemessen werden, also bei dreiphasiger Einspeisung nur eine Phase. Alle drei wäre definitiv zu groß für die Platte:

Oder bleibts bei der Zählung vom S0 und Drehzahlmessung am Generator? Ich persönlich hab da etwas Zahnschmerzen 3kW über das Ding zu jagen ... hernach leuchtet der Pi im Dunkeln rötlich.
Erdorf
Moderator
Avatar
Geschlecht:
Alter: 54
Beiträge: 3267
Dabei seit: 12 / 2009
Betreff:

Re: PowerPredictor

 · 
Gepostet: 25.09.2013 - 14:37 Uhr  ·  #118
Hallo Marko,

Zitat
Ein Delay, zeitverzögerte Antwort, ist beim I2C nicht zulässig, weil der Controller nicht aktiv senden kann / darf ... das läuft so ab ...

Ok, ich habe es nun - hoffentlich - verstanden, danke :D
Kurz:
Außer poll geht mit dem I2C nichts. Für den PI kann man so noch sinnvoll machbar auf 100 ms Polling gehen (bei der Datenmenge quasi NULL Last).
Als Grenzwert sind 10 ms .. 30 ms (schwankend, im Mittel) machbar mit ein paar Tricks.
So etwas habe ich schon öfters programmiert.
500 ms oder 300 ms sind kein Thema, alles grün soweit :D.
Ob nun mit 'DATA READY' oder nicht ('DATA READY' kann dann Polls sparen),
macht es Sinn der PI pollt (zyklisch oder häufig) und der Controller liefert, so denn wenn er Daten hat.
Im 'Protokoll' würde ich noch eine 8 Bit Datenstrom ID spendieren, so kann der Controller
neben den Sekunden Messwerten, z.B. auch Debug Ausgaben machen, oder auch mal 10 s Messwerte liefern ...
Die empfangenen Daten kann der PI dann in gesonderte Dateien schreiben.

Zitat
Unterschätze die Menge an Daten nicht ..

Tue ich nicht, man muss hier unterscheiden können:
a) Die Datenrate Bytes pro Sekunde ist vergleichsweise klein.
So etwas schafft der PI locker zu verarbeiten, er muss ja erst mal nur die Daten in Dateien schaufeln,
also nur vorübergehend im RAM halten.
b) Mitteln
Wenn man bei der laufenden Messung Mitteln möchte und Häufigkeitsverteilungen aufnehmen möchte
entstehen etwas mehr Daten, wenn man es geschickt macht, aber auch kaum Erwähnenswertes.
c) Langzeitspeicherung und spätere Analysen auf den Langzeitmessungen
Jetzt wird es kritisch, auch in welcher Form z.B. die Sekunden Daten vorliegen.
Eine riesengroße Datei ist nicht wirklich handhabbar, vor allen Dingen wenn man nur Teile davon braucht.
Eine Datei pro Tag ist dann wieder handhabbar: 86400 Zeilen mit Messwerten, bei z.B. 200 Bytes pro Zeile: ca. 18 MB (unkomprimiert).
Vielleicht auch eine Datei pro Stunde: dann sind es ja nur noch ca. 1MB!
Wie man sieht kommt hier unabhängig von der Organisation im Dateisystem 'nett' was zusammen.
Gerade deswegen macht es Sinn, sich die Ablage im Dateisystem gut zu überlegen und
die Daten soweit wie möglich, schon während der Messwertaufnahme zu analysieren (Mitteln, ...)
und somit eine (reduzierte) Daten Basis für spätere, dann flotte Analysen zu liefern.


Zitat
Stellt sich noch die Frage nach der Strommessung für die Leistungsberechnung ...


Ich hatte für die Strommessung des Akkus, einen Shunt Widerstand verwendet, der 60mV Spannung bei 100A DC lieferte.
Ich denke die Strommessung sollte auf eine Spannungsmessung im mV Bereich reduziert werden.
Über die 'Konfiguration' kann man dann ja vielleicht einen Shunt auswählen oder eine Umrechnung angeben ... und der PI rechnet daraus einen Strom?
Jedenfalls gibt es sowohl DC als auch AC Ströme die interessant sind.
DC +- für den AKKU Strom in und aus dem Akku
AC für den generierten Strom des Windrades.

Und ja, die echten Ströme sollten nicht durch den Controller fließen ...
Wenn man sowohl einen großen Bereich abdecken will, als auch viel Genauigkeit,
wäre ein 12BIT ADU oder besser von Vorteil. Kann man vielleicht einen tollen ADU nehmen und den dann multiplexen?

Jedenfalls ist gleichzeitige und vor allem Echtzeit synchronisierte Leistungsmessung
ein nettes Feature was eigentlich nur mit so einer integrierten Lösung machbar ist.
Aus den Daten kann dann automatisch eine Leistungskennlinie des Windrades ermittelt werden.
Letzteres hilft dann wieder Modifikationen (Wechselrichter Einstellungen ...) besser zu beurteilen,
mehrere Windräder mit einander zu vergleichen
bessere Ertragsprognosen zu erstellen ...

Was hast du vor? Wie viel BIT hat der ADU, wie viele ADUs? Kannst du sinnvoll muliplexen?
Was für eine Spannungs-Range hat so ein ADU? Wie flott misst der ADU?
Wenn der ADU flott ist kann man auch z.B. 4 Messungen machen, zusammenfassen und so, 2 BITs 'relativ ehrlich' dazu 'schummeln'.

Gruß Frank
...
 
Avatar
 
Betreff:

Re: PowerPredictor

 · 
Gepostet: 27.09.2013 - 11:09 Uhr  ·  #119
mit Shunt hab ich so meine Schwierigkeiten wegen der Potentialfreiheit ... würde eher auf Hall-Sensor gehen ...
wenn 20A reichen würden dann ACS712

Man kann nen 16-Bit ADC extern multiplexen, ob das Ergebnis aber besser wird ist so eine Sache.
Der Controller hat 8 10-Bit ADC intern, besser gesagt, einen, der auf 8 EIngänge gemultiplext wird, also 8 Analogeingänge wären problemlos machbar, sind schon vorhanden.
Kann ber noch nen 2-kanaligen 16-Bitter dazuhängen. Meine DEvise, lieber 4 Bit verwerfen als Oversampling und die Kosten sind nur minimal größer. Verarbeiten muss man eh mindestens 2 Bytes.
XXLRay
Moderator
Avatar
Geschlecht: keine Angabe
Herkunft: Süd-Niedersachsen
Homepage: xxlray.bplaced.net
Beiträge: 6836
Dabei seit: 11 / 2007
Betreff:

Re: PowerPredictor

 · 
Gepostet: 27.09.2013 - 11:11 Uhr  ·  #120
Zitat geschrieben von Erdorf

Hi XXLRay,

Zitat
Wenn du einfach mit jedem Logwert die Summe und Anzahl der Messwerte (für Jahr, Monat, Tag, ...) addierst, braucht die eigentliche Mittelwertberechnung auch nicht lange.

Ja, das ist korrekt, so ungefähr, ist ja auch mein Ansatz, die Mittelwerte direkt während dem Loggen zu berechnen.

Das von Uwe skizzierte Problem einer späteren Ertragsprognose auf Basis (arithmetisch) gemittelter Werte bleibt dann immer noch bestehen.


Nicht ganz. Was du planst ist folgendes:

Code
List<Long> dailyValues = new ArrayList()<Long>;
List<Long> weeklyValues = new ArrayList()<Long>;
public void logValue(Long currentValue){
  dailyValues.add(currentValue);
  // calculate weekly average
  if (dailyValues.size() > 7){
    dailyValues.removefirst();
    // sum up values
    Long dailySum = 0;
    Long dailyCounter = 0; // optional - just in case we mess up having only seven entries
    for (Long currentDailyValue : dailyValues){
      dailySum = dailySum + currentDailyValue;
      dailyCounter = dailyCounter + 1;
    }
    if (dailyCounter == 7){
    Long currentWeeklyAverage = dailySum / 7;
    weeklyValues.add(currentWeeklyAverage);
    }else{
      System.out.err(dailyCounter+" are more entries than the expected 7!");
    }
  }
  // calculate anual average
  Long anualSum = 0;
  for (Long currentWeeklyValue : weeklyValues){
    anualSum = anualSum + currentWeeklyValue;
  }
    Long anualAverage = anualSum / 52;
}


Meine Lösung sähe so aus:

Code
List<Long> dailyValues = new ArrayList()<Long>;
List<Long> weeklySums = new ArrayList()<Long>;
List<Long> anualSums = new ArrayList()<Long>;
public void logValue(Long currentValue){
  dailyValues.add(currentValue);
  // calculate weekly average
  Long currentWeeklySum = weeklySums.last() + currentValue - dailyValues.get(dailyValues.size() - 7);
  weeklySums.add(currentWeeklySum);
  Long currentWeeklyValue = currentWeeklySum / 7;
  // calculate anual average
  Long currentAnualSum = anualSums.last() + currentValue - dailyValues.get(dailyValues.size() - 365);
  anualSums.add(currentAnualSum);
  Long currentAnualValue = currentAnualSum / 365;
}
Gewählte Zitate für Mehrfachzitierung:   0