# Bitmuster Puzzel



## doelckenbeck (4 August 2010)

Hallo, ich habe folgendes Problem:

Ich habe ein Bitmuster, welches in ein anderes umgeformt werden soll. Hier mal ein Beispiel:

vorhandenes Bitmuster

16#00050317

erfordertes Bitmuster

16#AC40000000000000

Ich möchte hier nicht sämtliche Bits aufführen, weil das doch etwas lang würde. Zur Erklärung: A= 1010 usw.

Ich programmiere in Strukturiertem Text und würde gerne wissen, ob es hierbei die Möglichkeit gibt, in dieser Struktur, wie sie oben zu sehen ist, einzelne Bits zu schieben, zu entfernen oder hinzuzufügen, oder ob man sich aus den einzelnen Speicherbereichen ein neues Muster zusammenfummeln kann.
Ein Vorgehensweise wäre auch sehr hilfreich...


----------



## vierlagig (4 August 2010)

nach welcher vorschrift wird aus 16#50317 ein 16#AC40000000000000


----------



## doelckenbeck (4 August 2010)

Achso, hätte ich wohl dazuschreiben sollen!

Struktur der Bit-Konstanten
Bit 26 - 25 bestimmen die PDO-ID
Bit 19 - 17 bestimmen den Bitmuster-Typ
Bit 11 - 9 bestimmen die ID innerhalb Typ 0
Bit 5 - 1 bestimmen gesetztes Bit innerhalb von "Digital-Infos" (z.B. XX..XX00011 = 3 setzt Bit 35, weil Bit 33 das erste der Digital-Infos ist, in diesem Fall setzt #17 das 55. Bit)

Das wäre die Vorschrift für 16#00050317, wobei das Byte ganz links und damit die PDO- ID wegfällt.



Struktur des Bitmusters
Bit 64 - 62 definieren den Bitmuster- Typ
Bit 61 - 59 definieren die IDs innerhalb diesen Typs
Bit 58 - 33 definieren 26 Digital-Infos
Bit 32 - 17 und 16 - 1 definieren 2 Analog-Infos (-10000 bis 10000 bzw. -32768 bis 32768 )

Das wäre die Vorschrift für 16#AC40000000000000, wobei die Analogie zum ersten Bitmuster der Bitmuster- Typ und dessen ID sind und dahinter digitale und analoge Informationen eingetragen werden, um die es mir erstmal noch nicht geht.

16#00050317 -> 16#AC40000000000000 = Typ 5, ID 3, Digital-Info 23


----------



## vierlagig (4 August 2010)

i only understand railway station


----------



## doelckenbeck (4 August 2010)

Einfacher gefragt, gibt es die Möglichkeit in einer dieser Strukturen (z.B. 16#0293784) einzelne Bits zu schieben, zu entfernen, oder hinzuzufügen um sie in eine andere umzuformen, oder muss ich mir Speicherbereiche zusammenkopieren?


----------



## Ralle (4 August 2010)

Bei Siemens kannst du in SCL über den AT-Operator z.Bsp. ein DWORD auf ein Array of Bool verweisen und dann die Bits manipulieren, bei Codesys kann man direkt über Variable.Bitnummer einzelne Bits manipulieren. Ob bei Codesys dazu nur bestimmte Variablentypen verwendet werden können kann ich im Moment nicht beantworten.


----------



## ebt'ler (4 August 2010)

Du könntest das Bitmuster auch in ein String wandeln und dann mit INSERT und DELETE (usw.) arbeiten.


----------



## doelckenbeck (4 August 2010)

So, jetzt nochmal eine andere Frage zum Thema. Kann man mit einem Befehl aus einem beliebigen Bitmuster herausholen?

Bsp.:

16#10837456

Das sind ja vier Byte! Kann man irgendwie z.B. das dritte Byte, also 16#83 da rausholen? Habs mit memcpy versucht, funktioniert aber noch nicht so ganz...
Vielleicht mit Pointern?


----------



## doelckenbeck (4 August 2010)

Habs schon, man inkrementiert einfach die Quelladresse um ein Byte, bis man an der richtigen Stelle ist.


----------



## Sera (9 August 2010)

doppelpost sy


----------



## Sera (9 August 2010)

also bei ST bei B&R gibt es folgende funktionen  um einzelne bits zu setzen lesen:

 BIT_CLR
 A := BIT_CLR(IN, POS)
A erhält den Wert IN nachdem  das Bit an der Position POS gelöscht wurde. Der Operand IN bleibt jedoch  unverändert.    BIT_SET
 A := BIT_SET(IN, POS)
A erhält den Wert IN nachdem  das Bit an der Position POS gesetzt wurde. Der Operand IN bleibt jedoch  unverändert.    BIT_TST
 Wert eines Bit bestimmen: A := BIT_TST(IN,POS)
A  erhält den Wert des Bit an der Position POS des Operanden IN. 
Die könnte helfen.

Ab B&R SG4 (und AS3.X) kann man auch durch anhängen von .Bitnummer auf einzelne Bits zugreifen, also wie ein Struct. Weiß aber  ebenfalls nicht ob das auch bei anderen Herstellern gibt.

dass hilft aber nur wenn du die stelle kennst. Wenn du die Stelle einer bestimmten bitmussters rausbekommen willst, könntes das über ne schleife und nen vergleich lösen:

immer ein byte a 8 bit nehmen vergleichen, wenn nein dann nächsten 8 bit vergleichen usw.
Dazu kannst dann obrige funktionen nutzen (sollte es die geben)
musst eventuell eben die bits in eine seperate Variable (USint) schreiben un die dann vergleichen.

Wenn du also 3. Byte willst kopier bits 24-31 in ne andere Var (usint)
also in ner schleife mit allen 8 bits:

If BIT_tst(var1,X)
var2:=bit_set(var2,x)
End_IF


----------

