Hallo Zusammen, suche Code in "C" für einen Fehlerzähler/Nivellator. Ich habe nur noch wenig Speicher zur Verfügung, deshalb sollte es was "schlankes" sein... Zum Hintergrund: Es wird zyklisch ein Strom gemessen. Es wird eine Bewertung Strom ok/überstrom (wie 0/1) vorgenommen. Es sollen immer die letzten 30 Messungen betrachtet werden und wenn 20 davon in beliebiger Verteilung "Überstrom" anzeigen, soll eine Fehlermeldung ausgegeben werden. Ich könnte also ein Array damit füllen - verbraucht zuviel Platz. Ich könnte in einer 32-bit-Variable die einzelnen Bits verbiegen - ist mir zu kompliziert mit masking oder shifting. Ich suche eher sowas wie einen Nivellator mit +1/-1, dann die Höhe bewerten und Fehleralarm auslösen. Aber irgendwie komme ich nicht drauf... Grüße von der Pequod!
Gast
#2245098
Jens Berkemeyer schrieb: > Ich könnte in einer 32-bit-Variable die einzelnen Bits verbiegen - ist > mir zu kompliziert mit masking oder shifting. Na ja, in dem Fall kommen dann alle anderen denkbaren Lösungen erst recht nicht für dich in Frage. Oliver
Gast
#2245152
Wenn dir die 32bit-Variable von Hand zu kompliziert ist... gefällt dir nen Bitfeld eventuell besser?
Hi, also, Bits verbiegen oder Bitfeld und dann durchzählen kann ich natürlich machen, aber find ich nicht so schön, deshalb sucht ich ja eher was in Richtung Nivellator. Die Frage ist also: Gibts da überhaupt was, was man in der Richtung machen kann? Ich habe da keine Idee, aber das heisst ja nicht, daß es keine gibt. Wenn ich das per Addition/Suptraktion mache, müsste ich ja wissen, was rausfällt (wenn 0, dann nix / wenn 1, dann -1), aber dann wär ich ja wieder beim array/Bitfeld/Bits... Vielleicht hab ich auch gerad nur nen Knoten im Kopf..;-))
hmmm... du hast dann ja quasi einen ringpuffer mit 30 zeichen. überstrom-ereignis = 1 für die ersten 30 werte müsstest du meiner meinung nach in einer variable für jedes "überstrom ereignis" eine 1 addieren. sobald du da deine schwelle von 20 erreicht hast kannst du deinen alarm auslösen. und ab dem 31.wert für jedes "nicht-überstrom ereignis" 1 abziehen und für jedes überstrom ereignis +1 rechnen
>>Ich könnte in einer 32-bit-Variable die einzelnen Bits verbiegen - ist >> mir zu kompliziert mit masking oder shifting. Nimm doch eine 16-Bit-Variable und zähl in den Einer und Zehnerstellen jeweils den Pegel (+1, +0,+1) und parallel dazu in den Hunderterstellen die aktuelle Iteration.
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
Oder verschwendet das jetzt auch schon zuviel Speicher ;-)?
Das ginge sogar leicht modifiziert mit einer 8 Bit Variablen
Pl Lp schrieb: >>>Ich könnte in einer 32-bit-Variable die einzelnen Bits verbiegen - ist >>> mir zu kompliziert mit masking oder shifting. > > Nimm doch eine 16-Bit-Variable und zähl in den Einer und Zehnerstellen > jeweils den Pegel (+1, +0,+1) und parallel dazu in den Hunderterstellen > die aktuelle Iteration. > >
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
und wie wirst du nach der 31./32./.. Messung das in der Summe enthaltene 1./2./... Messergebnis wieder los? Das ist ja genau der springende Punkt: Iregdnwo muss man sich die letzten 30 Messungen (oder zumindest deren Auswertergebnis) ablegen, damit man aus der Summe die ersten Messungen wieder rausrechnen kann, wenn neue Messergebnisse dazukommen. Das Auswerten von 20 Werten über einem Limit ist nicht das Problem. Das notwendige Speichern der 30 Werte ist sein Problem.
Jens Berkemeyer schrieb: > Ich könnte in einer 32-bit-Variable die einzelnen Bits verbiegen - ist > mir zu kompliziert mit masking oder shifting. Schieben ist doch einfach, das ist ne Grundfunktion jeder CPU. Du kannst daneben noch ne 8Bit-Variable mitführen, die zählt die einkommenden 1-er rauf und Bit30 runter. Und dann nur testen, ob sie >= 20 ist. Peter
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
Peter
Karl Heinz Buchegger schrieb: > und wie wirst du nach der 31./32./.. Messung das in der Summe enthaltene > 1./2./... Messergebnis wieder los? > > Das ist ja genau der springende Punkt: Iregdnwo muss man sich die > letzten 30 Messungen (oder zumindest deren Auswertergebnis) ablegen, > damit man aus der Summe die ersten Messungen wieder rausrechnen kann, > wenn neue Messergebnisse dazukommen. > > Das Auswerten von 20 Werten über einem Limit ist nicht das Problem. Das > notwendige Speichern der 30 Werte ist sein Problem. Stimmt, da hab ich die Problemstellung falsch (mit hartem Cut) verstanden.
Moin, ah, vielen Dank Euch, insbesondere Peter. So wird es wohl funktionieren. Wenn ichs fertig habe, poste ich dann nochmal den Endstand. Ich will dann ja Motoren auf Über-/Unterstrom überwachen. Grüße von der Pequod!
Moin Zusammen, jetzt funktionierts und sieht bei mir so aus: Es wird der erste volle Messblock abgewartet und dann je nach Niveau eine 1 geliefert, wenn das Niveau überschritten ist. Wenn die Funktion 1 liefert, wird ein Fehlereintrag generiert. Die Variablen werden dann halt bei Initialisierung und nach Abschaltung der Pumpen zurückgesetzt. Das Gleiche gibts bei mir dann nochmal für Unterstromüberwachung.
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
14 | |
15 | |
16 | |
17 | |
18 | |
19 | |
20 | |
21 | |
22 | |
23 | |
24 | |
25 | |
26 | |
27 | |
28 | |
29 | |
30 | |
31 | |
32 | |
Grüße von der Pequod! Schlurf-Tock-Schlurf-Tock...
Gast
#2252403
vielleicht so: eine 32bit-Variable also Puffer. Bei Fehler +1 ansosnten nicht, nach jeder Messung wird um eins nach links geschoben. So hast du das Gedächtnis über die letzten 32 Messungen. Die Fehleranzahl liese sich dann über die Bit-Quersumme berechnen. :-)
Antwort schreiben
Bitte melde dich an, um einen Beitrag zu schreiben.