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.
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.
>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
structBitchen{
3
ucharB1:1;
4
ucharB2:1;
5
...
6
ucharB8:1;
7
};
8
9
union{
10
Bitchenbits;
11
ucharall;
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.
>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/
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
>structBitchen{
3
>ucharB1:1;
4
>ucharB2:1;
5
>...
6
>ucharB8:1;
7
>};
8
>
9
>union{
10
>Bitchenbits;
11
>ucharall;
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 ;)