TapHome

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 numberBitybit / startBitindex bajtuVýsledek GETBITS, SETBIT, SETBITS, SETBYTE
int8, uint880 – 70uint
int16, uint16160 – 150 – 1uint
int64, uint64640 – 630 – 7uint64
vše ostatní (double, float, int, uint, …)320 – 310 – 3uint
  • MODBUSR, číselné literály, PARSEJSON a hodnoty zařízení jsou double, 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ěnnou uint16: GETBIT - bit must be between 0 and 15. Bitové pole, které začíná uvnitř typu, ale přesahuje jeho horní hranici, je povoleno — GETBITS vrátí bity, které existují, a SETBITS zbytek zahodí.
  • double nebo float se 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že GETBITS(-1, 0, 16) je 65535.

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.

1
GETBIT(number, bit)

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.

1
GETBITS(number, startBit, numberOfBits)

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: 15

Datum 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).

1
SETBIT(number, bit, 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.

1
SETBITS(number, startBit, numberOfBits, value)

Pří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., 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.

1
GETBYTE(number, index)

Příklad

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

SETBYTE

SETBYTE vrátí číslo, v němž je bajt na pozici index nahrazen hodnotou value (0 – 255).

1
SETBYTE(number, index, value)

Pří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 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.

1
TOBCD(number)

Příklad

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

FROMBCD

FROMBCD převede pakovanou hodnotu BCD zpět na běžné číslo.

1
FROMBCD(number)

Příklad

FROMBCD(0x1234);
# Result: 1234

Chyby — 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átorPříkladVýsledekExcel
<< bitový posun vlevo8 << 232BITLSHIFT(number, shift_amount)
>> bitový posun vpravo32 >> 28BITRSHIFT(number, shift_amount)
& bitové AND3 & 11BITAND(number1, number2)
| bitové OR2 | 13BITOR(number1, number2)
^ bitový XOR5 ^ 14BITXOR(number1, number2)

Bitové operátory váží volněji než porovnání: a & 1 > 0 znamená 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.