TIA DWORD AT Überlagerung Bit/Byte Reihenfolge TIA V15.1

RosiBro

Level-1
Beiträge
54
Reaktionspunkte
5
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,
hat wer von euch zufällig die Byte-/Bit- Reihenfolge der DWord AT Überlagerung parat, oder wo ich das einsehen kann (ich habe da nicht direkt was gefunden)?

ursprünglich vermutete ich folgende:
| DWord |
| Word[1] | Word[0] |
| Byte[3] | Byte[2] | Byte[1] | Byte[0] |
|[31][30][29]... ... [3][2][1][0]|

gerade scheint es mir eher so:
| DWord |
| Word[1] | Word[0] |
| Byte[1] | Byte[0] | Byte[3] | Byte[2] |
|[7]... [0]|[15]... [8]|[23]... [16]|[31]... [24]|


kann das jemand bestätigen (oder auch nicht)?

Liebe Grüße,
RosiBro.

Edit : habe es noch einmal angepasst, weil es vorher gar keinen Sinn ergeben hat.
 
Zuletzt bearbeitet:
Code:
|<-------- BYTE 0 -------->|<-------- BYTE 1 -------->|<-------- BYTE 2 -------->|<-------- BYTE 3 -------->|<-------- BYTE 4 -------->|<-------- BYTE 5 -------->|<-------- BYTE 6 -------->|<-------- BYTE 7 -------->|
|  7  6  5  4  3  2  1  0  |  7  6  5  4  3  2  1  0  |  7  6  5  4  3  2  1  0  |  7  6  5  4  3  2  1  0  |  7  6  5  4  3  2  1  0  |  7  6  5  4  3  2  1  0  |  7  6  5  4  3  2  1  0  |  7  6  5  4  3  2  1  0  |

|<--------------------- WORD 0 ---------------------->|<--------------------- WORD 2 ---------------------->|<--------------------- WORD 4 ---------------------->|<--------------------- WORD 6 ---------------------->|
| 15 14 13 12 11 10  9  8  |  7  6  5  4  3  2  1  0  | 15 14 13 12 11 10  9  8  |  7  6  5  4  3  2  1  0  | 15 14 13 12 11 10  9  8  |  7  6  5  4  3  2  1  0  | 15 14 13 12 11 10  9  8  |  7  6  5  4  3  2  1  0  |

                           |<--------------------- WORD 1 ---------------------->|<--------------------- WORD 3 ---------------------->|<--------------------- WORD 5 ---------------------->|
                           | 15 14 13 12 11 10  9  8  |  7  6  5  4  3  2  1  0  | 15 14 13 12 11 10  9  8  |  7  6  5  4  3  2  1  0  | 15 14 13 12 11 10  9  8  |  7  6  5  4  3  2  1  0  |

|<------------------------------------------------ DWORD 0 ------------------------------------------------>|<------------------------------------------------ DWORD 4 ------------------------------------------------>|
| 31 30 29 28 27 26 25 24  | 23 22 21 20 19 18 17 16  | 15 14 13 12 11 10  9  8  |  7  6  5  4  3  2  1  0  | 31 30 29 28 27 26 25 24  | 23 22 21 20 19 18 17 16  | 15 14 13 12 11 10  9  8  |  7  6  5  4  3  2  1  0  |

                           |<------------------------------------------------ DWORD 1 ------------------------------------------------>|
                           | 31 30 29 28 27 26 25 24  | 23 22 21 20 19 18 17 16  | 15 14 13 12 11 10  9  8  |  7  6  5  4  3  2  1  0  |

                                                      |<------------------------------------------------ DWORD 2 ------------------------------------------------>|
                                                      | 31 30 29 28 27 26 25 24  | 23 22 21 20 19 18 17 16  | 15 14 13 12 11 10  9  8  |  7  6  5  4  3  2  1  0  |

                                                                                 |<------------------------------------------------ DWORD 3 ------------------------------------------------>|
                                                                                 | 31 30 29 28 27 26 25 24  | 23 22 21 20 19 18 17 16  | 15 14 13 12 11 10  9  8  |  7  6  5  4  3  2  1  0  |
Bytes werden von links nach rechts durchnumeriert. Bits von rechts nach links.
Worte und DoppelWorte werden nach der Nummer des Bytes benannt, bei dem sie (links!) beginnen.
Unbedingt beachten, dass Überschneidungen der belegten Bereiche vorliegen!
Wird Wort0 belegt, so ist Wort2 das nächste freie Wort. Wird DoppelWort0 belegt, so ist DoppelWort4 das nächste freie DoppelWort.

Das oben gesagte gilt durchweg für S7.

