WinCC Flex WinCC Flexible / Struktur Offset wird falsch berechnet

Azrael666

Level-1
Beiträge
239
Reaktionspunkte
18
Zuviel Werbung?
-> Hier kostenlos registrieren
Guten Morgen Leute,

mir ist gestern ein komisches Phänomen aufgefallen. Entweder ist es ein Fehler in WinCC Flexible 2008 SP3 oder ich bin zu doof.

Ich hatte eine Struktur mit StringChars angelegt und WinCC hat mir den Offset der Variablen wie folgt berechnet:

Offset_falsch.jpg

Wenn ich jetzt die Länge der letzen Variable auf 1 ändere, wird der Offset für die letzte Variable wieder korrekt angezeigt:

Offset_richtig.jpg

Kann das zufällig jemand erklären?

MFG
 
Ein StringChar in WinCC flex ist ein Char- oder Byte-Array in der S7-CPU. Ein Array beginnt in der S7 immer auf einer geraden Adresse/Offset, notfalls wird davor ein Füllbyte eingefügt ("Padding").
Einen StringChar der Länge 1 anzulegen ist eigentlich Quatsch - WinCC flex wird das wohl vermutlich intern als einzelnen Char oder Byte verbuchen und deshalb ist die Ausrichtung auf einen ungeraden Offset möglich (z.B. Dein "i_2" auf Offset 11).

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ja, ein StringChar der Länge 1 sollte ja auch ein Byte belegen und den Offset somit um 1 erhöhen.

Im zweiten Bild siehst du ja dass I_3 die Länge 1 hat und mit dem Offset 12 beginnt. I_4 hat hier ebenfalls die Länge 1 und beginnt korrekt mit dem Offset 13.

Im ersten Bild siehst du aber dass hier falsch gerechnet wird. I_3 hat hier wie im zweiten Bild die Länge 1 und beginnt mit dem Offset 12. I_4 hat jetzt aber die Länge 3 (spielt aber keine Rolle) und müsste trotzdem bei Offset 13 beginnen, weil I_3 ja die Länge 1 hat. I_4 beginnt aber plötzlich bei Offset 14. Das heißt I_3 belegt, trotz Länge von 1, 2 Byte.
 
I_4 hat jetzt aber die Länge 3 (spielt aber keine Rolle) und müsste trotzdem bei Offset 13 beginnen, weil I_3 ja die Länge 1 hat. I_4 beginnt aber plötzlich bei Offset 14. Das heißt I_3 belegt, trotz Länge von 1, 2 Byte.
I_3 belegt nicht 2 Byte sondern nur 1 Byte. Vor I_4 wird aber ein (unsichtbares) Padding-Byte eingefügt, weil I_4 eine Länge > 1 hat.

Wenn ein StringChar eine Länge > 1 hat, dann muß er auf einer geraden Adresse beginnen. Nur StringChars der Länge = 1 können auf ungeraden Adressen beginnen, weil die in Wirklichkeit kein StringChar sondern ein einzelnes Char sind.

Warum erstellst Du diese Struktur? Versuche mal diese Struktur in einem DB der CPU zu bauen - dann wirst Du sehen, daß WinCC flex nicht falsch rechnet sondern mittels Padding-Bytes die Strukturen so erzeugt, wie sie auch tatsächlich in der CPU vorkommen können. Strukturen, die in einer S7-CPU nicht vorkommen können kann man in WinCC flex auch nicht deklarieren.

Harald
 
Zurück
Oben