Hallo, ich habe hier ein kleines Problem, bei dem ich noch nicht so recht weis wie ich es am besten angehen soll um es sicher zu kriegen. Ich habe mehrere Sensoren, und versuche aus den Informationen die diese liefern eindeutige Bereiche zu definieren. Mein Programmkonstrukt sieht ungefähr so aus, nur jetzt mehrmals hintereinander, wobei sich Bit1 natürlich dementsprechend in Bit2 Bit3 usw. ändert. if ( (Bedingung1 == True) && (Bedingung2 == True) && if (Bedingung3 == True) && (Bedingung4 == True) && if (Bedingung5 == True) && (Bedingung6 == True) ) Bit1=TRUE; Es darf natürlich immer nur 1 Bit (1 Bereich) tatsächlich true sein, damit das ganze Konstrukt eindeutig ist. Ich möchte also eine Überwachung mit rein bauen, daß tatsächlich nur immer eines true ist. Wenn keines True ist habe ich einen Zustand vergessen (Fehler) und wenn mehr als eines True ist habe ich zweideutigkeiten (Fehler). Mein Gedankenproblem ist nun das, daß bei einem Wechsel von einem Bereich in den anderen das eine zurückgesetzt werden muß und das andere gesetzt werden muß, so daß es niemals möglich ist, daß zwei Bits (Bitarray) gesetzt sind. Wie würdet Ihr das machen ? Vielen Dank für ein paar Denkanstöße
Hallo, Welche Sprache soll das sein? Ich verstehe Dein Problem nicht, mach doch bitte eine Logiktabelle, dann sieht man schneller was voneinander abhängt. ok ?
Du drückst Dich bedauerlicherweise ein wenig unglücklich aus. Dazu noch
Deinen ganzen Beitrag hindurch, dass kein unpassender Ausdruck durch
einen anderen passenden so ergänzt wird das es zusammen ein Ganzes
ergibt.
Ich werde der Reihe nach durch Dein Post gehen und an einer gewissen
Stelle abbrechen, damit Du dort meine Annahmen bestätigen oder ihnen
widersprechen und Informationen nachreichen kannst.
>Ich habe mehrere Sensoren, und versuche aus den Informationen die diese >liefern
eindeutige Bereiche zu definieren.
So die Sensoren nicht Informationen über Bereiche (welcher Art auch
immer) liefern; das wäre extrem ungewöhnlich. Man definiert auch nicht
aus etwas.
Sensoren liefern Werte. Diese können, diskrete oder kontinuierliche,
numerische oder nicht-numerische Werte sein. Werte für die sich ein
Maximum und ein Minimum angeben lässt oder auch nicht.
Wenn ich versuche Dich zu verstehen, dann lautet Dein Satz eigentlich
so:
"Ich habe mehrer Sensoren, die numerische Werte liefern. Ich möchte
Bedingungen formulieren, die sich auf Bereiche dieser Werte beziehen".
Ist das so korrekt?
Wenn das so ist, dann versuche doch mal ausgehend von diesem Punkt und
mit der Terminologie Deine Frage neu zu formulieren.
Ein Hinweis noch: Die Frage nach der Programmiersprache hört sich
vieilleicht etwas polemisch an, aber zumindest ist das kein "C", was Du
da geschrieben hast.
Vielleicht wäre es auch gut etwas über Deine Vorkenntnisse zu wissen.
Paulchen Panther schrieb: > Mein Programmkonstrukt sieht ungefähr so aus, Dann zeig doch einfach mal dein )ganzes) Programm und nicht irgedwelche willkürlichen Fragemente. Denn oft liegt der Fehler ganz wo anders, als der vermutet, der ihn gemacht hat... > nur jetzt mehrmals hintereinander, wobei sich Bit1 natürlich > dementsprechend in Bit2 Bit3 usw. ändert. Und das hört sich wie eine längere Version des Wortes "umständlich" an...
Also, ich fabuliere jetzt einfach mal ins Blaue: Du hast einen Sensor, der numerische Werte liefert. Sagen wir im Intervall [0, 100]. Du hast mehrere Teilintervalle dieses ersten Intervalls, die ich mit Buchstaben kennzeichne. a: [0, 10] b: [11, 50] c: [51, 100] Du willst ein Programm, eine Funktion, einen Ausdruck, der/die/das in einer Variable geeigneter Grösse je ein Bit, das einem der genannten Bereiche entspricht setzt. Besonderen Wert legst Du darauf, das sichergestellt ist, das nie mehrere Bits gleichzeitig gesetzt sind, weil das ja bedeuten würde das ein Wert gleichzeitig in mehreren Bereichen ist.
1 | uint8_t x = HoleSensorWert (); |
2 | uint8_t Bereichsbits = 0; |
3 | |
4 | if (x < 11) |
5 | Bereichsbits = 1; |
6 | else if (x < 51) |
7 | Bereichsbits = 2; |
8 | else if (x < 101) |
9 | Bereichsbits = 4; |
10 | else
|
11 | FehlerBehandlung (); |
Was hälst Du davon?
Ja, so ist das gedacht. Ist dann wohl doch verständlich gewesen :) Die Fehlerbehandlung lagere ich in eine Funktion aus. Diese Funktion macht nach Abarbeitung der ganzen if-Konstrukte folgendes: Sie hüpft einmal durch das ganze Bit-Array (welche ja die Zustände signalisieren) und gibt einen Fehler aus, wenn entweder mehr als ein Element eine 1 führt oder kein Element eine 1 führt (Zustand wurde vergessen). So weit so schlecht. Das setzen der Bits (welches eindeutig sein muß) ist aber noch ein kleines Problem. In einer SPS wäre das einfacher zu bewerkstelligen. Dort habe ich ja den Zuweisungsoperator "=". In C jedoch weise ich einer Bitvariablen entweder ein TRUE oder ein FALSE zu und setze somit die Variable. Deshalb muß ich sie irgendwann auch mal wieder rücksetzen. Ich frage mich gerade wie ich das wohl am schoensten mache. Angenommen das erste If-Konstrukt lieferte eine 1 (Ich befinde mich also innerhalb bestimmter Grenzen), dann setze ich das entsprechende Bit im Bit-Array. Anschließend läuft der Rest der If-Konstrukte durch, welche (im Idealfall) feststellen, daß deren Bereiche nicht tangiert werden. Deshalb schreiben sie auch nichts in das Bitarray. Zum Schluß prüft eine Schleife ob tatsächlich nur ein Zustand aktiv ist. Wenn aber jetzt das erste If-Konstrukt NICHT MEHR erfüllt ist, sondern das zweite, dann muß ich eben erst das Bit der ersten Bereichsüberwachung zurücksetzen bevor ich das Bit für das zweite Konstrukt wieder setze. Irgendwie fällt mir nichts gutes ein, wie ich das "schön" machen könnte.
Wenn du bei einer 8Bit-Variable (entspricht logischerweise 8 Bereichen) die Bits so setzt:
1 | Bereichsbits = 1<<0; |
2 | Bereichsbits = 1<<1; |
3 | Bereichsbits = 1<<2; |
4 | Bereichsbits = 1<<3; |
5 | Bereichsbits = 1<<4; |
6 | Bereichsbits = 1<<5; |
7 | Bereichsbits = 1<<6; |
8 | Bereichsbits = 1<<7; |
werden die anderen Bits gelöscht. (Du kannst wenn du das willst auch 1<<5 selbst Auflösen in 32 oder 0x20 usw.)
>Ist dann wohl doch verständlich gewesen :)
Ich habe keine Ahnung wie Du darauf kommst. Ich schrieb ja, das ich ins
Blaue rate und nicht, das ich Dich wie beschrieben verstanden hätte.
Was es da zu grinsen gibt, weiss ich auch nicht.
Ich fühle mich eher verarscht muss ich sagen. Da mache ich mir die Mühe,
(was ich eigentlich sehr, sehr, sehr selten mache) und rate und meine
Fähigkeit richtig zu raten hälst DU für Deine Fähigkeit dich korrekt
auszudrücken. Ein Irrtum.
Na dann viel Erfolg.
Und die Frage, um welche Programmiersprache es sich bei dem ursprünglichen Codeschnippsel handeln soll, wurde auch noch nicht beantwortet. Es handelt sich auf jeden Fall nicht um C.
Noname schrieb: >>Ist dann wohl doch verständlich gewesen :) > Ich habe keine Ahnung wie Du darauf kommst. Ich schrieb ja, das ich ins > Blaue rate und nicht, das ich Dich wie beschrieben verstanden hätte. > Was es da zu grinsen gibt, weiss ich auch nicht. > > Ich fühle mich eher verarscht muss ich sagen. Da mache ich mir die Mühe, > (was ich eigentlich sehr, sehr, sehr selten mache) und rate und meine > Fähigkeit richtig zu raten hälst DU für Deine Fähigkeit dich korrekt > auszudrücken. Ein Irrtum. > > Na dann viel Erfolg. Wenn man deswegen :) so beileidigt sein muß wie du, dann bitteschön. Ich habe das jedenfalls nicht böse gemeint. Du wirst im Leben noch oft beleidigt sein müssen wenn schon zwei ASCII-Charakter dazu ausreichen.
Benjamin F. schrieb: > Wenn du bei einer 8Bit-Variable (entspricht logischerweise 8 Bereichen) > die Bits so setzt: > Bereichsbits = 1<<0; > Bereichsbits = 1<<1; > Bereichsbits = 1<<2; > Bereichsbits = 1<<3; warum nicht
1 | #tpedef
|
2 | struct Bitchen { |
3 | uchar B1 : 1; |
4 | uchar B2 : 1; |
5 | ...
|
6 | uchar B8 : 1; |
7 | };
|
8 | |
9 | union { |
10 | Bitchen bits; |
11 | uchar all; |
12 | } bitvar; |
13 | |
14 | bitvar.B1 = Sensor1; |
15 | bitvar.B2 = Sensor2; |
16 | ...
|
17 | if (bitvar.all == 0) |
18 | ...
|
habe jetzt keinen compiler laufen lassen. Aber so ungefähr sollte es gehen.
In einer Union haben ja alle Elemente den gleichen Offset (wie übereinandergelegte Folienstreifen die am linken Ende (oder Rechten) je nach Ansicht bündig sind) Du legst sozusagen also eine 8-bit lange Variable über 8 Einzelne Bits und fragst dann ob diese Variable was "überall Nullen sieht" Habe ich das so richtig verstanden ?
>Wenn man deswegen :) so beileidigt sein muß wie du, dann bitteschön. Ich >habe das jedenfalls nicht böse gemeint. Ich habe nicht gesagt, das ich mich "beleidigt" sondern "verarscht" fühle. Dazwischen kennst Du keinen Unterschied? Das ist der Punkt. Du setzt die Worte ohne Besinnung und Verständnis und interpretierst sie genauso. Mir ist absolut schleierhaft wie Du ohne Konvention über die Bedeutung resp. Interpretation von Worten überhaupt sinnvoll programmieren, geschweige denn mit Deinen Mitmenschen kommunizieren willst.
Andreas Schweigstill schrieb: > Und die Frage, um welche Programmiersprache es sich bei dem > ursprünglichen Codeschnippsel handeln soll, wurde auch noch nicht > beantwortet. Es handelt sich auf jeden Fall nicht um C. Doch es handelt sich um C. Sollte diese Aussage jetzt für weitere Spitzfindigkeiten deinerseits taugen, wie bei "NoName" dann bitte ich einfach mal davon Abstand zu nehmen. Das hilft nämlich keinem weiter. Andere sehen anscheinend daß es sich um darum handelt. Ich habe nämlich hier kein Problem mit C, sondern bin auf der Suche nach einer Idee, oder einem Algorithmus wenn du so willst.
Noname schrieb: > Ich habe nicht gesagt, das ich mich "beleidigt" sondern "verarscht" > fühle. > Dazwischen kennst Du keinen Unterschied? > > Das ist der Punkt. Du setzt die Worte ohne Besinnung und Verständnis und > interpretierst sie genauso. > > Mir ist absolut schleierhaft wie Du ohne Konvention über die Bedeutung > resp. Interpretation von Worten überhaupt sinnvoll programmieren, > geschweige denn mit Deinen Mitmenschen kommunizieren willst. Also nochmal: Ich habe die Frage nicht gestellt um mit notorisch beleidigten Menschen eine Diskussion über die Interpretation von ASCII-Charaktern zu beginnen. Sei einfach beleidigt und kümmere dich nicht weiter um die Frage oder höre auf in Foren zu lesen wenn dich ein :) schon aus der Fassung bringt.
Paulchen Panther schrieb: > Habe ich das so richtig verstanden ? jau, der Debugger ist dein Freund und wird dir helfen.
>Ich habe die Frage nicht gestellt um mit notorisch beleidigten Menschen >eine Diskussion über die Interpretation von ASCII-Charaktern zu >beginnen. Sei einfach beleidigt und kümmere dich nicht weiter um die >Frage oder höre auf in Foren zu lesen wenn dich ein :) schon aus der >Fassung bringt. Ich glaub wir lassen das wirklich. Also viel Glück noch. Du wirst es brauchen.
Noname schrieb: > Ich habe nicht gesagt, das ich mich "beleidigt" sondern "verarscht" > fühle. > Dazwischen kennst Du keinen Unterschied? > ... Schau mal dort vorbei, dort zeigt man Verständnis. ;-)
Freund von Freud schrieb: > Noname schrieb: >> Ich habe nicht gesagt, das ich mich "beleidigt" sondern "verarscht" >> fühle. >> Dazwischen kennst Du keinen Unterschied? >> ... > > Schau mal dort vorbei, dort zeigt man Verständnis. ;-) > > > > Beitrag melden | Bearbeiten | Löschen | Mist. link vergessen: http://www.psychologieforum.de/
if( (gefuehl >= 0-verarscht) && (gefuehl <= 0+beleidigt) ) Dazwischen = TRUE; else Dazwischen = FALSE; Hört halt jetzt endlich auf hier weiterzulesen und dich künstlich aufzuregen.
Paulchen Panther schrieb: > Hört halt jetzt endlich auf hier weiterzulesen und dich künstlich > aufzuregen. Der einzige der sich hier künstlich Aufregt bist du, und zwar über ein einziges Wort von Noname. Bei dieser Gelegenheit muss ich Noname gleich mal meine Bewunderung zusprechen da er es geschafft hat den 1. Beitrag anscheinend richtig zu deuten. Ich selbst lag ganz falsch und ich denke vielen Mitlesern ging es ähnlich.
Referenz schrieb: > Benjamin F. schrieb: >> Wenn du bei einer 8Bit-Variable (entspricht logischerweise 8 Bereichen) >> die Bits so setzt: >> Bereichsbits = 1<<0; >> Bereichsbits = 1<<1; >> Bereichsbits = 1<<2; >> Bereichsbits = 1<<3; > > warum nicht >
1 | > #tpedef |
2 | > struct Bitchen { |
3 | > uchar B1 : 1; |
4 | > uchar B2 : 1; |
5 | > ... |
6 | > uchar B8 : 1; |
7 | > }; |
8 | >
|
9 | > union { |
10 | > Bitchen bits; |
11 | > uchar all; |
12 | > } bitvar; |
13 | >
|
14 | > bitvar.B1 = Sensor1; |
15 | > bitvar.B2 = Sensor2; |
16 | > ... |
17 | > if (bitvar.all == 0) |
18 | > ... |
19 | >
|
> habe jetzt keinen compiler laufen lassen. Aber so ungefähr sollte es > gehen. Ich selbst nehme dann doch eher Makros für sowas wie z.B.
1 | |
2 | SET_BIT(Bereichsbits, BIT1); |
3 | CLR_BIT(Bereichsbits, BIT2); |
4 | CLR_ALL(Bereichsbits); |
die dann im ganzen Projekt über nen Standard-Header sowieso mitgeladen werden. Jedes mal ne union zu definieren wenn man mal n Bitfeld hat wäre mir zu aufwendig, is aber eher eine Frage persönlicher Vorlieben ;)
Wie laufen diese Anwseiungen bei Deinem Konstrukt: > bitvar.B1 = Sensor1; > bitvar.B2 = Sensor2; > ... > if (bitvar.all == 0) > ...
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.