Nebenbei:
Bei S5 gilt es auch für Eingänge, Ausgänge und Merker ABER NICHT für DatenWorte in DBs bzw. DXs! Die kleinste ZählEinheit bei S5-DBs bzw. -DXs sind Worte! DW0 überschneidet sich nicht mit DW1 usw..
Darum wird bei S5 zwischen linkem und rechtem Byte unterschieden:
DW0 besteht aus DL0 (DatenByte Links) und DR0 (DatenByte Rechts), DW1 aus DL1 und DR1 u.s.w..
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hey,
danke dir!
Ich glaube ich hatte mich nicht konkret genug ausgedrückt: Ich wollte in einem FB ein DWord mittels AT mit einem Array[0..31] of Bool überlagern. Ich habe jetzt noch einmal einen Testfall implementiert und es scheint die Durchnummerierung konsequent an das zu halten, was du verbal ausgedrückt hast.
Bytes werden von links nach rechts durchnumeriert. Bits von rechts nach links.
aber Byteweise. Das sieht dann so aus:
Code:
|
|<------------------------------------------------- DWORD ------------------------------------------------->|
|<-------- BYTE 0 -------->|<-------- BYTE 1 -------->|<-------- BYTE 2 -------->|<-------- BYTE 3 -------->|
|  7  6  5  4  3  2  1  0  | 15 14 13 12 11 10  9  8  | 23 22 21 20 19 18 17 16  | 31 30 29 28 27 26 25 24  |    <-- Index des Array of Bool
| 31 30 29 28 27 26 25 24  | 23 22 21 20 19 18 17 16  | 15 14 13 12 11 10  9  8  |  7  6  5  4  3  2  1  0  |    <-- eigentlicher Index im DWord
Das heißt wenn ich dann meine boolsche Variable mit dem Index 23 anspreche, spreche ich eigentlich bit 15 im DWord an.

Da musste ich erstmal drauf kommen.
 
Da kann man theoretisch drauf kommen: In einem Array liegen die Elemente in aufsteigender Reihenfolge hintereinander im Speicher. Bei Bits (Bool) liegt das erste Bit des Arrays im ersten Byte das niedrigste Bit (Byte 0 Bit 0) und das letzte Bit des Arrays liegt im letzten Byte das höchste Bit (Byte 3 Bit 7).

Bei Mehrbyte-Datentypen (Word/DWord/INT/DINT/...) muß man wissen, wie die Bytes des Datentyps im Speicher liegen (endianness), und da liegt bei Siemens S7 das höchstwertige Byte zuerst im Speicher (an der niedrigeren Byte-Adresse) und das kleinstwertige Byte zuletzt (an der höheren Byte-Adresse). Wegen diesem big-endian liegt das niedrigstwertige Bit des DWORD im Byte 3 Bit 0, im Gegensatz zu Byte 0 Bit 0 beim BOOL-Array.

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Das stimmt. Ich dachte nur, dass es bei der Indexierung noch eine Abstraktionsschicht gibt, die das ganze Intuitiver macht und dass es nicht so "raw" ist. Aber ja, es ergibt durchaus Sinn.
 
Die Endianness ändert sich auch abhängig von optimiert bzw. nicht-optimiert.
Bei "optimiert" haben die Variablen keine Adresse und man darf das Bool-Array deshalb auch nicht mit einem DWORD überlagern und kann deshalb auch nicht sagen, wo ein bestimmtes Bool des Arrays im DWORD liegen würde. Außerdem werden Bool in "optimiert" bei manchen CPU als volles Byte gespeichert. (@hucki: ich weiß, es gibt auch noch diesen angeblich-optimiert Modus ;) ).

Harald
 
Bei "optimiert" haben die Variablen keine Adresse und man darf das Bool-Array deshalb auch nicht mit einem DWORD überlagern und kann deshalb auch nicht sagen, wo ein bestimmtes Bool des Arrays im DWORD liegen würde. (@hucki: ich weiß, es gibt auch noch diesen angeblich-optimiert Modus ;) ).

Harald
Man kann ein in ein 'optimierte' FB deklarierte Variabel überlagern wenn man das Remanenz 'in IDB Setzen' wählt.
Aber keine Erfahrung wie die damit überlagerte Bits dann kodiert werden.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Man kann ein in ein 'optimierte' FB deklarierte Variabel überlagern wenn man das Remanenz 'in IDB Setzen' wählt.
Aber keine Erfahrung wie die damit überlagerte Bits dann kodiert werden.
In meinem Fall habe ich einen optimierten FB mit "Remanenz im IDB" verwendet und die oben beschriebene Reihenfolge herausbekommen.
 
Mit "angeblich-optimiert Modus" meine ich das "Remanenz in IDB Setzen". Das widerspricht ja den Regeln von "optimiertem" Speicher, wird aber trotzdem als "optimiert" bezeichnet.

Harald
 
Hallo Beisammen,

was hier noch nicht erwähnt wurde per Slice können Optimierte und nicht optimierte Variablen überlagert werden. Was auch zu Problemen führt wenn jemand einen Baustein von Optimiert auf nicht Optimiert schaltet bzw. noch gefährlicher ein Netzwerk mit gewisser Funktionen schnell mal wohin Kopiert.


Gruß Tia
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Mit "angeblich-optimiert Modus" meine ich das "Remanenz in IDB Setzen". Das widerspricht ja den Regeln von "optimiertem" Speicher, wird aber trotzdem als "optimiert" bezeichnet.
Ich glaube Siemens geht mittlerweile auch von der Bezeichnung "Optimiert" weg, und verwendet stattdessen Zugriffsart "Standard" für das was bisher "optimiert" war. Zumindest ist mir das jetzt schon an einigen Stellen über den Weg gelaufen. Vielleicht weil "nicht optimiert" manchmal doch "optimaler" war.
 
Zurück
Oben