Step 7 Bool AT View auf Integer

gerdh

Level-2
Beiträge
103
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
hallo !

mal kurz die Frage..
wenn ich einen Bool AT View auf einen Integer lege (sprich einen Array 1..16 of bool)
wie sieht dann die Bitvergabe am Integer aus ?
1 2 3 4 5 .... 16
oder
16 15 14 ..... 1
Ist das beim Bool AT view auf ein Byte genauso nur ben bis 8 ?


Gruss Gerd
 
Warum auf einen Integer?

Integer sind Zahlen, darin sollte eigentlich kein Bitmuster aufgenommen werden.

Aber um deine Frage zu beantworten, es beginnt mit 8..15 und dann 0..7
 
Die Numerierung der Bits sollte mit dem niederwertigsten beginnen und das erhält die Nummer 0.
2^n, also "2 hoch BitNr", ist die Wertigkeit des Bits.

PS:
Code:
 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
 .. .. .. .. .. .. .. ..   .. .. .. .. .. .. .. ..   .. .. .. .. .. .. .. ..  |<-------- BYTE ------->|
 .. .. .. .. .. .. .. ..   .. .. .. .. .. .. .. ..  |<--------------------- WORD -------------------->|
|<---------------------------------------------- DWORD ---------------------------------------------->|

 .. .. .. .. .. .. .. ..   .. .. .. .. .. .. .. ..   .. .. .. .. .. .. .. ..  |<------- BYTE b ------>|
 .. .. .. .. .. .. .. ..   .. .. .. .. .. .. .. ..  |<------- BYTE b ------>| |<------ BYTE b+1 ----->|
|<------- BYTE b ------>| |<------ BYTE n+1 ----->| |<------ BYTE b+2 ----->| |<------ BYTE b+3 ----->|

Korrektur (Harald hat aufgepasst!)
Sorry das "gildet" leider gar nicht, sondern:
Code:
         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         
BYTE:  |<------- BYTE n ------>|
WORD:  |<------- BYTE n ------>| |<------ BYTE n+1 ----->|
DWORD: |<------- BYTE n ------>| |<------ BYTE n+1 ----->| |<------ BYTE n+2 ----->| |<------ BYTE n+3 ----->|
Damit ist leider auch meine Behauptung zerbröselt, 2^n mit n=BitNr sei die Wertigkeit der Bits, sobald man diese auf etwas anderes als Bytes bezieht.
 
Zuletzt bearbeitet:
hi !

ich meine jetzt nicht die wertigkeit sondern die Postion.
Ich will aus 8 einzelnen Bits eine zahl machen (halt ein Word oder byte)
Eingang 1
Eingang 3

Sprich in der Konstellation kriege ich die zahlen 1 2 und 3 raus (egal ob byte word oder Integer)
Wo muss ich jetzt in eimen AT View auf ein byte (array 0 bis 7 of bool) den Eingang1 hinkopieren ?
in Index 0 oder 7 ? Der Rest sollte dann ja klar sein...

Gruss gerd
 
ja :) klaro also fängt er auch beim Arry von hinten an zu zaehlen..
Nein.
Achtung! Der erste BOOL des Arrays liegt im ersten Byte! Der 9. Bool liegt in zweiten Byte (... der 17. Bool liegt im dritten Byte ...)
xArray[0] = Byte_n.0
...
xArray[7] = Byte_n.7
xArray[8] = Byte_n+1.0
...
xArray[15] = Byte_n+1.7

Code:
          [COLOR="#FF0000"]MyView AT WORD : ARRAY[0..15] OF BOOL :     7  6  5  4  3  2  1  0   15 14 13 12 11 10  9  8[/COLOR]

 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
 .. .. .. .. .. .. .. ..   .. .. .. .. .. .. .. ..   .. .. .. .. .. .. .. ..  |<-------- BYTE ------->|
 .. .. .. .. .. .. .. ..   .. .. .. .. .. .. .. ..  |<--------------------- WORD -------------------->|
|<---------------------------------------------- DWORD ---------------------------------------------->|


|<------- BYTE n ------>| |<------ BYTE n+1 ----->| |<------ BYTE n+2 ----->| |<------ BYTE n+3 ----->|
Harald
 
Ei verbibsch - sorry vielstmals!!! ;) Wäre ja auch zu einfach gewesen. :ROFLMAO: Noch ein Grund mehr, die AWL-Befehle TAW und TAD zu kennen.

Oje wie konnte das passieren :D:D:D
Und dann kommst du auch noch mit den bösen AWL-Befehlen hinterher.

