Bináris, hexadecimális, BCD, kettes komplemens és lebegőpont — amire a vizsgán és a hibakeresésnél tényleg szükséged lesz.
- 4.1 Helyiértékes számrendszerek
- 4.2 Átváltás a számrendszerek között
- 4.3 A literálok írásmódja az IEC 61131-3 szerint
- 4.4 Bit, bájt, szó: a memória szervezése
- 4.5 Egész típusok értékkészlete
- 4.6 Előjeles számok: a kettes komplemens
- 4.7 BCD: binárisan kódolt decimális
- 4.8 Lebegőpontos számok:
REALésLREAL - 4.9 Ahol ezt használni fogod
- Gyakorlatok
- Összefoglalás
- Ellenőrző kérdések
- Tudáspróba
- A fejezet forrásai
Ez a fejezet elsőre száraznak tűnhet, pedig három nagyon gyakorlatias okból kell:
- a PLC memóriája bitekben, bájtokban és szavakban van címezve, tehát a változó típusa dönti el, mennyi helyet foglal és milyen értékeket vehet fel;
- a diagnosztikai és kommunikációs adatokat — hibakódokat, Modbus-regisztereket — jellemzően hexadecimálisan dokumentálják;
- régebbi kezelőszervek (BCD-kapcsolók, kijelzők) és egyes ipari protokollok BCD formátumban adják az adatot.
Az írásbeli vizsgán a „Számrendszerek közötti átváltás” önálló témakör, a teszt kérdéseinek 10%-a. A fejezet minden számpéldája gépi ellenőrzéssel készült.
4.1 Helyiértékes számrendszerek
Egy b alapú számrendszerben a jegyek helyiértéke b hatványa. Az aₙ … a₁ a₀ jegysorozat
értéke: Σ aᵢ · bⁱ.
| Számrendszer | Alap | Jegyek | IEC-előtag |
|---|---|---|---|
| bináris (kettes) | 2 | 0, 1 | 2# |
| oktális (nyolcas) | 8 | 0–7 | 8# |
| decimális (tízes) | 10 | 0–9 | (nincs) |
| hexadecimális (tizenhatos) | 16 | 0–9, A–F | 16# |
A számítógép kettes számrendszerben dolgozik, mert egy áramkör két állapotot tud megbízhatóan megkülönböztetni. A hexadecimális azért terjedt el, mert egyetlen jegye pontosan négy bitet ír le — így egy 16 bites szó négy, egy 8 bites bájt két hexadecimális jeggyel leírható. A BCD pedig azért létezik, mert az ember tízes számrendszerben gondolkodik.
4.2 Átváltás a számrendszerek között
Decimálisból binárisba: ismételt osztás
Osszuk a számot 2-vel, jegyezzük fel a maradékot, és folytassuk a hányadossal. A maradékokat visszafelé olvasva kapjuk az eredményt.
Példa: 183 átváltása binárisba.
| Osztás | Hányados | Maradék |
|---|---|---|
| 183 : 2 | 91 | 1 |
| 91 : 2 | 45 | 1 |
| 45 : 2 | 22 | 1 |
| 22 : 2 | 11 | 0 |
| 11 : 2 | 5 | 1 |
| 5 : 2 | 2 | 1 |
| 2 : 2 | 1 | 0 |
| 1 : 2 | 0 | 1 |
Visszafelé olvasva: 2#1011 0111 — ellenőrzés: 128 + 32 + 16 + 4 + 2 + 1 = 183. ✔
Binárisból decimálisba: helyiértékek összege
2#1101 1010 = 128 + 64 + 0 + 16 + 8 + 0 + 2 + 0 = 218.
Érdemes fejből tudni: 128 – 64 – 32 – 16 – 8 – 4 – 2 – 1. Ezzel bármelyik bájt fejben átváltható, és a vizsgán ez a leggyorsabb módszer.
Bináris ↔ hexadecimális: csak csoportosítás
Ez a leggyakoribb vizsgafeladat, és soha nem igényel osztást — csak négyes bitcsoportokra bontást (jobbról kezdve):
2#1011 0111 → 1011 = B, 0111 = 7 → 16#B7
Visszafelé ugyanígy: 16#2F3 → 2 = 0010, F = 1111, 3 = 0011 →
2#0010 1111 0011 = 755.
| Hexa | Bináris | Decimális |
|---|---|---|
| 0–9 | 0000–1001 | 0–9 |
| A | 1010 | 10 |
| B | 1011 | 11 |
| C | 1100 | 12 |
| D | 1101 | 13 |
| E | 1110 | 14 |
| F | 1111 | 15 |
Bináris ↔ oktális: hármas csoportok
Ugyanez a módszer, csak három bitenként: 2#101 010 101 → 5 2 5 → 8#525.
4.3 A literálok írásmódja az IEC 61131-3 szerint
A szabvány pontosan meghatározza, hogyan írjuk le a különböző alapú számokat a programban:5
„A prefix of 2#, 8#, or 16# is used to signify binary, octal or hexadecimal integers. For example: 2#1010101 is the binary representation of 85, 8#707 is the octal representation of 455, and 16#FFFF is the hexadecimal representation of 65535.”
(Mindhárom érték gépi ellenőrzéssel igazolva.)
Számjegy-elválasztó. Az aláhúzásjel a jegyek csoportosítására használható: „The underscore
(_) character can be used to separate digits. For example: 1_000_000”.5 Ez nem
befolyásolja az értéket, viszont sokat javít az olvashatóságon: WORD#2#10_1010_1010.
Típusos literál. A <típus>#<érték> alak adja meg a literál típusát, például
diVar := DINT#34;.3 A típus- és az alap-előtag kombinálható:5
„An integer can have both a type prefix and a radix prefix. For example: SINT#16#7F WORD#2#10_1010_1010.”
(Ellenőrzés: 16#7F = 127, ami pontosan a SINT felső határa; 2#1010101010 = 682.)
Valós literál. „A real number is declared when a period (.) character, or an exponent, is included. An exponent starts with either a latin capital letter E or a latin small letter e character. For example: 1.0 5E3 +1.0e-12.”5
Ha egy WORD típusú változónak 16# előtag nélkül adsz meg hexadecimálisnak szánt értéket,
a fordító decimálisként értelmezi. A wReg := 1492; és a wReg := 16#1492; két teljesen
különböző értéket ad — a másodikban 5266 lesz a változó értéke.
4.4 Bit, bájt, szó: a memória szervezése
| Egység | Bitszám | IEC-típus (előjel nélküli) |
|---|---|---|
| bit | 1 | BOOL, BIT |
| bájt (byte) | 8 | BYTE |
| szó (word) | 16 | WORD |
| duplaszó (double word) | 32 | DWORD |
| hosszú szó (long word) | 64 | LWORD |
A CODESYS elemi adattípusai: BOOL, BIT, BYTE, WORD, DWORD, LWORD, SINT, USINT, INT, UINT,
DINT, UDINT, LINT, ULINT, REAL, LREAL, TIME, LTIME, DATE, TOD, DT, STRING, WSTRING és
társaik.4 A súgó megállapítása: „The size of the variable is determined by its data
type”, és „The data type also determines which operators are allowed”.4
4.5 Egész típusok értékkészlete
Az alábbi táblázat a gyártói dokumentációból származik:1
| Típus | Alsó határ | Felső határ | Méret |
|---|---|---|---|
BYTE |
0 | 255 | 8 bit |
WORD |
0 | 65 535 | 16 bit |
DWORD |
0 | 4 294 967 295 | 32 bit |
LWORD |
0 | 2⁶⁴ − 1 | 64 bit |
SINT |
−128 | 127 | 8 bit |
USINT |
0 | 255 | 8 bit |
INT |
−32 768 | 32 767 | 16 bit |
UINT |
0 | 65 535 | 16 bit |
DINT |
−2 147 483 648 | 2 147 483 647 | 32 bit |
UDINT |
0 | 4 294 967 295 | 32 bit |
LINT |
−2⁶³ | 2⁶³ − 1 | 64 bit |
ULINT |
0 | 2⁶⁴ − 1 | 64 bit |
Az összefüggés: az előjel nélküli típusok tartománya 0 … 2ⁿ − 1, az előjeleseké
−2⁽ⁿ⁻¹⁾ … 2⁽ⁿ⁻¹⁾ − 1. (Gépi ellenőrzés: 2¹⁵ = 32 768, 2³¹ = 2 147 483 648.)
A gyártói súgó figyelmeztetése: „Information can be lost when converting from larger data
types to smaller data types.”1 Ha egy DINT értéket INT-be teszel, és az érték nem
fér bele, az eredmény hibás lesz — jellemzően csendben, hibaüzenet nélkül.
Az INT −32 768-tól +32 767-ig terjed: eggyel több negatív érték van, mint pozitív. Ez nem
elírás. A nulla is elfoglal egy kódot a pozitív oldalról, és ez a kettes komplemens
ábrázolás következménye — lásd a következő pontot.
4.6 Előjeles számok: a kettes komplemens
Hogyan tárolunk negatív számot, ha a memóriában csak nullák és egyesek vannak? A válasz a kettes komplemens, amelynek képzését a Siemens STL-referencia így írja le:7
„Forming the twos complement inverts the value bit by bit, that is, zeros replace ones and ones replace zeros; then a '1' is added. … The twos complement instruction is equivalent to multiplication by '−1.'”
Az egyes komplemens ennek az első fele: csak a bitenkénti tagadás.7
Az előjelbit: 16 bites értéknél a bit 15, 32 bitesnél a bit 31 — 0 = pozitív, 1 = negatív.7
Kidolgozott példa: −25 ábrázolása INT típusban
| Lépés | Bitminta |
|---|---|
| 1. A 25 binárisan | 0000 0000 0001 1001 |
| 2. Bitenkénti tagadás | 1111 1111 1110 0110 |
| 3. Hozzáadunk 1-et | 1111 1111 1110 0111 |
| Eredmény hexadecimálisan | 16#FFE7 |
Ellenőrzés: 16#FFE7 előjel nélkül 65 511; ebből 65 536-ot levonva −25. ✔
(Gépi ellenőrzéssel igazolva.)
Ha egy 16 bites hexadecimális szám 8-cal vagy annál nagyobb jeggyel kezdődik
(8, 9, A, B, C, D, E, F), akkor a legfelső bitje 1 — tehát INT-ként értelmezve negatív
szám. A 16#FFE7 tehát biztosan negatív, a 16#7FFF pedig biztosan pozitív.
4.7 BCD: binárisan kódolt decimális
A BCD minden decimális jegyet önálló négybites csoportban (nibble, félbájt) tárol. Így a
0347 decimális szám BCD-ben 0000 0011 0100 0111 bitmintát kap — vagyis a bitminta
„ránézésre” a decimális számot mutatja.
A gyártói dokumentáció fontos korlátokat is megad:7
- Érvénytelen jegy: „If a decimal (4 bits) of the BCD number is in the invalid range of
10 to 15, a BCDF error occurs” — a
16#A–16#Fbitminta BCD-ként érvénytelen. Siemens környezetben ilyenkor a CPU STOP állapotba megy, hacsak nincs saját hibakezelés. - Háromjegyű BCD (16 bites szó, bit 0–11 az érték, bit 15 az előjel): a megengedett tartomány −999 … +999.
- Hétjegyű BCD (32 bites duplaszó): −9 999 999 … +9 999 999.
Az IEC 61131-3 szabványos átváltó függvényei: BYTE_BCD_TO_SINT, WORD_BCD_TO_INT,
DWORD_BCD_TO_DINT, LWORD_BCD_TO_LINT.6 A dokumentált példa szerint
WORD_BCD_TO_INT(16#1492) visszatérési értéke 1492, és „The bit pattern
0001 0100 1001 0010 is converted to 0000 0101 1101 0100”.6
Ugyanaz a 16 bites bitminta kétféleképpen olvasható:
| Bitminta | BCD-ként | Sima binárisként |
|---|---|---|
0001 0100 1001 0010 |
1492 | 5266 (16#1492) |
Vagyis a 16#1492 „úgy néz ki”, mint 1492, de bináris egészként 5266-ot jelent. Ezért
mindig tudnod kell, milyen formátumban érkezik az adat. (Gépi ellenőrzéssel igazolva:
16#1492 = 5266, és 1492 = 16#5D4.)
A CODESYS a BCD-átváltó függvényeket a Util könyvtárban kínálja, és más névkonvencióval:
BCD_TO_BYTE, BCD_TO_WORD, BCD_TO_DWORD, BCD_TO_INT, illetve BYTE_TO_BCD,
WORD_TO_BCD, DWORD_TO_BCD, INT_TO_BCD.8 Ugyanez a könyvtár Gray-kód átváltást is
tartalmaz, ami inkrementális jeladóknál lehet hasznos.
A Siemens-féle háromjegyű BCD előjeles (bit 15 az előjel, ezért ±999 a tartomány),7 az IEC-példa viszont négy BCD-jegyet dolgoz fel előjel nélkül (0–9999).6 A pontos kiosztás tehát gyártó- és függvényspecifikus — mindig az adott eszköz dokumentációját kell követni.
4.8 Lebegőpontos számok: REAL és LREAL
A REAL és az LREAL „floating-point types according to IEEE 754”.2 A szám előjelre,
kitevőre és mantisszára bontva tárolódik — így nagyon nagy és nagyon kicsi értékek is
kezelhetők, de véges pontossággal.
| Típus | Legkisebb érték | Legnagyobb érték | Méret |
|---|---|---|---|
REAL |
1.0E−44 | 3.402823E+38 | 32 bit |
LREAL |
4.94065645841247E−324 | 1.7976931348623157E+308 | 64 bit |
Forrás: gyártói dokumentáció.2
Két fontos figyelmeztetés a gyártótól:2
- „Support for the
LREALdata type depends on the target device in use” — a 64 bitesLREALfordításkor 32 bitesREAL-lá konvertálódhat, információveszteséggel; - a lebegőpontos érték egész típusra váltása az egész értékkészletén kívül definiálatlan, célrendszer-függő eredményt ad, ezért az alkalmazásnak magának kell hibakezelést végeznie.
A 0,1 nem ábrázolható pontosan 32 bites lebegőpontos számként: a ténylegesen tárolt érték
0,10000000149011612. Emiatt a 0.1 + 0.2 = 0.3 egyenlőség-vizsgálat hamis eredményt ad.
(Gépi ellenőrzéssel igazolva.)
A könyv szabálya: lebegőpontos értékeket soha ne = operátorral hasonlíts össze, hanem
tűrésmezővel:
IF ABS(rMert - rAlapjel) < 0.01 THEN ...
A REAL felbontása mintegy 7 értékes tizedesjegy, az LREAL-é kb. 15–16. (Ezt a gyártói súgó
nem adja meg számszerűen; a könyv az IEEE 754 formátumból vezeti le.)
4.9 Ahol ezt használni fogod
| Fogalom | Hol tér vissza? |
|---|---|
| hexadecimális írásmód | 20. fejezet (Modbus-funkciókódok), 21. fejezet (regisztercímek) |
| bit/bájt/szó | 10. fejezet (változók), 20. fejezet (regiszterek) |
| értékkészletek, konverzió | 10. fejezet, 18. fejezet (PV típusa: WORD vs. INT) |
| kettes komplemens | 23. fejezet (negatív értékek a monitorozásban) |
| BCD | régi kezelőszervek, egyes protokollok |
| lebegőpont | analóg értékek skálázása, 7. fejezet (felbontás) |
A CODESYS számlálóinál a PV (beállított érték) típusa WORD, miközben a szabvány INT-et
ír elő — és ezt a gyártó maga jelzi. Ez pontosan az itt tanult különbség: WORD = 0…65 535
előjel nélkül, INT = −32 768…32 767 előjellel. Emiatt kell néha típusátváltás.
Gyakorlatok
Végezd el az alábbi átváltásokat, és mindegyiknél írd le a módszert is!
2#1100 1010→ decimális és hexadecimális- 200 → bináris és hexadecimális
16#3E8→ decimális és bináris8#175→ decimális és bináris2#1111 1111 1111 1111→ decimálisWORD-ként, majd decimálisINT-ként
- Írd le −100 értékét
INTtípusban, lépésről lépésre (tagadás + 1), és add meg hexadecimálisan! - Egy
INTváltozó értéke16#8000. Mennyi ez decimálisan? Miért ez a legkisebb ábrázolható érték? - Egy diagnosztikai kijelzőn
16#FFFBlátható.WORD-ként ésINT-ként értelmezve mennyi ez?
- Egy BCD-kapcsoló
16#0275értéket ad. Mennyi a beállított decimális szám? Mennyi lenne ugyanez a bitminta sima bináris egészként? - Miért érvénytelen BCD-ként a
16#1A5érték? - Egy program a
IF rHomerseklet = 25.0 THENfeltétellel dolgozik, és soha nem lép be, pedig a mért érték 25 °C körül van. Mi a hiba, és hogyan javítanád?
Összefoglalás
A PLC-programozáshoz három számrendszert kell ismerned: a bináris a gép nyelve, a hexadecimális a dokumentáció nyelve (egy jegy = négy bit), a BCD pedig a kezelőszervek és egyes protokollok formátuma. A bináris és a hexadecimális közötti átváltás csak csoportosítás, nem igényel osztást.
Az IEC 61131-3 szabvány pontosan rögzíti a literálok írásmódját: 2#, 8#, 16# alap-
előtag, aláhúzás jegyelválasztóként, <típus>#<érték> típusos literál, és a kettő
kombinálható.
Az egész típusok értékkészlete az előjel nélkülieknél 0 … 2ⁿ − 1, az előjeleseknél
−2⁽ⁿ⁻¹⁾ … 2⁽ⁿ⁻¹⁾ − 1. Az aszimmetria a kettes komplemens következménye, amelynek képzése:
bitenkénti tagadás, majd hozzáadunk 1-et — ez egyenértékű a −1-gyel való szorzással.
A BCD minden decimális jegyet négy biten tárol; a 10–15 értékű négyes csoport érvénytelen. Ugyanaz a bitminta BCD-ként és bináris egészként különböző értéket jelent — ez a fejezet legfontosabb gyakorlati tanulsága.
A REAL és az LREAL IEEE 754 szerinti lebegőpontos típus. A 0,1 nem ábrázolható pontosan,
ezért lebegőpontos értékeket soha nem hasonlítunk = operátorral, hanem tűréssel.
Ellenőrző kérdések
- Miért terjedt el a hexadecimális számrendszer a műszaki dokumentációban?
- Írd le a decimális → bináris átváltás módszerét, és mutasd be egy példán!
- Hány bitet ír le egy hexadecimális, illetve egy oktális jegy?
- Hogyan jelöljük az IEC 61131-3 szerint a bináris, oktális és hexadecimális literálokat?
- Mire jó az aláhúzásjel a literálokban? Befolyásolja-e az értéket?
- Hány bit egy bájt, egy szó és egy duplaszó?
- Mennyi a
WORDés mennyi azINTértékkészlete? Miért különböznek, ha mindkettő 16 bites? - Írd le a kettes komplemens képzésének két lépését!
- Melyik bit az előjelbit 16, illetve 32 bites értéknél?
- Mi a BCD lényege, és mikor érvénytelen egy BCD-jegy?
- Ugyanaz a bitminta miért jelenthet különböző értéket BCD-ként és binárisként?
- Miért nem szabad lebegőpontos értéket
=operátorral összehasonlítani? Mit használj helyette?
Tudáspróba
Válaszd ki az egyetlen helyes választ!
1. 2#1101 0110 decimális értéke:
a) 198
b) 214
c) 218
d) 230
2. 183 hexadecimális alakja:
a) 16#A7
b) 16#B7
c) 16#C3
d) 16#D1
3. Egy hexadecimális jegy hány bitet ír le? a) 2 b) 3 c) 4 d) 8
4. Az IEC 61131-3 szerint a bináris literál előtagja:
a) 2#
b) 0b
c) BIN#
d) #2
5. A WORD típus értékkészlete:
a) −32 768 … 32 767
b) −128 … 127
c) 0 … 255
d) 0 … 65 535
6. Miért aszimmetrikus az INT értékkészlete (−32 768 … +32 767)?
a) mert a nulla is kódot foglal, és ez a kettes komplemens következménye;
b) mert a szabvány így írja elő, indoklás nélkül;
c) mert a legfelső bit használhatatlan;
d) mert a fordító egy értéket fenntart magának.
7. A kettes komplemens képzése: a) bitenkénti tagadás; b) az érték kettővel való osztása; c) bitenkénti tagadás, majd hozzáadunk 1-et; d) az előjelbit átbillentése.
8. A 16#FFE7 érték INT-ként értelmezve:
a) 65 511
b) 25
c) −41
d) −25
9. BCD-ben érvénytelen az a négybites csoport, amelynek értéke: a) 10–15 b) 8–9 c) 0–9 d) 0–7
10. A 0001 0100 1001 0010 bitminta sima bináris egészként:
a) 1492
b) 5266
c) 1024
d) 4096
11. Melyik állítás igaz a REAL típusra?
a) minden tizedes törtet pontosan ábrázol;
b) Csak egész számokat tárol;
c) IEEE 754 szerinti lebegőpontos típus, véges pontossággal;
d) 64 bites minden célrendszeren.
12. Hogyan hasonlítunk össze két lebegőpontos értéket?
a) = operátorral;
b) karakterlánccá alakítva;
c) egész típusra konvertálva;
d) tűrésmezővel, például ABS(a − b) < eps.
A megoldókulcs a B függelékben található.
A fejezet forrásai
-
CODESYS Online Help: Integer data types. CODESYS GmbH, V3.5.22.0. (2026-07-29) ↩↩
-
CODESYS Online Help: Data Type: REAL, LREAL. CODESYS GmbH, V3.5.22.0. (2026-07-29) ↩↩↩
-
CODESYS Online Help: Constant — Typed Literal. CODESYS GmbH, V3.5.22.0. (2026-07-29) ↩
-
CODESYS Online Help: Data Types. CODESYS GmbH, V3.5.22.0. (2026-07-29) ↩↩
-
Fernhill Software: Numeric Literals (IEC 61131-3). (2026-07-29) ↩↩↩↩
-
Fernhill Software: BCD_TO (IEC 61131-3 Function) — Convert BCD to Integer. (2026-07-29) ↩↩↩
-
Siemens AG: Statement List (STL) for S7-300 and S7-400 Programming. Reference Manual, 05/2010. (2026-07-29) ↩↩↩↩↩
-
CODESYS Util Library Documentation. CODESYS GmbH, v3.5.22.0. (2026-07-29) ↩