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 number | Bity | bit / startBit | index bajtu | Výsledok 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 |
všetko ostatné (double, float, int, uint, …) | 32 | 0 – 31 | 0 – 3 | uint |
MODBUSR, desatinné literály,PARSEJSONa 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ú typuuint16: GETBIT - bit must be between 0 and 15. Bitové pole, ktoré začína vo vnútri typu, ale presahuje jeho horný okraj, je povolené —GETBITSvráti bity, ktoré existujú, aSETBITSostatné zahodí. doublealebofloatsa zaokrúhli na celé číslo a musí byť v rozsahu −2 147 483 648 až 4 294 967 295; čokoľvek iné, vrátaneNaN, je chyba (value X is out of the 32-bit range). Záporné hodnoty sa berú v dvojkovom doplnku, pretoGETBITS(-1, 0, 16)je65535.
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.
| |
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.
| |
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: 15Dá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).
| |
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.
| |
Príklad
SETBITS(192, 4, 2, 3);
# Result: 240
SETBITS(192, 5, 2, 3);
# Result: 224Chyby — 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.
| |
Príklad
GETBYTE(256, 0);
# Result: 0
GETBYTE(256, 1);
# Result: 1
GETBYTE(259, 0);
# Result: 3SETBYTE
SETBYTE vráti číslo, v ktorom je bajt na pozícii index nahradený hodnotou value (0 – 255).
| |
Príklad
SETBYTE(256, 0, 255);
# Result: 511
SETBYTE(259, 1, 2);
# Result: 515Chyby — 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.
| |
Príklad
TOBCD(1234);
# Result: 4660 (0x1234)FROMBCD
FROMBCD prevedie zabalenú hodnotu BCD späť na bežné číslo.
| |
Príklad
FROMBCD(0x1234);
# Result: 1234Chyby — 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átor | Príklad | Výsledok | Excel |
|---|---|---|---|
<< posun bitov doľava | 8 << 2 | 32 | BITLSHIFT(number, shift_amount) |
>> posun bitov doprava | 32 >> 2 | 8 | BITRSHIFT(number, shift_amount) |
& bitové AND | 3 & 1 | 1 | BITAND(number1, number2) |
| bitové OR | 2 | 1 | 3 | BITOR(number1, number2) |
^ bitové XOR | 5 ^ 1 | 4 | BITXOR(number1, number2) |
Bitové operátory viažu slabšie ako porovnania:
a & 1 > 0znamená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.