Hab's noch nie gebraucht, aber eigentlich müsste das Drehen bei TIA doch mit SWAP funktionieren.

Gruß
Blockmove
 
Hier wird Bytes-tauschen (TAW/TAD/SWAP) eher nicht gebraucht. Der TE will wissen, auf welche "Adresse" in der AT-View er Bits kopieren muß, damit sie im Word/Integer gleich an der gewünschten Bitposition zu liegen kommen.

Dazu muß man wissen, daß in einer S7 mehr-Byte-ige Datentypen im Big Endian gespeichert werden, also z.B. von einem Word zuerst das höherwertige Byte mit den Bits 8 bis 15 und dahinter das niederwertige Byte mit den Bits 0 bis 7.

Die Elemente eines Arrays liegen in "natürlicher" Reihenfolge im Speicher: zuerst kommt das erste Element mit dem ersten (üblicherweise niedrigsten) Index, und zuletzt kommt das letzte Element mit dem letzten (üblicherweise höchsten) Index. (Arrays liegen quasi im Little Endian im Speicher) Dadurch kann man (in Speicher mit Adressen) die Adresse eines Elementes leicht berechnen, z.B. bei Array[0..xx]:
Adresse des Elementes Array[n] = n * Datentypgröße_in_Byte + Anfangsadresse_des_Arrays
(Datentypen > 1 Byte haben immer eine Datentypgröße mit gerader Anzahl Bytes, ggf. wird ein Padding-Byte zugefügt)

Bei einem BOOL/Bit-Array errechnet sich die BitAdresse:
BitAdresse des Elementes BitArray[n] = n + Anfangsadresse_des_Arrays

Code:
         +-----------------------+-----------------------+
         |Byte_n                 |Byte_n+1               |
Adresse: |.0 .1 .2 .3 .4 .5 .6 .7|.0 .1 .2 .3 .4 .5 .6 .7|
         +-----------------------+-----------------------+
  Index: | 0| 1| 2| 3| 4| 5| 6| 7| 8| 9|10|11|12|13|14|15|  <-- Index des Arrays[0..15] of BOOL
         +-----------------------+-----------------------+
    Bit: | 8  9 10 11 12 13 14 15  0  1  2  3  4  5  6  7|  <-- Bitnummer des Word
         +-----------------------------------------------+
Anstatt mit einem BOOL-Array kann man das Word auch mit einem Struct aus BOOLs überlagern, das würde dann etwa so aussehen:
Code:
MyWord : Word;
MyBoolArray AT MyWord : ARRAY [0..15] OF BOOL;
MyWordStruct AT MyWord : STRUCT
  Bit_8  : BOOL;
  Bit_9  : BOOL;
  Bit_10 : BOOL;
  Bit_11 : BOOL;
  Bit_12 : BOOL;
  Bit_13 : BOOL;
  Bit_14 : BOOL;
  Bit_15 : BOOL;
  Bit_0  : BOOL;
  Bit_1  : BOOL;
  Bit_2  : BOOL;
  Bit_3  : BOOL;
  Bit_4  : BOOL;
  Bit_5  : BOOL;
  Bit_6  : BOOL;
  Bit_7  : BOOL;
END_STRUCT;
Soll ein Bit ins Bit 0 des Word kopiert werden, dann muß man es nach MyWordStruct.Bit_0 kopieren oder nach MyBoolArray[8] - ich finde die Struct-Variante verständlicher.

In TIA mit S7-1200/S7-1500 gibt es außer der AT-Überlagerung mit Array oder Struct noch eine weitere Möglichkeit für den Zugriff auf die Bits in einem Word - da kann man die Bits im Word direkt adressieren (sogenannter Slice-Zugriff), z.B. das Bit 0: #MyWord.%X0
(es könnte aber sein, daß die AT-Überlagerung effizienter ist)

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
1. Oje wie konnte das passieren :D:D:D
2. Und dann kommst du auch noch mit den bösen AWL-Befehlen hinterher.
3. Hab's noch nie gebraucht, aber eigentlich müsste das Drehen bei TIA doch mit SWAP funktionieren.
Zu 1.: Das WunschDenken hatte gesiegt :oops:
Zu 2.: Die "gute alte Schule" ;)
Zu 3.: Du magst Recht haben, aber woher ist mir SWAP eher in der Bedeutung geläufig, die Inhalte zweier Variablen zu tauschen? :confused:
Schluss jetzt, genug geOffTopict! :ROFLMAO:

Gruss, Heinileini
 
Zuletzt bearbeitet:
Zurück
Oben