TIA %B0 / %B1 bei WORD Variable

Zuviel Werbung?
-> Hier kostenlos registrieren
Immer der gleiche Test Code

Code:
#ByteXYZ.%X0 := TRUE;
"DB_Test".Word_XYZ.%B0 := #ByteXYZ;

Dann sind deine Ergebnisse total im Bereich des Erwartbaren.

Du sagst deiner CPU ja nur, dass sie das niedrigstwertige Bit in der Variable ByteXYZ setzen soll. (Dadurch wird der Wert um 1 erhöht oder bleibt gleich.) Dann schreibst du den Wert von ByteXYZ in das niederwertige Byte von "DB_Test".Word_XYZ. Der Wert ist dann genau das, was du im DB siehst. Was du im DB nicht siehst, ist die Reihenfolge in der die Daten abliegen.

Wenn du das genauer nachvollziehen möchtest, könntest du mal schauen, was passiert, wenn du per absolutem Zugriff aus dem Standard-DB liest.
#Test_1 := DB1.DBB0;
#Test_2 := DB1.DBB1;
Damit würdest du wahrscheinlich sehen, wie die Daten abliegen, aber du greifst weiter oben symbolisch zu. Da kommt der Unterschied zwischen den Klein- und den Großendern nicht zum Tragen.
 
"DB_Test".Word_XYZ ist in dem Fall %DB18.DBW0

In diesem Fall war bei nicht-optimiertem Zugriff das Bit %DB18.DBX1.0 = TRUE.

Wenn der DB optimiert ist, lässt sich nicht mehr "absolut" drauf zugreifen. Nur noch mit %X / %B ...
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich bin im Grunde nur darauf gekommen weil ich eine Byte-Variable in eine Word-Variable mit den AWL Zeilen L und T schubbsen wollte. Bei der Word-Variable habe ich anfänglich das %B0 dran gehangen und war vorhin beim Brille aufsetzen erstaunt, dass es im Highbyte lungerte ^^
 
"DB_Test".Word_XYZ ist in dem Fall %DB18.DBW0

In diesem Fall war bei nicht-optimiertem Zugriff das Bit %DB18.DBX1.0 = TRUE.

Wenn der DB optimiert ist, lässt sich nicht mehr "absolut" drauf zugreifen. Nur noch mit %X / %B ...
Dann ist ja alles so, wie es zu erwarten wäre...

Mein Tipp: keine Absoluten Zugriffe für S7-1x00 verwenden ;)
 
Immer der gleiche Test Code

Code:
#ByteXYZ.%X0 := TRUE;
"DB_Test".Word_XYZ.%B0 := #ByteXYZ;
%B0 bezeichnet immer das niederwertigste Byte. Wenn man auf %B0 schreibt, dann landet der Wert immer im niederwertigsten Byte der Variable, egal ob Big/Little Endian oder Optimiert/Standard. Der Beobachtungswert 16#0001 der Variable ist also nicht überraschend völlig korrekt.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Alles klar. Rückwärts betrachten quasi. Beim Doppelword würde es dann im Byte [0.1.2.3] landen.

So oft benutz ich das nicht. Danke für die Aufklärungen.
 
Alles klar. Rückwärts betrachten quasi. Beim Doppelword würde es dann im Byte [0.1.2.3] landen.

So oft benutz ich das nicht. Danke für die Aufklärungen.
Naja, je nachdem wie du es betrachtest. Auch bei einem Doppelword würde .%B0 das niedrigstwertige Byte beschreiben. Wie das abgelegt wird, ist ja in der tollen Grafik auf Seite 1 dieses Threads dargestellt.
 
Wie das abgelegt wird, ist ja in der tollen Grafik auf Seite 1 dieses Threads dargestellt.
Du hast die Ironie-Tags vergessen?

Ich weiß ja nicht, was der Ersteller der Grafik sich gedacht hat mit den Zahlen 0...3 innerhalb der Variablen, aber für mich ist die Darstellung falsch (oder zumindest irreführend, falls er nicht die Slice-Bytenummern gemeint hat). Hier habe ich mal die Slice-Bytenummern %Bx mit eingetragen:

Ablage_Korrektur.png


Das Bild in der Slice-FAQ ist da besser geeignet, um zu verstehen, was %B0 ... %B3 ist:

57374718_STEP7_V11_SliceAccess_in_KOP_FUP_1_de.png
aus FAQ: Wie können Sie in STEP 7 (TIA Portal) bit-, byte- oder wortweise und symbolisch auf unstrukturierte Datentypen zugreifen?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ja @PN/DP genau deswegen war ich anfänglich irritiert. Der Inhalt steht ja bei %B0 rechts im WORD, genau wie bei deiner Beschreibung. Ich hatte bisher immer geracht, B0 = byte 0, B1 = byte 1 .. usw.
 
Ja @PN/DP genau deswegen war ich anfänglich irritiert. Der Inhalt steht ja bei %B0 rechts im WORD, genau wie bei deiner Beschreibung. Ich hatte bisher immer geracht, B0 = byte 0, B1 = byte 1 .. usw.
Ja, passt doch? Deine Zahlen schreibst du doch auch so, dass die Gewichtung von links nach rechts abnimmt.
 
Ja @PN/DP genau deswegen war ich anfänglich irritiert. Der Inhalt steht ja bei %B0 rechts im WORD, genau wie bei deiner Beschreibung. Ich hatte bisher immer geracht, B0 = byte 0, B1 = byte 1 .. usw.
Man muss unterscheiden
- ob man die Bytes so zählt, wie sie im Speicher liegen - dann muss man die Byte-Ablage im Speicher Big/Little Endian beachten
- oder ob man die Wertigkeit innerhalb einer Variable meint (MSB ... LSB, so zählt Slice) - dann ist man relativ unabhängig von der Endianness, nur wenn man unbedingt wissen will/muss, auf welcher Speicheradresse ein bestimmtes Teil-Byte liegt, dann muss man die Endianness beachten.
 
Ja, passt doch? Deine Zahlen schreibst du doch auch so, dass die Gewichtung von links nach rechts abnimmt.
Ich hätte es anders formulieren sollen ebend.

Im Falle meines Beispieles mit dem Test-DB und der WORD Variable:
%B0 = DB18.DBB1
%B1 = DB18.DBB0

Für mich war die Welt gestern noch so: %B0 beschreibt Byte 0, %B1 beschreibt Byte 1 .. usw.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Für mich war die Welt gestern noch so: %B0 beschreibt Byte 0, %B1 beschreibt Byte 1 .. usw.
%B0, %B1 ... beschreiben die Wertigkeit des Bytes innerhalb einer Variable
Byte0, Byte1 ... sind die Nummern der Bytes einer Variable im Speicher (immer aufsteigend nummeriert) (zumindest das ist im Siemens Bild bei "optimiert" falsch)

%B0 = Byte0, %B1 = Byte1 gilt nur bei Little Endian (S7: "optimiert") : das niederwertigste Byte kommt zuerst an der niedrigeren Adresse
bei Big Endian (S7: "Standard") : das höchstwertige Byte kommt zuerst an der niedrigeren Adresse: z.B. bei Word %B1 = Byte0, %B0 = Byte1

siehe auch Byte-Reihenfolge (endianness)
 
Zurück
Oben