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 number | Bity | bit / startBit | index bajtu | Wynik 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 |
wszystko inne (double, float, int, uint, …) | 32 | 0 – 31 | 0 – 3 | uint |
MODBUSR, literały dziesiętne,PARSEJSONi wartości urządzeń są typudouble, 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 zmiennejuint16: 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 —GETBITSzwraca istniejące bity, aSETBITSodrzuca resztę. doublelubfloatjest 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 zNaN, to błąd (value X is out of the 32-bit range). Wartości ujemne używają kodu uzupełnień do dwóch, więcGETBITS(-1, 0, 16)daje65535.
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.
| |
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.
| |
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: 15Data 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).
| |
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.
| |
Przykład
SETBITS(192, 4, 2, 3);
# Result: 240
SETBITS(192, 5, 2, 3);
# Result: 224Błę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.
| |
Przykład
GETBYTE(256, 0);
# Result: 0
GETBYTE(256, 1);
# Result: 1
GETBYTE(259, 0);
# Result: 3SETBYTE
SETBYTE zwraca liczbę, w której bajt na pozycji index został zastąpiony przez value (0 – 255).
| |
Przykład
SETBYTE(256, 0, 255);
# Result: 511
SETBYTE(259, 1, 2);
# Result: 515Błę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.
| |
Przykład
TOBCD(1234);
# Result: 4660 (0x1234)FROMBCD
FROMBCD konwertuje spakowaną wartość BCD z powrotem na zwykłą liczbę.
| |
Przykład
FROMBCD(0x1234);
# Result: 1234Błę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.
| Operator | Przykład | Wynik | Excel |
|---|---|---|---|
<< przesunięcie bitowe w lewo | 8 << 2 | 32 | BITLSHIFT(number, shift_amount) |
>> przesunięcie bitowe w prawo | 32 >> 2 | 8 | BITRSHIFT(number, shift_amount) |
& bitowe AND | 3 & 1 | 1 | BITAND(number1, number2) |
| bitowe OR | 2 | 1 | 3 | BITOR(number1, number2) |
^ bitowe XOR | 5 ^ 1 | 4 | BITXOR(number1, number2) |
Operatory bitowe wiążą słabiej niż porównania:
a & 1 > 0oznaczaa & (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.