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.

Ez a fejezet elsőre száraznak tűnhet, pedig három nagyon gyakorlatias okból kell:

  1. 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;
  2. a diagnosztikai és kommunikációs adatokat — hibakódokat, Modbus-regisztereket — jellemzően hexadecimálisan dokumentálják;
  3. 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#
📗 Miért éppen ezek?

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.

💡 A nyolc bit helyiértékei

É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

⚠️ Gyakori fordítási hiba

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

⚠️ Konverzió lefelé: adatvesztés

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.

💡 Miért aszimmetrikus a tartomány?

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

💡 Gyors ellenőrzés a vizsgán

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

📗 BCD (Binary Coded Decimal)

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#F bitminta 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

⚠️ A klasszikus csapda — ez vizsgakérdés és üzemi hibaforrás is

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-ben más a függvények neve

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 BCD bitkiosztása gyártófüggő

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

📗 Lebegőpontos ábrázolás

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 LREAL data type depends on the target device in use” — a 64 bites LREAL fordításkor 32 bites REAL-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 leggyakoribb kezdő buktató: `0.1 + 0.2 ≠ 0.3`

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)
💡 Előretekintés a 18. fejezetre

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

🛠️ 4.1. feladat — Átváltások

Végezd el az alábbi átváltásokat, és mindegyiknél írd le a módszert is!

  1. 2#1100 1010 → decimális és hexadecimális
  2. 200 → bináris és hexadecimális
  3. 16#3E8 → decimális és bináris
  4. 8#175 → decimális és bináris
  5. 2#1111 1111 1111 1111 → decimális WORD-ként, majd decimális INT-ként
🛠️ 4.2. feladat — Előjeles számok
  1. Írd le −100 értékét INT típusban, lépésről lépésre (tagadás + 1), és add meg hexadecimálisan!
  2. Egy INT változó értéke 16#8000. Mennyi ez decimálisan? Miért ez a legkisebb ábrázolható érték?
  3. Egy diagnosztikai kijelzőn 16#FFFB látható. WORD-ként és INT-ként értelmezve mennyi ez?
🛠️ 4.3. feladat — BCD és lebegőpont
  1. 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?
  2. Miért érvénytelen BCD-ként a 16#1A5 érték?
  3. Egy program a IF rHomerseklet = 25.0 THEN felté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

  1. Miért terjedt el a hexadecimális számrendszer a műszaki dokumentációban?
  2. Írd le a decimális → bináris átváltás módszerét, és mutasd be egy példán!
  3. Hány bitet ír le egy hexadecimális, illetve egy oktális jegy?
  4. Hogyan jelöljük az IEC 61131-3 szerint a bináris, oktális és hexadecimális literálokat?
  5. Mire jó az aláhúzásjel a literálokban? Befolyásolja-e az értéket?
  6. Hány bit egy bájt, egy szó és egy duplaszó?
  7. Mennyi a WORD és mennyi az INT értékkészlete? Miért különböznek, ha mindkettő 16 bites?
  8. Írd le a kettes komplemens képzésének két lépését!
  9. Melyik bit az előjelbit 16, illetve 32 bites értéknél?
  10. Mi a BCD lényege, és mikor érvénytelen egy BCD-jegy?
  11. Ugyanaz a bitminta miért jelenthet különböző értéket BCD-ként és binárisként?
  12. 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


  1. CODESYS Online Help: Integer data types. CODESYS GmbH, V3.5.22.0. (2026-07-29) ↩↩

  2. CODESYS Online Help: Data Type: REAL, LREAL. CODESYS GmbH, V3.5.22.0. (2026-07-29) ↩↩↩

  3. CODESYS Online Help: Constant — Typed Literal. CODESYS GmbH, V3.5.22.0. (2026-07-29) ↩

  4. CODESYS Online Help: Data Types. CODESYS GmbH, V3.5.22.0. (2026-07-29) ↩↩

  5. Fernhill Software: Numeric Literals (IEC 61131-3). (2026-07-29) ↩↩↩↩

  6. Fernhill Software: BCD_TO (IEC 61131-3 Function) — Convert BCD to Integer. (2026-07-29) ↩↩↩

  7. Siemens AG: Statement List (STL) for S7-300 and S7-400 Programming. Reference Manual, 05/2010. (2026-07-29) ↩↩↩↩↩

  8. CODESYS Util Library Documentation. CODESYS GmbH, v3.5.22.0. (2026-07-29) ↩

Mennyire volt hasznos ez a fejezet?

Még nincs értékelés.