TapHome

Bitové operácie

Práca s bitmi a bajtmi v skripte TapHome — GETBIT, GETBITS, SETBIT, SETBITS, GETBYTE, SETBYTE, TOBCD, FROMBCD, šírka v bitoch podľa typu a bitové operátory s ekvivalentmi v Exceli.

Tieto funkcie čítajú a menia jednotlivé bity, bitové polia a bajty celého čísla — typicky stavových slov a alarmových registrov prečítaných pomocou MODBUSR. Bit 0 je najmenej významný (najpravejší) bit a bajt 0 je najmenej významný bajt.

Šírka v bitoch podľa typu

Koľko bitov má číslo pre bitové funkcie, závisí od jeho typu:

Typ numberBitybit / startBitindex bajtuVýsledok GETBITS, SETBIT, SETBITS, SETBYTE
int8, uint880 – 70uint
int16, uint16160 – 150 – 1uint
int64, uint64640 – 630 – 7uint64
všetko ostatné (double, float, int, uint, …)320 – 310 – 3uint
  • MODBUSR, desatinné literály, PARSEJSON a hodnoty zariadení sú double, preto sa rátajú ako 32 bitov. Inú šírku majú iba typované premenné, prvky kolekcií a 64-bitové dátové typy Modbus.
  • Bit alebo bajt mimo typu je chyba, napríklad GETBIT(x, 16) pre premennú typu uint16: GETBIT - bit must be between 0 and 15. Bitové pole, ktoré začína vo vnútri typu, ale presahuje jeho horný okraj, je povolené — GETBITS vráti bity, ktoré existujú, a SETBITS ostatné zahodí.
  • double alebo float sa zaokrúhli na celé číslo a musí byť v rozsahu −2 147 483 648 až 4 294 967 295; čokoľvek iné, vrátane NaN, je chyba (value X is out of the 32-bit range). Záporné hodnoty sa berú v dvojkovom doplnku, preto GETBITS(-1, 0, 16) je 65535.

Dostupnosť — šírka podľa typu platí od Core 2026.1, build 40661. Staršie verzie Core vrátane skorších buildov 2026.1 berú každú hodnotu ako 32-bitovú: 64-bitová hodnota stratí hornú polovicu a bit nad 8-bitovým alebo 16-bitovým typom vráti 0.

GETBIT

GETBIT vráti hodnotu jedného bitu čísla, 0 alebo 1.

1
GETBIT(number, bit)

Príklad

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

GETBITS

GETBITS vráti bitové pole — numberOfBits bitov od startBit — ako celé číslo bez znamienka.

1
GETBITS(number, startBit, numberOfBits)

Parametre — numberOfBits je 1 – 32, alebo 1 – 64 pre 64-bitové number.

Príklad

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

Dátum a čas zabalené po dvoch bajtoch v registri (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 vráti číslo s jedným bitom nastaveným na 0 (keď je value 0) alebo na 1 (pri akejkoľvek inej hodnote value).

1
SETBIT(number, bit, value)

Príklad

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 vráti číslo, v ktorom je bitové pole s numberOfBits bitmi od startBit nahradené hodnotou value.

1
SETBITS(number, startBit, numberOfBits, value)

Príklad

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

Chyby — Given number of bits (2) is not enought for storing the value 4., keď sa value do poľa nevojde (preklep „enought“ je priamo v hláške).

GETBYTE

GETBYTE vráti jeden bajt čísla (0 – 255) ako uint.

1
GETBYTE(number, index)

Príklad

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

SETBYTE

SETBYTE vráti číslo, v ktorom je bajt na pozícii index nahradený hodnotou value (0 – 255).

1
SETBYTE(number, index, value)

Príklad

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

Chyby — Given value (X) is bigger than maximum byte value.; Given value is less than 0.

TOBCD

TOBCD prevedie celé číslo do zabaleného BCD — každá desiatková číslica vo vlastných 4 bitoch — a vráti ho ako uint; zachová sa najviac 8 číslic.

1
TOBCD(number)

Príklad

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

FROMBCD

FROMBCD prevedie zabalenú hodnotu BCD späť na bežné číslo.

1
FROMBCD(number)

Príklad

FROMBCD(0x1234);
# Result: 1234

Chyby — FROMBCD - number 26 is not in BCD format spolu s pozíciou číslice, keď je niektorá skupina 4 bitov väčšia ako 9 (tu 0x1A).

Bitové operátory a ekvivalenty v Exceli

Operátory pracujú s celými číslami; operand typu double sa najprv prevedie na int64 a operand Null dá Null. Úplný zoznam a priority sú na stránke Operátory.

OperátorPríkladVýsledokExcel
<< posun bitov doľava8 << 232BITLSHIFT(number, shift_amount)
>> posun bitov doprava32 >> 28BITRSHIFT(number, shift_amount)
& bitové AND3 & 11BITAND(number1, number2)
| bitové OR2 | 13BITOR(number1, number2)
^ bitové XOR5 ^ 14BITXOR(number1, number2)

Bitové operátory viažu slabšie ako porovnania: a & 1 > 0 znamená a & (1 > 0). Vždy používajte zátvorky.

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

Príklad bitových operácií nájdete v Google Sheets, prípadne si ich vyskúšajte v interaktívnom nástroji bitwisecmd.com.