Bitoperationen
Bit- und Bytemanipulation in TapHome-Skripten — GETBIT, GETBITS, SETBIT, SETBITS, GETBYTE, SETBYTE, TOBCD, FROMBCD, Bitbreite nach Typ und bitweise Operatoren mit Entsprechungen in Excel.
Diese Funktionen lesen und ändern einzelne Bits, Bitfelder und Bytes einer ganzen Zahl — typischerweise Statuswörter und Alarmregister, die mit MODBUSR gelesen werden. Bit 0 ist das niederwertigste (ganz rechte) Bit und Byte 0 das niederwertigste Byte.
Bitbreite nach Typ
Wie viele Bits eine Zahl für die Bitfunktionen hat, hängt von ihrem Typ ab:
Typ von number | Bits | bit / startBit | Byte index | Ergebnis von GETBITS, SETBIT, SETBITS, SETBYTE |
|---|---|---|---|---|
int8, uint8 | 8 | 0 – 7 | 0 | uint |
int16, uint16 | 16 | 0 – 15 | 0 – 1 | uint |
int64, uint64 | 64 | 0 – 63 | 0 – 7 | uint64 |
alles andere (double, float, int, uint, …) | 32 | 0 – 31 | 0 – 3 | uint |
MODBUSR, Dezimalliterale,PARSEJSONund Gerätewerte sinddoubleund zählen daher als 32 Bit. Nur typisierte Variablen, Elemente von Sammlungen und die 64-Bit-Datentypen von Modbus haben eine andere Breite.- Ein Bit oder Byte außerhalb des Typs ist ein Fehler, zum Beispiel
GETBIT(x, 16)für eine Variable vom Typuint16: GETBIT - bit must be between 0 and 15. Ein Bitfeld, das innerhalb des Typs beginnt, aber über seine Obergrenze hinausreicht, ist erlaubt —GETBITSgibt die vorhandenen Bits zurück undSETBITSverwirft den Rest. - Ein
doubleoderfloatwird auf eine ganze Zahl gerundet und muss zwischen −2 147 483 648 und 4 294 967 295 liegen; alles andere, einschließlichNaN, ist ein Fehler (value X is out of the 32-bit range). Negative Werte verwenden das Zweierkomplement, daher ergibtGETBITS(-1, 0, 16)den Wert65535.
Verfügbar — die Breite nach Typ gilt ab Core 2026.1, Build 40661. Ältere Core-Versionen, einschließlich früherer Builds von 2026.1, behandeln jeden Wert als 32 Bit: Ein 64-Bit-Wert verliert seine obere Hälfte, und ein Bit oberhalb eines 8-Bit- oder 16-Bit-Typs gibt 0 zurück.
GETBIT
GETBIT gibt den Wert eines Bits einer Zahl zurück, 0 oder 1.
| |
Beispiel
GETBIT(2, 0);
# Result: 0
GETBIT(4, 2);
# Result: 1
IF(GETBIT(MODBUSR(H, 600, Uint16), 3) = 1, ADDERROR(3, "Overheating"));GETBITS
GETBITS gibt ein Bitfeld — numberOfBits Bits ab startBit — als vorzeichenlose ganze Zahl zurück.
| |
Parameter — numberOfBits ist 1 – 32, oder 1 – 64 bei einer 64-Bit-Zahl number.
Beispiel
GETBITS(216, 3, 2);
# Result: 3 (216 = 0b11011000, bits 3 and 4 are 1)
GETBITS(0xFF, 0, 4);
# Result: 15Datum und Uhrzeit, gepackt als zwei Bytes pro Register (Komfovent):
VAR time := MODBUSR(H, 28, Uint16);
VAR date := MODBUSR(H, 30, Uint16);
GETBITS(time, 8, 8) + ":" + GETBITS(time, 0, 8) + " "
+ GETBITS(date, 0, 8) + "." + GETBITS(date, 8, 8) + "." + MODBUSR(H, 29, Uint16);SETBIT
SETBIT gibt die Zahl zurück, in der ein Bit auf 0 (wenn value 0 ist) oder auf 1 (bei jedem anderen value) gesetzt ist.
| |
Beispiel
SETBIT(1, 1, 1);
# Result: 3
SETBIT(4, 2, 0);
# Result: 0
uint64 alarms := 0;
alarms := SETBIT(alarms, 40, 1);
GETBIT(alarms, 40);
# Result: 1 (a 64-bit variable has bits 0 to 63)SETBITS
SETBITS gibt die Zahl zurück, in der das Bitfeld aus numberOfBits Bits ab startBit durch value ersetzt ist.
| |
Beispiel
SETBITS(192, 4, 2, 3);
# Result: 240
SETBITS(192, 5, 2, 3);
# Result: 224Fehler — Given number of bits (2) is not enought for storing the value 4., wenn value nicht in das Feld passt (die Meldung ist im Original so geschrieben).
GETBYTE
GETBYTE gibt ein Byte einer Zahl (0 – 255) als uint zurück.
| |
Beispiel
GETBYTE(256, 0);
# Result: 0
GETBYTE(256, 1);
# Result: 1
GETBYTE(259, 0);
# Result: 3SETBYTE
SETBYTE gibt die Zahl zurück, in der das Byte an index durch value (0 – 255) ersetzt ist.
| |
Beispiel
SETBYTE(256, 0, 255);
# Result: 511
SETBYTE(259, 1, 2);
# Result: 515Fehler — Given value (X) is bigger than maximum byte value.; Given value is less than 0.
TOBCD
TOBCD wandelt eine ganze Zahl in gepacktes BCD um — jede Dezimalziffer in eigenen 4 Bits — und gibt sie als uint zurück; bis zu 8 Ziffern bleiben erhalten.
| |
Beispiel
TOBCD(1234);
# Result: 4660 (0x1234)FROMBCD
FROMBCD wandelt einen gepackten BCD-Wert zurück in eine gewöhnliche Zahl um.
| |
Beispiel
FROMBCD(0x1234);
# Result: 1234Fehler — FROMBCD - number 26 is not in BCD format und die Position der Ziffer, wenn eine Gruppe von 4 Bits größer als 9 ist (hier 0x1A).
Bitweise Operatoren und Entsprechungen in Excel
Die Operatoren arbeiten mit ganzen Zahlen; ein Operand vom Typ double wird zuerst in int64 umgewandelt, und ein Operand Null ergibt Null. Die vollständige Liste und die Rangfolge stehen auf Operatoren.
| Operator | Beispiel | Ergebnis | Excel |
|---|---|---|---|
<< Bitverschiebung nach links | 8 << 2 | 32 | BITLSHIFT(number, shift_amount) |
>> Bitverschiebung nach rechts | 32 >> 2 | 8 | BITRSHIFT(number, shift_amount) |
& bitweises AND | 3 & 1 | 1 | BITAND(number1, number2) |
| bitweises OR | 2 | 1 | 3 | BITOR(number1, number2) |
^ bitweises XOR | 5 ^ 1 | 4 | BITXOR(number1, number2) |
Die bitweisen Operatoren binden schwächer als Vergleiche:
a & 1 > 0bedeuteta & (1 > 0). Verwenden Sie immer Klammern.
VAR status := MODBUSR(H, 5, Uint16);
IF((status & 0x04) > 0, "Door open", "Door closed");Sehen Sie sich das Beispiel für Bitoperationen in Google Sheets an, oder probieren Sie das interaktive Werkzeug unter bitwisecmd.com aus.