poppycock
Level-1
- Beiträge
- 253
- Reaktionspunkte
- 21
-> Hier kostenlos registrieren
Hallo,
ich habe in VB.net eine kleine Anwendung geschrieben, mit der ich einzelne Datenbereiche aus der S7-300 via MPI-RS232-Adapter auslesen kann.
Damit ich sehe, was auf der RS232-Leitung passiert, zeichnet ein Serial-Monitor die Daten auf.
Nun habe ich ein Problem mit der Interpretation der Daten, jedenfalls weiß ich nicht, wann ich Bytes drehen muss und wann nicht.
Ich lese später nur die Bytes ein, die ich dann ein wenig umher schieben muss! Das Zielsystem arbeitet mit little endian.
Dazu zwei Beispiele (die relevanten "Datenbytes" sind fett markiert):
Ich lese das EW0 aus:
... 0xFF 0x04 0x00 0x10 0x10 0x01 0x80 0x10 0x03 ...
Folgende Eingänge sind aktiv: E0.0 und E1.7
Macht in Dual: 00000001 10000000 = 1 und 128 in Dezimal.
Die Bytes werden getauscht und zu einem 16bit-Wert zusammengefasst:
10000000 00000001 = 32769 in Dezimal
Hier muss getauscht werden!
Nun lese ich ein INT aus:
... 0xFF 0x04 0x00 0x10 0x10 0x7F 0xFF 0x10 0x03 ...
Als Dezimalwert erwarte ich 32767.
Macht in Dual: 01111111 11111111 = 127 und 255 in Dezimal.
Die Bytes werden getauscht und zu einem 16bit-Wert zusammengefasst:
11111111 01111111 = 65407 in Dezimal
Das passt nicht, da 65407 ungleich 32767 ist!
Drehe ich nicht:
01111111 11111111 = 32767 in Dezimal
Hier darf nicht getauscht werden!
Wenn ich mir das INT in dualer Schreibweise angucke, sieht man auf dem ersten Blick, dass man nicht drehen darf, da ich eine positive Zahl erwarte und das höchstwertigste Bit 0 sein muss.
Zu guter Letzt habe ich einen Zähler erstellt, der in einen DB den Zählerstand schreibt.
Als Datentyp im DB habe ich WORD genommen und mir mal in der Online-Beobachtung die Änderung des Wertes im DB angeguckt.
Was aufgefallen ist, ist, dass das zweite Datenbyte zuerst hochgezählt wird, danach das erste Datenbyte.
Also:
Zählerstand 255 = 0x00 0xFF = 00000000 11111111
Zählerstand 256 = 0x01 0x00 = 00000001 00000000
Hier darf auch nicht getauscht werden!
So, warum muss man nun beim Eingangswort die Bytes tauschen und z.B. bei einem Zählwert (als WORD) nicht?
Und allgemein: Wie erkennt man, ob man die "Datenbytes" drehen muss oder nicht?
Gruß,
poppycock
ich habe in VB.net eine kleine Anwendung geschrieben, mit der ich einzelne Datenbereiche aus der S7-300 via MPI-RS232-Adapter auslesen kann.
Damit ich sehe, was auf der RS232-Leitung passiert, zeichnet ein Serial-Monitor die Daten auf.
Nun habe ich ein Problem mit der Interpretation der Daten, jedenfalls weiß ich nicht, wann ich Bytes drehen muss und wann nicht.
Ich lese später nur die Bytes ein, die ich dann ein wenig umher schieben muss! Das Zielsystem arbeitet mit little endian.
Dazu zwei Beispiele (die relevanten "Datenbytes" sind fett markiert):
Ich lese das EW0 aus:
... 0xFF 0x04 0x00 0x10 0x10 0x01 0x80 0x10 0x03 ...
Folgende Eingänge sind aktiv: E0.0 und E1.7
Macht in Dual: 00000001 10000000 = 1 und 128 in Dezimal.
Die Bytes werden getauscht und zu einem 16bit-Wert zusammengefasst:
10000000 00000001 = 32769 in Dezimal
Hier muss getauscht werden!
Nun lese ich ein INT aus:
... 0xFF 0x04 0x00 0x10 0x10 0x7F 0xFF 0x10 0x03 ...
Als Dezimalwert erwarte ich 32767.
Macht in Dual: 01111111 11111111 = 127 und 255 in Dezimal.
Die Bytes werden getauscht und zu einem 16bit-Wert zusammengefasst:
11111111 01111111 = 65407 in Dezimal
Das passt nicht, da 65407 ungleich 32767 ist!
Drehe ich nicht:
01111111 11111111 = 32767 in Dezimal
Hier darf nicht getauscht werden!
Wenn ich mir das INT in dualer Schreibweise angucke, sieht man auf dem ersten Blick, dass man nicht drehen darf, da ich eine positive Zahl erwarte und das höchstwertigste Bit 0 sein muss.
Zu guter Letzt habe ich einen Zähler erstellt, der in einen DB den Zählerstand schreibt.
Als Datentyp im DB habe ich WORD genommen und mir mal in der Online-Beobachtung die Änderung des Wertes im DB angeguckt.
Was aufgefallen ist, ist, dass das zweite Datenbyte zuerst hochgezählt wird, danach das erste Datenbyte.
Also:
Zählerstand 255 = 0x00 0xFF = 00000000 11111111
Zählerstand 256 = 0x01 0x00 = 00000001 00000000
Hier darf auch nicht getauscht werden!
So, warum muss man nun beim Eingangswort die Bytes tauschen und z.B. bei einem Zählwert (als WORD) nicht?
Und allgemein: Wie erkennt man, ob man die "Datenbytes" drehen muss oder nicht?
Gruß,
poppycock