Bitműveletek
Bitek és bájtok kezelése a TapHome szkriptben — GETBIT, GETBITS, SETBIT, SETBITS, GETBYTE, SETBYTE, TOBCD, FROMBCD, bitszélesség típus szerint és bitenkénti operátorok Excel megfelelőkkel.
Ezek a függvények egy egész szám egyes bitjeit, bitmezőit és bájtjait olvassák és módosítják — jellemzően a MODBUSR függvénnyel olvasott állapotszavakat és riasztási regisztereket. A 0. bit a legkisebb helyiértékű (jobb szélső) bit, a 0. bájt a legkisebb helyiértékű bájt.
Bitszélesség típus szerint
Hogy egy szám hány bitből áll a bitfüggvények számára, az a típusától függ:
A number típusa | Bitek | bit / startBit | Bájt index | A GETBITS, SETBIT, SETBITS, SETBYTE eredménye |
|---|---|---|---|---|
int8, uint8 | 8 | 0 – 7 | 0 | uint |
int16, uint16 | 16 | 0 – 15 | 0 – 1 | uint |
int64, uint64 | 64 | 0 – 63 | 0 – 7 | uint64 |
minden más (double, float, int, uint, …) | 32 | 0 – 31 | 0 – 3 | uint |
- A
MODBUSR, a tizedes literálok, aPARSEJSONés az eszközök értékeidoubletípusúak, ezért 32 bitesnek számítanak. Más szélessége csak a típusos változóknak, a gyűjtemények elemeinek és a 64 bites Modbus adattípusoknak van. - A típuson kívül eső bit vagy bájt hibát okoz, például a
GETBIT(x, 16)egyuint16változónál: GETBIT - bit must be between 0 and 15. Az a bitmező, amely a típuson belül kezdődik, de túlnyúlik a tetején, megengedett — aGETBITSa létező biteket adja vissza, aSETBITSa többit elhagyja. - A
doublevagyfloategész számra kerekítődik, és −2 147 483 648 és 4 294 967 295 között kell lennie; minden más, aNaNis, hibát okoz (value X is out of the 32-bit range). A negatív értékek kettes komplemenst használnak, ezért aGETBITS(-1, 0, 16)értéke65535.
Elérhetőség — a típus szerinti szélességet a Core 2026.1 verziótól (build 40661) használja. A régebbi Core verziók, a korábbi 2026.1 buildeket is beleértve, minden értéket 32 bitesnek tekintenek: a 64 bites érték elveszíti a felső felét, a 8 vagy 16 bites típus feletti bit pedig 0 értéket ad.
GETBIT
A GETBIT egy szám egyetlen bitjének értékét adja vissza, 0 vagy 1.
| |
Példa
GETBIT(2, 0);
# Result: 0
GETBIT(4, 2);
# Result: 1
IF(GETBIT(MODBUSR(H, 600, Uint16), 3) = 1, ADDERROR(3, "Overheating"));GETBITS
A GETBITS egy bitmezőt — a startBit bittől kezdődő numberOfBits bitet — ad vissza előjel nélküli egész számként.
| |
Paraméterek — a numberOfBits értéke 1 – 32, 64 bites number esetén 1 – 64.
Példa
GETBITS(216, 3, 2);
# Result: 3 (216 = 0b11011000, bits 3 and 4 are 1)
GETBITS(0xFF, 0, 4);
# Result: 15Regiszterenként két bájtba csomagolt dátum és idő (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
A SETBIT a számot úgy adja vissza, hogy egyik bitje 0 (ha a value 0) vagy 1 (bármely más value esetén).
| |
Példa
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
A SETBITS a számot úgy adja vissza, hogy a startBit bittől kezdődő, numberOfBits bit hosszú bitmezőt a value értékre cseréli.
| |
Példa
SETBITS(192, 4, 2, 3);
# Result: 240
SETBITS(192, 5, 2, 3);
# Result: 224Hibák — Given number of bits (2) is not enought for storing the value 4., ha a value nem fér bele a mezőbe (az üzenet valóban így van írva).
GETBYTE
A GETBYTE egy szám egyik bájtját (0 – 255) adja vissza uint típusként.
| |
Példa
GETBYTE(256, 0);
# Result: 0
GETBYTE(256, 1);
# Result: 1
GETBYTE(259, 0);
# Result: 3SETBYTE
A SETBYTE a számot úgy adja vissza, hogy az index helyen álló bájtot a value értékre (0 – 255) cseréli.
| |
Példa
SETBYTE(256, 0, 255);
# Result: 511
SETBYTE(259, 1, 2);
# Result: 515Hibák — Given value (X) is bigger than maximum byte value.; Given value is less than 0.
TOBCD
A TOBCD egy egész számot tömörített BCD formátumra alakít — minden tízes számrendszerbeli számjegy saját 4 bitet kap —, és uint típusként adja vissza; legfeljebb 8 számjegyet őriz meg.
| |
Példa
TOBCD(1234);
# Result: 4660 (0x1234)FROMBCD
A FROMBCD egy tömörített BCD értéket alakít vissza közönséges számmá.
| |
Példa
FROMBCD(0x1234);
# Result: 1234Hibák — FROMBCD - number 26 is not in BCD format és a számjegy pozíciója, ha egy 4 bites csoport értéke nagyobb 9-nél (itt 0x1A).
Bitenkénti operátorok és Excel megfelelők
Az operátorok egész számokkal dolgoznak; a double operandus előbb int64 típusra alakul, a Null operandus pedig Null eredményt ad. A teljes lista és a precedencia az Operátorok oldalon található.
| Operátor | Példa | Eredmény | Excel |
|---|---|---|---|
<< bitléptetés balra | 8 << 2 | 32 | BITLSHIFT(number, shift_amount) |
>> bitléptetés jobbra | 32 >> 2 | 8 | BITRSHIFT(number, shift_amount) |
& bitenkénti ÉS | 3 & 1 | 1 | BITAND(number1, number2) |
| bitenkénti VAGY | 2 | 1 | 3 | BITOR(number1, number2) |
^ bitenkénti XOR | 5 ^ 1 | 4 | BITXOR(number1, number2) |
A bitenkénti operátorok gyengébben kötnek, mint az összehasonlítások: az
a & 1 > 0jelentésea & (1 > 0). Mindig használj zárójelet.
VAR status := MODBUSR(H, 5, Uint16);
IF((status & 0x04) > 0, "Door open", "Door closed");Nézd meg a bitműveletek példáját a Google Táblázatokban, vagy próbáld ki az interaktív eszközt: bitwisecmd.com.