Wenn dein Problem oder deine Frage geklärt worden ist, markiere den Beitrag als "Lösung",
indem du auf den "Lösung" Button rechts unter dem entsprechenden Beitrag klickst. Vielen Dank!
ich habe ein Problem bei der Filterung eine Kuka-Roboter augegebene Daten.
Es sind Positionsdaten in eine 12 Byte Format.
- Byte 0: Bit 0-7 = Bit 0-7 der Position X Axe
- Byte 1: Bit 0-6 = Bit 8-14 der Position X Axe
Bit 7 = Vorzeichen (0 = Positiv, 1 = Negativ)
- Byte 2: Bit 0-7 = Bit 0-7 der Position Y Axe
- Byte 3: Bit 0-6 = Bit 8-14 der Position Y Axe
Bit 7 = Vorzeichen (0 = Positiv, 1 = Negativ)
- Byte 4: Bit 0-7 = Bit 0-7 der Position Z Axe
- Byte 5: Bit 0-6 = Bit 8-14 der Position Z Axe
Bit 7 = Vorzeichen (0 = Positiv, 1 = Negativ)
- Byte 6: Bit 0-7 = Bit 0-7 des Winkels A
- Byte 7: Bit 0-6 = Bit 8-14 des Winkels A Axe
Bit 7 = Vorzeichen (0 = Positiv, 1 = Negativ)
- Byte 8: Bit 0-7 = Bit 0-7 des Winkels B
- Byte 9: Bit 0-6 = Bit 8-14 des Winkels B Axe
Bit 7 = Vorzeichen (0 = Positiv, 1 = Negativ)
- Byte 10: Bit 0-7 = Bit 0-7 des Winkels C
- Byte 11: Bit 0-6 = Bit 8-14 des Winkels C Axe
Bit 7 = Vorzeichen (0 = Positiv, 1 = Negativ)
Wie ihr sehen könnt, liegt das Problem an der Vorzeichen bei z.B Byte 1, ich bekomme die Daten je nachdem wie ich es Anzeigen möchte in Hex, Binär oder Dez-Format, das Problem ist, wie ich dieser Vorzeichen ausfiltern kann, da das Byte nur als Zahlen darsteht und das Vorzeichen schon mit im Zahl steht. Kann ich das Byte in einzelne Bit splittern? Wenn ja könnt Ihr mir vielleicht ein Beispiel machen?
Vielen Dank
Anzeige
30.11.2008, 23:43 (Dieser Beitrag wurde zuletzt bearbeitet: 18.06.2009 14:34 von eg.)
' schrieb:ich habe ein Problem bei der Filterung eine Kuka-Roboter augegebene Daten.
Es sind Positionsdaten in eine 12 Byte Format.
- Byte 0: Bit 0-7 = Bit 0-7 der Position X Axe
- Byte 1: Bit 0-6 = Bit 8-14 der Position X Axe
Bit 7 = Vorzeichen (0 = Positiv, 1 = Negativ)
Das ist ein ganz einfaches Problem, die nötigen Hilfsfunktionen finden sich in der Palette Numerisch/Datenbearbeitung.
In der gesamten Rechentechnik wird eine negative Zahl als "Zweierkomplement" dargestellt, und dann gilt auch, daß eine "1" als MSB eine negative Zahl repräsentiert. In der 16-Bit-Darstellung sieht das dann so aus:
Folgt man aber Deinen Ausführungen, dann könnte man eher meinen, daß das MSB das Vorzeichen, die anderen bits den Betrag bilden. Die Zahl -1 wäre dann 10000000 0000001. Die Null gäbe es dann gleich zwei mal, entweder als 000000 000000 oder als 10000000 00000000, was völlig unsinnig wäre und was kein Mensch macht.
Weitere Frage: Die genannten Bytes von 0..11, sind das einzelne U8-Zahlen, oder liegen diese Bytes als 1 ASCII-String (Hex-Darstellung) vor? Oder bilden diese Zahlen ein Array mit 12 Elementen?
Für den Fall, daß ein Array vorliegt und negative Zahlen als Zweierkomplement dargestellt werden, dieses Beispiel:
eg <-- Ja ich bin mir nicht sicher ob bei den einen oder anderen Foren meine Fragen beantworten kann, deswegen den Crosspost, danke für den Hinweis.
Lucki<-- Danke für die Erklärungen, also Byte 0 und Byte 1 wird zusammen für die Darstellung der X-Achse benötigt, ich habe bei mir die 8 Bit Darstellung benutzt.
z.B. 11111111 11111111 - das Fette Bit soll das Vorzeichen sein, die restlichen Bits müssen danach zusammengefügt werden, da es die X-Achse darstellt.
Das ist ein Array aus 12 Elemente. Auf jeden Fall ist es kein String, ansonsten wäre es schon einfacher. Hier füge mal das Bild damit du eine bessere Vorstellung davon hast, manchmal fällt es mir schwer mit Worten zu erkären. Ich versuche mal deine Methode morgen in der Firma, hoffe es klappt.
' schrieb:eg <-- Ja ich bin mir nicht sicher ob bei den einen oder anderen Foren meine Fragen beantworten kann, deswegen den Crosspost, danke für den Hinweis.
Es ist auf keinen Fall verboten in mehreren Foren zu fragen. Man muss nur Bescheid geben, denn es kann ja passieren dass mehrere Leute sich mühe machen deine Frage zu beantworten und dir die gleiche Antwort geben. Es ist einfach nicht fair im Bezug auf die antwortende Leute. Aber klar, dir würde es nur Vorteile bringen
' schrieb:Für den Fall, daß ein Array vorliegt und negative Zahlen als Zweierkomplement dargestellt werden, dieses Beispiel:
Ich glaube, da gehört vor das Ausgabeelement noch die Funktion "8 bit tauschen" rein. Kann es sein, dass der Typkonvertierer intern aus der Low-High-Reihenfolge (intel; siehe Beschreibung und Eingangselement) eine High-Low-Reihenfolge macht (motorola, siehe Ausgangselement)?
Jeder, der zur wahren Erkenntnis hindurchdringen will, muss den Berg Schwierigkeit alleine erklimmen (Helen Keller).
02.12.2008, 08:38 (Dieser Beitrag wurde zuletzt bearbeitet: 02.12.2008 08:39 von Lucki.)
' schrieb:Ich glaube, da gehört vor das Ausgabeelement noch die Funktion "8 bit tauschen" rein. Kann es sein, dass der Typkonvertierer intern aus der Low-High-Reihenfolge (intel; siehe Beschreibung und Eingangselement) eine High-Low-Reihenfolge macht (motorola, siehe Ausgangselement)?
Die Reihenfolge bei der Typkonvertierung ist High-Low (Motorola), das stimmt. Daß man die 8 bit noch tauschen muß, damit hast Du auch recht, aber wissen konnte ich das nicht, das wurde erst klar nach dem Beitrag #4. Man sieht dort am fettgedruckten Vorzeichenbit, daß die Byte-Reihenfolge LSB- MSB ist.
Die richtige Konvertierung sähe also jetzt so aus:
Ich habe es Heute in der Firma versuch, es funktioniert nur fast, also bei allen positive Werten kommt es zur richtigen ergebnis, nur bei negativen konnte es nicht unterscheiden, hier nochmal die Anzeige.
Bei normale Rechnung habe ich das Byte 1 mit 256 multipliziert dann mit Byte 0 addiert.
( 5 x 256 ) + 150(96Hex) = 1430 <--- Das funktioniert nur wenn der Wert positiv ist
Bei neg. Wert z.B. Byte 1 =74H und Byte 2=84H in Binär 1110100 und 10000100 , da ist der Fette Wert ein Minus, somit ist das Byte 2 gleich 4H und nicht 84H. Ich habe es in das Programm von Kuka gesehen wie die Positionswerte sein soll, hab vergessen ein Screenshot davon zu machen. Werde morgen eins machen. Wie kann die da das Programm unterscheiden lassen, es geht doch nur wenn ich das 1Bit rausfiltere und eine Abfrage mache wann das 1Bit 1 ist muss dann das Byte mit 128 bzw. 1000 0000 dazu addieren. Ist es so richtig?
03.12.2008, 08:45 (Dieser Beitrag wurde zuletzt bearbeitet: 03.12.2008 09:02 von Lucki.)
' schrieb:Ich habe es Heute in der Firma versuch, es funktioniert nur fast, also bei allen positive Werten kommt es zur richtigen ergebnis, nur bei negativen konnte es nicht unterscheiden, hier nochmal die Anzeige.
Bei normale Rechnung habe ich das Byte 1 mit 256 multipliziert dann mit Byte 0 addiert.
( 5 x 256 ) + 150(96Hex) = 1430 <--- Das funktioniert nur wenn der Wert positiv ist
Bei neg. Wert z.B. Byte 1 =74H und Byte 2=84H in Binär 1110100 und 10000100 , da ist der Fette Wert ein Minus, somit ist das Byte 2 gleich 4H und nicht 84H. Ich habe es in das Programm von Kuka gesehen wie die Positionswerte sein soll, hab vergessen ein Screenshot davon zu machen. Werde morgen eins machen. Wie kann die da das Programm unterscheiden lassen, es geht doch nur wenn ich das 1Bit rausfiltere und eine Abfrage mache wann das 1Bit 1 ist muss dann das Byte mit 128 bzw. 1000 0000 dazu addieren. Ist es so richtig?
Die ganze Sache könnte ganz leicht beendet werden, wenn Du für einen einzigen negativen Wert mal zu den beiden Bytes den richtigen zugehörigen negativen Wert nennen würdest. Du machst zwar oben ein paar Zahlenspielereien, aber dieses einzig Wichtige fehlt. z.B . 255H 255H ist das nun -1 oder nicht?
Dein Programm funktioniert so nicht, das U16-Wort muß zu Integer konvertiert werden. Das machst Du zwar, wenn Du aber dann eine U16 Anzeige anschließt, wird das gleich wieder rückgängig gemacht, wie man auch an dem Konvertierungspunkt sehen kann.
Weiterhin ist zu beachten, daß negative Zahlen nur mit Radix Dezimal angezeigt werden. Bei den anderen Anzeige-Modi (HEx, Binär, Oktal) wird immer das positive Zahlenwort genommen.
Sind das hier die richtigen Werte oder nicht? Wenn nicht, dann nenne einfach ohne Textzutat die 3 richtigen Zahlen für die negativen Werte und Du bekommst innerhalb einer µsec das richtige Konvertierungsprogramm frei Haus.
Hier habe ich 2 Beispiele als Bild eingefügt, ich habe bei den einen Beispiel auf I16 umgestellt, es zeigt zwar was in Minus an, aber nicht der richtige Wert. Also es funktioniert erst wenn die Werte im pos. Bereich liegen. Die beiden Bilder habe ich noch ein Screenshot von den echten Werten aus Kuka. Ich hoffe es wird nicht all zu kompliziert sein. Vielen Dank für die Hilfe.