Einlesen von Werten in DB mit überprüfung einer Änderung

Joe.Baer

Level-1
Beiträge
13
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo

habe folgendes Problem:
Lese in einem bestimmten Zeitintervall einen Analogwert ein; wandle ihn in Real und lege ihn in einem DB an die Anfangsadresse ab. Lass den Speicherbereich des DB um 4 hochzählen um einen neuen Analogwert einzulesen usw. Nach 10 Analogwerten soll überprüft werden, ob der Analogwert sich ändert; wenn nicht soll wieder auf die Anfangsadresse des DB eingelesen werden; wenn eine Änderung stattgefunden hat soll der Analogwert weiter ab der 11. Position eingelesen werden.

für eure Hilfe jetzt schon ein Danke!
 
hmmm

das macht irgendwie nicht so richtig sinn. was passiert denn wenn der wert sich ständig ändert. und das wird er sehr wahrscheinlich, und wenn es nur das kleinste bit ist. wird der db dann unendlich lang?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
es handelt sich dabei um die Aufnahme einer Regelstrecke (dynamische Kennlinie), die dann in einem DB abgelegt wird um anschliesend Berechnungen durchführen zu können (Wendepunkt und Zeiten ermitteln). Dabei wird die Regelstrecke mehrmahls durchfahren. Es muss somit automatisch der Start und das Ende (Ausgleich) festgestellt werden.
Da mann ja die Grösse des DB von vorne herein festlegen muss, habe ich ihn auf 12.000 festgelegt.
Joe.Baer
 
1.Möglicherweise könnte es besser sein, die Analogwerte als INT abzulegen. Braucht nur die Hälfte Platz, es geht keine Information verloren und Rechenoperationen zum Feststellen der Änderung gehen schneller.
2. Zum Erkennen der Änderungen kann möglicherweise nicht einfach die Differenz herangezogen werden, da das Signal mit Rauschen behaftet ist.
3. Du kannst mit einem Block von 10 Werten (oder was du willst) folgendes tun:
Summiere alle Werte und teile durch die Anzahl. Errechne also den arithmetischen Mittelwert.
Summiere die Quadrate aller Werte, teile durch die Anzahl und ziehe die Wurzel. Errechne also den geometrischen Mittelwert. Der Quotient aus geometrischem Mittel und arithmetischem Mittel ist statistische ein Maß für die Streuung und physikalisch ein Maß für den Effektivwert des Wechselanteils. Ist er groß genug, enthalten deine Signale signifikannte Änderungen.

4. Du kannst diese Sache immer mit den letzten 10 Werten tun, indem du die Werte zunächst in einen DB der Länge 10 schreibst. Diesen DB kannst du als "FIFO" nutzen, indem du die Werte verschiebst und den neuen immer am Ende reinschiebst.
Wenn du eine Änderung findest, kopierst du den Inhalt des FIFOs in den Speicher-DB und setzt einen Zähler für "neue Werte im FIFO" auf 0. Bei der Suche nach Änderungen benutzt du alle Werte des FIFO. Fidest du aber eine und die Zahl neuer Werte ist kleiner 10, so kopierst du nur soviele Werte, wie der Zähler angibt.

5. Die Rechnung kannst du vereinfachen: Du behälst Summe und Summe der Quadrate in globalen Variablen. Bevor du einen neuen Wert in den FIFO schreibst, ziehst du den erste, der herausfallen wirst von der Summe und sein Quadrat von der Quadratsumme ab. Dafür addierst du den neuen.
 
hallo,
zu 1.:
da bei einer Division mit INT-Werten fehler auftreten wandle ich es sofort um.
Benötige die Werte am Schluss auch als Real, da ich eine Kennlinie darstellen muss. (Visualisiert an einem Touch-Pad)

zu 2.:
stimmt

zu 3.:
mache ich

zu 4.:
komme ich nicht ganz mit
"Bei der Suche nach Änderungen benutzt du alle Werte des FIFO. Fidest du aber eine und die Zahl neuer Werte ist kleiner 10, so kopierst du nur soviele Werte, wie der Zähler angibt. "

zu 5.:
ok
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Joe.Baer schrieb:
zu 4.:
komme ich nicht ganz mit
"Bei der Suche nach Änderungen benutzt du alle Werte des FIFO. Fidest du aber eine und die Zahl neuer Werte ist kleiner 10, so kopierst du nur soviele Werte, wie der Zähler angibt. "
Angenommen, der FIFO enthalte:
1,2,2,2,1,2,2,2,2,8
Der Zähler für neue Werte steht auf 10. Er wird bei jedem Eintrag in den FIFO erhöht, jedoch auf 10 begrenzt. Nach einem Neuanlauf des Programms, kannst du noch einen Merker setzen, sobald der Zähler zum 1.Mal 10 erreicht. Erst dann würdest du mit der Prüfung auf Änderungen beginnen.

