TapHome

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 numberBitsbit / startBitByte indexErgebnis von GETBITS, SETBIT, SETBITS, SETBYTE
int8, uint880 – 70uint
int16, uint16160 – 150 – 1uint
int64, uint64640 – 630 – 7uint64
alles andere (double, float, int, uint, …)320 – 310 – 3uint
  • MODBUSR, Dezimalliterale, PARSEJSON und Gerätewerte sind double und 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 Typ uint16: GETBIT - bit must be between 0 and 15. Ein Bitfeld, das innerhalb des Typs beginnt, aber über seine Obergrenze hinausreicht, ist erlaubt — GETBITS gibt die vorhandenen Bits zurück und SETBITS verwirft den Rest.
  • Ein double oder float wird auf eine ganze Zahl gerundet und muss zwischen −2 147 483 648 und 4 294 967 295 liegen; alles andere, einschließlich NaN, ist ein Fehler (value X is out of the 32-bit range). Negative Werte verwenden das Zweierkomplement, daher ergibt GETBITS(-1, 0, 16) den Wert 65535.

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.

1
GETBIT(number, bit)

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.

1
GETBITS(number, startBit, numberOfBits)

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: 15

Datum 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.

1
SETBIT(number, bit, value)

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.

1
SETBITS(number, startBit, numberOfBits, value)

Beispiel

SETBITS(192, 4, 2, 3);
# Result: 240
SETBITS(192, 5, 2, 3);
# Result: 224

Fehler — 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.

1
GETBYTE(number, index)

Beispiel

GETBYTE(256, 0);
# Result: 0
GETBYTE(256, 1);
# Result: 1
GETBYTE(259, 0);
# Result: 3

SETBYTE

SETBYTE gibt die Zahl zurück, in der das Byte an index durch value (0 – 255) ersetzt ist.

1
SETBYTE(number, index, value)

Beispiel

SETBYTE(256, 0, 255);
# Result: 511
SETBYTE(259, 1, 2);
# Result: 515

Fehler — 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.

1
TOBCD(number)

Beispiel

TOBCD(1234);
# Result: 4660 (0x1234)

FROMBCD

FROMBCD wandelt einen gepackten BCD-Wert zurück in eine gewöhnliche Zahl um.

1
FROMBCD(number)

Beispiel

FROMBCD(0x1234);
# Result: 1234

Fehler — 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.

OperatorBeispielErgebnisExcel
<< Bitverschiebung nach links8 << 232BITLSHIFT(number, shift_amount)
>> Bitverschiebung nach rechts32 >> 28BITRSHIFT(number, shift_amount)
& bitweises AND3 & 11BITAND(number1, number2)
| bitweises OR2 | 13BITOR(number1, number2)
^ bitweises XOR5 ^ 14BITXOR(number1, number2)

Die bitweisen Operatoren binden schwächer als Vergleiche: a & 1 > 0 bedeutet a & (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.