Bitové operace
Práce s bity a bajty ve skriptu TapHome — GETBIT, GETBITS, SETBIT, SETBITS, GETBYTE, SETBYTE, TOBCD, FROMBCD, šířka v bitech podle typu a bitové operátory s ekvivalenty v Excelu.
Tyto funkce čtou a mění jednotlivé bity, bitová pole a bajty celého čísla — typicky stavová slova a registry alarmů přečtené pomocí MODBUSR. Bit 0 je nejméně významný (nejpravější) bit a bajt 0 nejméně významný bajt.
Šířka v bitech podle typu
Kolik bitů má číslo pro bitové funkce, závisí na jeho typu:
Typ number | Bity | bit / startBit | index bajtu | Výsledek 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še ostatní (double, float, int, uint, …) | 32 | 0 – 31 | 0 – 3 | uint |
MODBUSR, číselné literály,PARSEJSONa hodnoty zařízení jsoudouble, takže se počítají jako 32 bitů. Jinou šířku mají jen typované proměnné, prvky kolekcí a 64bitové datové typy Modbus.- Bit nebo bajt mimo typ je chyba, například
GETBIT(x, 16)pro proměnnouuint16: GETBIT - bit must be between 0 and 15. Bitové pole, které začíná uvnitř typu, ale přesahuje jeho horní hranici, je povoleno —GETBITSvrátí bity, které existují, aSETBITSzbytek zahodí. doublenebofloatse zaokrouhlí na celé číslo a musí být mezi −2 147 483 648 a 4 294 967 295; cokoli jiného, včetněNaN, je chyba (value X is out of the 32-bit range). Záporné hodnoty používají dvojkový doplněk, takžeGETBITS(-1, 0, 16)je65535.
Dostupnost — šířka podle typu se používá od Core 2026.1, sestavení 40661. Starší Core, včetně dřívějších sestavení 2026.1, považují každou hodnotu za 32bitovou: 64bitová hodnota ztratí horní polovinu a bit nad 8bitovým nebo 16bitovým typem vrátí 0.
GETBIT
GETBIT vrátí hodnotu jednoho bitu čísla, 0 nebo 1.
| |
Pří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átí bitové pole — numberOfBits bitů od startBit — jako celé číslo bez znaménka.
| |
Parametry — numberOfBits je 1 – 32, nebo 1 – 64 pro 64bitové number.
Příklad
GETBITS(216, 3, 2);
# Result: 3 (216 = 0b11011000, bits 3 and 4 are 1)
GETBITS(0xFF, 0, 4);
# Result: 15Datum a čas uložené po dvou bajtech v registru (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átí číslo s jedním bitem nastaveným na 0 (když je value 0) nebo na 1 (jakákoli jiná value).
| |
Pří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átí číslo, v němž je bitové pole o numberOfBits bitech od startBit nahrazeno hodnotou value.
| |
Pří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., když se value do pole nevejde (hlášení je napsáno právě takto).
GETBYTE
GETBYTE vrátí jeden bajt čísla (0 – 255) jako uint.
| |
Příklad
GETBYTE(256, 0);
# Result: 0
GETBYTE(256, 1);
# Result: 1
GETBYTE(259, 0);
# Result: 3SETBYTE
SETBYTE vrátí číslo, v němž je bajt na pozici index nahrazen hodnotou value (0 – 255).
| |
Pří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 převede celé číslo na pakovaný BCD — každou desítkovou číslici do vlastních 4 bitů — a vrátí ho jako uint; zachová se až 8 číslic.
| |
Příklad
TOBCD(1234);
# Result: 4660 (0x1234)FROMBCD
FROMBCD převede pakovanou hodnotu BCD zpět na běžné číslo.
| |
Příklad
FROMBCD(0x1234);
# Result: 1234Chyby — FROMBCD - number 26 is not in BCD format a pozice číslice, když je skupina 4 bitů větší než 9 (zde 0x1A).
Bitové operátory a ekvivalenty v Excelu
Operátory pracují s celými čísly; operand double se nejprve převede na int64 a operand Null dá Null. Úplný seznam a priority jsou na stránce Operátory.
| Operátor | Příklad | Výsledek | Excel |
|---|---|---|---|
<< bitový posun vlevo | 8 << 2 | 32 | BITLSHIFT(number, shift_amount) |
>> bitový posun vpravo | 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 váží volněji než porovnání:
a & 1 > 0znamenáa & (1 > 0). Vždy používejte závorky.
VAR status := MODBUSR(H, 5, Uint16);
IF((status & 0x04) > 0, "Door open", "Door closed");Příklad bitových operací v Google Sheets, nebo vyzkoušejte interaktivní nástroj na bitwisecmd.com.