Operacije s bitovima
Rad s bitovima i bajtovima u skripti TapHome — GETBIT, GETBITS, SETBIT, SETBITS, GETBYTE, SETBYTE, TOBCD, FROMBCD, širina u bitovima prema tipu i operatori nad bitovima s ekvivalentima u Excelu.
Ove funkcije čitaju i mijenjaju pojedinačne bitove, polja bitova i bajtove cijelog broja — obično statusne riječi i registre alarma očitane funkcijom MODBUSR. Bit 0 je najmanje značajan (krajnje desni) bit, a bajt 0 najmanje značajan bajt.
Širina u bitovima prema tipu
Koliko bitova broj ima za funkcije za bitove ovisi o njegovu tipu:
Tip parametra number | Bitovi | bit / startBit | index bajta | Rezultat funkcija 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 |
sve ostalo (double, float, int, uint, …) | 32 | 0 – 31 | 0 – 3 | uint |
MODBUSR, decimalni literali,PARSEJSONi vrijednosti uređaja sudouble, pa vrijede kao 32 bita. Drugu širinu imaju samo varijable s tipom, elementi zbirki i 64-bitni tipovi podataka Modbus.- Bit ili bajt izvan tipa je pogreška, na primjer
GETBIT(x, 16)za varijabluuint16: GETBIT - bit must be between 0 and 15. Polje bitova koje počinje unutar tipa, ali seže preko njegova vrha, dopušteno je —GETBITSvraća bitove koji postoje, aSETBITSostale odbacuje. doubleilifloatzaokružuje se na cijeli broj i mora biti između −2 147 483 648 i 4 294 967 295; sve ostalo, uključujućiNaN, pogreška je (value X is out of the 32-bit range). Negativne vrijednosti koriste dvojni komplement, pa jeGETBITS(-1, 0, 16)jednako65535.
Dostupno — širina prema tipu zahtijeva TapHome Next 2026.1.40665+. Stariji buildovi svaku vrijednost tretiraju kao 32 bita: 64-bitna vrijednost gubi gornju polovicu, a bit iznad 8-bitnog ili 16-bitnog tipa vraća 0.
GETBIT
GETBIT vraća vrijednost jednog bita broja, 0 ili 1.
| |
Primjer
GETBIT(2, 0);
# Result: 0
GETBIT(4, 2);
# Result: 1
IF(GETBIT(MODBUSR(H, 600, Uint16), 3) = 1, ADDERROR(3, "Overheating"));GETBITS
GETBITS vraća polje bitova — numberOfBits bitova počevši od startBit — kao cijeli broj bez predznaka.
| |
Parametri — numberOfBits je 1 – 32 ili 1 – 64 za 64-bitni number.
Primjer
GETBITS(216, 3, 2);
# Result: 3 (216 = 0b11011000, bits 3 and 4 are 1)
GETBITS(0xFF, 0, 4);
# Result: 15Datum i vrijeme zapakirani kao dva bajta po 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 vraća broj u kojem je jedan bit postavljen na 0 (kada je value 0) ili na 1 (bilo koja druga vrijednost value).
| |
Primjer
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 vraća broj u kojem je polje bitova od numberOfBits bitova počevši od startBit zamijenjeno vrijednošću value.
| |
Primjer
SETBITS(192, 4, 2, 3);
# Result: 240
SETBITS(192, 5, 2, 3);
# Result: 224Pogreške — Given number of bits (2) is not enought for storing the value 4. kada value ne stane u polje (poruka je napisana upravo ovako).
GETBYTE
GETBYTE vraća jedan bajt broja (0 – 255) kao uint.
| |
Primjer
GETBYTE(256, 0);
# Result: 0
GETBYTE(256, 1);
# Result: 1
GETBYTE(259, 0);
# Result: 3SETBYTE
SETBYTE vraća broj u kojem je bajt na položaju index zamijenjen vrijednošću value (0 – 255).
| |
Primjer
SETBYTE(256, 0, 255);
# Result: 511
SETBYTE(259, 1, 2);
# Result: 515Pogreške — Given value (X) is bigger than maximum byte value.; Given value is less than 0.
TOBCD
TOBCD pretvara cijeli broj u pakirani BCD — svaka decimalna znamenka u vlastita 4 bita — i vraća ga kao uint; zadržava se najviše 8 znamenki.
| |
Primjer
TOBCD(1234);
# Result: 4660 (0x1234)FROMBCD
FROMBCD pretvara pakiranu vrijednost BCD natrag u običan broj.
| |
Primjer
FROMBCD(0x1234);
# Result: 1234Pogreške — FROMBCD - number 26 is not in BCD format i položaj znamenke kada je skupina od 4 bita veća od 9 (ovdje 0x1A).
Operatori nad bitovima i ekvivalenti u Excelu
Operatori rade s cijelim brojevima; operand double najprije se pretvara u int64, a operand Null daje Null. Cijeli popis i prioriteti nalaze se na stranici Operatori.
| Operator | Primjer | Rezultat | Excel |
|---|---|---|---|
<< pomak bitova ulijevo | 8 << 2 | 32 | BITLSHIFT(number, shift_amount) |
>> pomak bitova udesno | 32 >> 2 | 8 | BITRSHIFT(number, shift_amount) |
& bitovni AND | 3 & 1 | 1 | BITAND(number1, number2) |
| bitovni OR | 2 | 1 | 3 | BITOR(number1, number2) |
^ bitovni XOR | 5 ^ 1 | 4 | BITXOR(number1, number2) |
Operatori nad bitovima vežu slabije od usporedbi:
a & 1 > 0značia & (1 > 0). Uvijek koristite zagrade.
VAR status := MODBUSR(H, 5, Uint16);
IF((status & 0x04) > 0, "Door open", "Door closed");Pogledajte primjer operacija s bitovima u Google Sheets ili isprobajte interaktivni alat na bitwisecmd.com.