Du stellst zum 1. Mal eine Änderung fest und kopierst alles in den Datenspeicher
1,2,2,2,1,2,2,2,2,8
Du setzt den Zähler auf 0.
Nun sei der nächste Meßwert 8. Der FIFO ist jetzt:
2,2,2,1,2,2,2,2,8,8
Der Zähler 1
Da die Suche nach Änderungen alle Elemente des FIFO benutzt, ist es wieder eine Änderung. Du willst aber nur den neuen Wert in den Datenspeicher schreiben, und nicht die 9, die schon drin sind. Du schreibst nur einen, da der Zähler 1 ist.
Datenspeicher:
1,2,2,2,1,2,2,2,2,8.8
und setzt den Zähler auf 0.
Wenn nun jeder weitere Meßwert 8 wäre, erhälst du nach einigen Zyklen:
2,8,8,8,8,8,8,8,8,8,8 im FIFO und
1,2,2,2,1,2,2,2,2,8.8,8,8,8,8,8,8,8,8,8,8,
im Datenspeicher. Das ist das letztemal, daß eine Änderung erkannt wird.
Kommen nun andere Meßwerte, z.B. 4 so wäre daß eine Änderung.
Kommt eine 8, ist keine Änderung da, aber du zählst den Zähler hoch, hast also einen neuen Wert im FIFO.
Kommt nun eine 4 so wäre daß eine Änderung, aber du hast jetzt 2 stat einen neuen Wert im FIFO und kopierst die 8,4 in den Datenspeicher.
Das Endergebnis ist:
1. Wenn die 1. Änderung erkannt wird, wird zusätzlich eine Vorgeschichte mit der Länge des FIFOs-1 gespeichert.
2. Nach der letzten Änderung wirden zusätzlich Nachfolgewerte bis zur Länge des FIFOs-1 gespeichert, da ja die Änderung noch im FIFO ist.
3. Tritt zwischen zwei Änderungen eine Reihe von mehr als (2*FIFO-Länge-1) Werte auf, die keine signifikanten Änderungen enthalten, so werden von ihnen 9 als "Nachgeschichte" der einen und 9 als Vorgeschichte der anderen Änderung gespeichert.

Dies scheint bei der mir "Nachgeschichte" auch sinnvoll, da im Übergang in den stationären Zustand dem Signal sicher noch eine Schwingung überlagert ist, die zwar untehalb der "Signifikanzschwelle" (dem Wert RMS/AVR, ab dem es als "Änderung" gilt) liegt, aber dennoch zeigen kann, daß ein reguläres Einschwingen stattfand. Bei der Vorgeschichte erlaubt es einen Eindruck, wie die Regelqualität vor dem Auftreten der Änderung war.
 
jetzt verstanden;

allerdings funktioniert das mit dem quotienten nicht.
da es sich um temperaturwerte handelt, habe ich als beispiel zehn werte aus der tabelle genommen.

3,4; 3,5; 3,6; 3,6; 3,7; 3,8; 4,0; 4,1; 4,1; 4,2

der arithmetische mittelwert ist 3,8
der geometrische mittelwert ist 3,8

der quotient ist über die gesamte Kennlinie = 1 - obwohl ich eine änderung habe.

zum ausprobieren habe ich die kennlinie in excel eingelesen.
 
Joe.Baer schrieb:
allerdings funktioniert das mit dem quotienten nicht.
da es sich um temperaturwerte handelt, habe ich als beispiel zehn werte aus der tabelle genommen.

3,4; 3,5; 3,6; 3,6; 3,7; 3,8; 4,0; 4,1; 4,1; 4,2
Ähh..sorry... du mußt zunächst den arithmetischen Mittelwert ermitteln und von allen Abziehen und die Quadrate der Differenzen, nicht die der Werte, benutzen.
Diese summieren, durch die Anzahl teilen, Wurzel ziehen, Ergebnis durch den arithmetischen Mittelwert teilen.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Na, jetzt hattest du mich durcheinandergebracht. Du hattest dich erstmal verrechnet oder zuwenig Nachkommastellen angegeben:
Joe.Baer schrieb:
allerdings funktioniert das mit dem quotienten nicht.
da es sich um temperaturwerte handelt, habe ich als beispiel zehn werte aus der tabelle genommen.

3,4; 3,5; 3,6; 3,6; 3,7; 3,8; 4,0; 4,1; 4,1; 4,2


3,4; 3,5; 3,6; 3,6; 3,7; 3,8; 4,0; 4,1; 4,1; 4,2

der arithmetische mittelwert ist 3,8
der geometrische mittelwert ist 3,8
Nein:

11,56
12,25
12,96
12,96
13,69
14,44
16,00
16,81
16,81
17,64
=====
145,12

Wurzel(14,512/10) =3,80946

Ein paar mehr Beispiele:

Eine kleine Abweichung nach oben:
3,8; 3,8; 3,8; 3,8; 3,8; 3,8; 4,0; 3,8; 3,8; 3,8
AVR: 3,82
GEO: 3,82047
Quotient:1,000123

Eine kleine Abweichung nach unten:
3,8; 3,8; 3,8; 3,8; 3,8; 3,8; 3,6; 3,8; 3,8; 3,8
AVR: 3,78
GEO: 3,780476
Quotient:1,000126
Der hat dieselbe Größenordnung

Kleine Abweichungen nach oben und unten:
3,8; 3,8; 3,8; 3,6; 3,8; 3,8; 4,0; 3,8; 3,8; 3,8
AVR: 3,80
GEO: 3,801052
Quotient:1,000276

Eine größere Abweichung nach oben:
3,8; 3,8; 3,8; 3,8; 3,8; 3,8; 4,2; 3,8; 3,8; 3,8
AVR: 3,84
GEO: 3,84187
Quotient:1,000488

Es funktioniert also auch mit meinem ursprünglichen Vorschlag.
 
Zurück
Oben