TwinCAT 3 - Bitweise auf Byte über For - Schleife zugreifen

STEP7_NEWBEE

Level-2
Beiträge
141
Reaktionspunkte
1
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

Ich stehe gerade vor dem Problem, dass ich bei einer Zählerbaugruppe mit Oversampling (EL1262) die Daten in
Form von einzelnen Bytes bekomme.

Ich wollte nun auf diese Byte bitweise über eine For - Schleife zugreifen, um eine Zustandsänderung auszuwerten.

Ein Zugriff über einen Index mit x:= Byte.1 funktioniert, über eine For-Schleife mit einem Zählindex von 0 bis 7 x:=Byte. wird jedoch ein
Fehler ausgegeben.

Kann mir jemand sage, wie man auf die einzelnen Bits eines Bytes über eine Schleife am einfachsten zugreifen kann ?

LG
 
So mache ich das:

Code:
(USINT_TO_WORD(nDeinByte) AND LREAL_TO_WORD(EXPT(2,nSchleifenZaehler))) > 0

Statt in Word kannst Du auch in Byte (LREAL_TO_BYTE) umwandeln. Nur die Datentypen (D)Word und Byte lassen sich auf diese Weise mit AND und OR verknüpfen.
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Wieviele Bytes gehören denn zu einem Kanal? Liegen die direkt hintereinander? Dann könntest du anstatt Bits zu adressieren gleich ganze Word oder DWord lesen. Entweder direkt als Word/DWord deklarieren, oder per UNION überlagern oder per Pointer zugreifen oder von den Eingangsbytes in die Auswertevariablen kopieren. Wenn du unbedingt jedes Bit einzeln in einer Schleife auswerten willst, dann könntest du die Eingangsbytes in ein Bool-Array kopieren, was per UNION mit einer Struktur überlagert ist oder per Pointer kopieren oder per Memcopy.
 
Der Zugriff per DeinByte.BitPosition funktioniert nur mit konstanten Werten für Bitposition.
In einer Schleife mußt du mit Maskierungen arbeiten. Z. B. so:
Code:
x:=(DeinByte and shl(1,Zählindex))>0;
 
Vielen Dank für die Info! Ja in meinem Fall möchte ich jedes Bits auf dessen Zustand kontrollieren können.
Bei mir handelt es sich hierbei um 2 Kanäle mit jeweils 50 Byte, die direkt hintereinander liegen.

@ PN/DP:
Ich dachte selber an eine Funktion, die ich aus LabVIEW kenne - "Number to Boolean Array" - "Das wäre whs am einfachsten mit der Funktion Memcopy?"
Wieviele Bytes gehören denn zu einem Kanal? Liegen die direkt hintereinander? Dann könntest du anstatt Bits zu adressieren gleich ganze Word oder DWord lesen. Entweder direkt als Word/DWord deklarieren, oder per UNION überlagern oder per Pointer zugreifen oder von den Eingangsbytes in die Auswertevariablen kopieren. Wenn du unbedingt jedes Bit einzeln in einer Schleife auswerten willst, dann könntest du die Eingangsbytes in ein Bool-Array kopieren, was per UNION mit einer Struktur überlagert ist oder per Pointer kopieren oder per Memcopy.

@StructuredTrash:
Mit der Funktion bin ich schon einmal weiter gekommen, vielen Dank für eure Beiträge! - also der Zugriff auf die Bits ist mir nun soweit klar.
Der Zugriff per DeinByte.BitPosition funktioniert nur mit konstanten Werten für Bitposition.
In einer Schleife mußt du mit Maskierungen arbeiten. Z. B. so:
Code:
x:=(DeinByte and shl(1,Zählindex))>0;

Die Frage die sich mir stellt, welche in euren Augen die "sauberste" ist - welche würdet ihr am ehesten bei euch anwenden?

LG
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Die "sauberste" Variante ist imho die, bei der alles adressunabhängig symbolisch adressiert wird. Das ist meistens auch die verständlichste Variante.

Wenn du nur wissen willst, ob sich in 50 Bytes irgendein Bit geändert hat, kannst du z.B. 400 Bit-Vergleiche machen - das du dazu keine Lust hast und deshalb in einer Schleife die 400 Vergleiche machen willst, ist verständlich. Wenn du aber eh' schon nicht mehr symbolisch adressierst, sondern indirekt Adressen und Bits adressierst, dann brauchst du nicht 400 Vergleiche inklusive dem Schleifen- und Pointer-Overhead machen, sondern kannst ebenso gut auch gleich je 32 Bits = 4 Bytes auf einmal vergleichen und brauchst da nur 13 Vergleiche, die du sogar ganz ohne Schleifen-Overhead direkt hintereinander hinschreiben könntest. Aber wenn die CPU sowieso zehnmal schneller ist als nötig, dann spielt Effizienz keine Rolle. ;)
 
Zurück
Oben