TapHome

Operacje bitowe

Operacje na bitach i bajtach w skryptach TapHome — GETBIT, GETBITS, SETBIT, SETBITS, GETBYTE, SETBYTE, TOBCD, FROMBCD, szerokość bitowa według typu i operatory bitowe z odpowiednikami w Excelu.

Te funkcje odczytują i zmieniają pojedyncze bity, pola bitowe i bajty liczby całkowitej — zwykle słowa statusu i rejestry alarmów odczytane funkcją MODBUSR. Bit 0 to najmniej znaczący (skrajnie prawy) bit, a bajt 0 to najmniej znaczący bajt.

Szerokość bitowa według typu

Ile bitów ma liczba dla funkcji bitowych, zależy od jej typu:

Typ numberBitybit / startBitindex bajtuWynik GETBITS, SETBIT, SETBITS, SETBYTE
int8, uint880 – 70uint
int16, uint16160 – 150 – 1uint
int64, uint64640 – 630 – 7uint64
wszystko inne (double, float, int, uint, …)320 – 310 – 3uint
  • MODBUSR, literały dziesiętne, PARSEJSON i wartości urządzeń są typu double, więc liczą się jako 32 bity. Inną szerokość mają tylko zmienne z typem, elementy kolekcji i 64-bitowe typy danych Modbus.
  • Bit lub bajt poza typem to błąd, na przykład GETBIT(x, 16) dla zmiennej uint16: GETBIT - bit must be between 0 and 15. Pole bitowe, które zaczyna się wewnątrz typu, ale sięga ponad jego górną granicę, jest dozwolone — GETBITS zwraca istniejące bity, a SETBITS odrzuca resztę.
  • double lub float jest zaokrąglany do liczby całkowitej i musi mieścić się między −2 147 483 648 a 4 294 967 295; wszystko inne, łącznie z NaN, to błąd (value X is out of the 32-bit range). Wartości ujemne używają kodu uzupełnień do dwóch, więc GETBITS(-1, 0, 16) daje 65535.

Dostępność — szerokość według typu jest używana od Core 2026.1, kompilacja 40661. Starsze jednostki Core, łącznie z wcześniejszymi kompilacjami 2026.1, traktują każdą wartość jako 32-bitową: wartość 64-bitowa traci górną połowę, a bit powyżej typu 8- lub 16-bitowego zwraca 0.

GETBIT

GETBIT zwraca wartość jednego bitu liczby, 0 lub 1.

1
GETBIT(number, bit)

Przykład

GETBIT(2, 0);
# Result: 0
GETBIT(4, 2);
# Result: 1
IF(GETBIT(MODBUSR(H, 600, Uint16), 3) = 1, ADDERROR(3, "Overheating"));

GETBITS

GETBITS zwraca pole bitowe — numberOfBits bitów od startBit — jako liczbę całkowitą bez znaku.

1
GETBITS(number, startBit, numberOfBits)

Parametry — numberOfBits wynosi 1 – 32, albo 1 – 64 dla 64-bitowej number.

Przykład

GETBITS(216, 3, 2);
# Result: 3 (216 = 0b11011000, bits 3 and 4 are 1)
GETBITS(0xFF, 0, 4);
# Result: 15

Data i czas zapisane jako dwa bajty na rejestr (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 zwraca liczbę z jednym bitem ustawionym na 0 (gdy value wynosi 0) albo na 1 (każda inna value).

1
SETBIT(number, bit, value)

Przykład

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 zwraca liczbę, w której pole bitowe o długości numberOfBits bitów od startBit zostało zastąpione przez value.

1
SETBITS(number, startBit, numberOfBits, value)

Przykład

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

Błędy — Given number of bits (2) is not enought for storing the value 4., gdy value nie mieści się w polu (komunikat ma właśnie taką pisownię).

GETBYTE

GETBYTE zwraca jeden bajt liczby (0 – 255) jako uint.

1
GETBYTE(number, index)

Przykład

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

SETBYTE

SETBYTE zwraca liczbę, w której bajt na pozycji index został zastąpiony przez value (0 – 255).

1
SETBYTE(number, index, value)

Przykład

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

Błędy — Given value (X) is bigger than maximum byte value.; Given value is less than 0.

TOBCD

TOBCD konwertuje liczbę całkowitą na spakowany kod BCD — każda cyfra dziesiętna w osobnych 4 bitach — i zwraca ją jako uint; zachowywanych jest do 8 cyfr.

1
TOBCD(number)

Przykład

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

FROMBCD

FROMBCD konwertuje spakowaną wartość BCD z powrotem na zwykłą liczbę.

1
FROMBCD(number)

Przykład

FROMBCD(0x1234);
# Result: 1234

Błędy — FROMBCD - number 26 is not in BCD format oraz pozycja cyfry, gdy grupa 4 bitów jest większa niż 9 (tutaj 0x1A).

Operatory bitowe i odpowiedniki w Excelu

Operatory działają na liczbach całkowitych; operand double jest najpierw konwertowany na int64, a operand Null daje Null. Pełna lista i priorytety są na stronie Operatory.

OperatorPrzykładWynikExcel
<< przesunięcie bitowe w lewo8 << 232BITLSHIFT(number, shift_amount)
>> przesunięcie bitowe w prawo32 >> 28BITRSHIFT(number, shift_amount)
& bitowe AND3 & 11BITAND(number1, number2)
| bitowe OR2 | 13BITOR(number1, number2)
^ bitowe XOR5 ^ 14BITXOR(number1, number2)

Operatory bitowe wiążą słabiej niż porównania: a & 1 > 0 oznacza a & (1 > 0). Zawsze używaj nawiasów.

VAR status := MODBUSR(H, 5, Uint16);
IF((status & 0x04) > 0, "Door open", "Door closed");

Zobacz przykład operacji bitowych w Arkuszach Google albo wypróbuj interaktywne narzędzie bitwisecmd.com.