HI,
da sind in Deinem Code leider Dinge ein wenig durhceinander geraten. Dem Kommentarim Code entnehme ich, dass Du Du Teile davon aus "RunninLight.py" (aus "Code Beispiel aus Video Tutorial Nr. 16") hast. Dort wurde aber bei diesen zeilen kein Einzelbit abgefragt, sondern alle 14 Eingänge (also 2 Byte). Der Einzelzugriff auf Bits erfolgt auf 2 mögliche Weisen: Eintweder mit einem IOCTL-Aufruf (siehe RunningLight.py) oder aber beim Lesen durchaus auch einfacher durch Lesen aller 14/16 Eingänge und anschließendes maskieren des Bits und dann rechtsshift (=division durch 2er Potenz). Während bei IOCTL ein komplizietrer Parameter bestimmt und übergeben werden muss, ist dort allerdings dann auch die direkte Übergabe der Bit-Stelle möglich. Da es beim lesen wirklich egal ist (ja sogar performanter) ob Du gleich 16 Bits einliest, ist dies beim Schreiben natürlich nicht egal, weil man dann immer erst lesen muss, dann ein einzelnes Bit verändern und danach wieder Schreiben. In der Zwischenzeit könnten sich aber die anderen Bits schon verändert haben und dann entshet ein Problem daraus. Du brauchst beim Schrieben einen sogenannten "atomaren" Zugriff, der nur über den IOCTL-Aufruf gewährleistet ist. Beim Lesen ist das wie gesagt egal.
Daher kannst Du wie in Deinem Programm einfach mit
die beiden Bytes mit allen 14/16 Eingängen einlesen (je nach DIO oder DI Modul). Mit
Code: Select all
s = struct.unpack('<H',i) # this is the way which is possible with Python 2.7
entpackst Du das beim read eingelesene Bytearray in eine Struktur, bei der das einzige Element eine Integerzahl mit allen Bits ist. Da die struct Funktion immer eine Struktur zurück gibt, auch wenn asl Ergebnis nur eine Zahl entsteht, muss so auf diese Zahl zugegriffen werden:
In lValue steht nun die 16 bit Integerzahl. Nun musst Deine Funktion mit dem Parameter pBit daraus das einzelen Bit extrahieren und auf 1 oer 0 testen. Das geht z.B. so:
Code: Select all
mask = 1<<pBit # links shift un pBit entspricht der Funktion 2^pBit, also 0,2,4,8,16,32... für 0,1,2,3,4,5...
return (lValue & mask == mask)
Wenn in Deiner Software sehr viel mit solchen masken gearbeitet wird, dann kannst Du performanter statt x-mal einen linksshift durchzuführen auch gleich zu Beginn eine dictionary Struktur anlegen und darüber zugreifen:
Code: Select all
mask = {0:0,1:2,2:4,3:8,4:16,5:32,6:64,7:128,8:256,9:512,10:1024,11:2048,12:4096,13:8192}
return (lValue & mask[pBit]==mask[pBit])
Soweit die klassische Methode über Bit-Masken. Macht ja durchaus Sinn, dass Du Dich mit dieser Matherie mal in dieser Tiefe befasst. Wenn Du es einfacher haben willst, dann kannst Du natürlich auch auf Biliotheken zugreifen, die diese Arbeit für Dich erledigen:
https://revpimodio.org/
Aber in die muss man sich halt auch erst mal einlesen ;.)
Viel Erfolg und ruhig weiter fragen wenn Dinge noch unklar sind...