16 Bit Register’dan 32 Bit Float Okurken Word Swap ve Byte Swap Nasıl Anlaşılır?

📅 02 Eylül 2026⏱️ 12 dk okuma
Torna Seti Karşıt Sabit Punta Dahil
📑 İçindekiler (Tıkla Aç)

16 bit register’dan 32 bit float okurken Word Swap ve Byte Swap durumlarını anlamak için, okunan ham hexadecimal veriyi bilinen bir float değeriyle karşılaştırmak, endianness farklarını analiz etmek ve olası tüm swap kombinasyonlarını sistematik olarak denemek gerekir. Özellikle IEEE 754 float standardı ve hedef sistemin endianness yapısı kritik öneme sahiptir.

16 Bit Register’dan 32 Bit Float Okurken Word Swap ve Byte Swap Nasıl Anlaşılır? Nedir?

 

Endüstriyel otomasyon sistemlerinde, özellikle PLC’ler (Programlanabilir Mantık Denetleyicileri) veya DCS’ler (Dağıtılmış Kontrol Sistemleri) gibi cihazlardan veri okurken sıkça karşılaşılan bir durum, 32 bitlik kayan noktalı (float) bir sayının, 16 bitlik register’lar halinde saklanmasıdır. Bir 32 bit float değeri, bellekte 4 adet 8 bitlik bayt (byte) yer kaplar. Ancak birçok endüstriyel haberleşme protokolü (örneğin Modbus), veriyi 16 bitlik “kelimeler” (words) halinde adresler ve iletir. Bu durumda, 32 bitlik bir float değeri iki adet 16 bitlik register’a bölünerek saklanır. Bu bölünme ve aktarım sırasında, verinin doğru şekilde birleştirilebilmesi için endianness (bayt sıralaması) ve word ordering (kelime sıralaması) kurallarının doğru anlaşılması hayati önem taşır. Aksi takdirde, okunan float değeri anlamsız veya yanlış olacaktır. İşte bu noktada Word Swap (kelime değişimi) ve Byte Swap (bayt değişimi) kavramları devreye girer.

Endianness, çok baytlı bir verinin (örneğin 16 bitlik bir kelime veya 32 bitlik bir float) bellekte veya iletişim hattında baytlarının hangi sırayla depolandığını veya iletildiğini ifade eder. İki ana türü vardır:

  • Little-Endian (LE): En az anlamlı bayt (LSB) önce gelir. Örneğin, 0x12345678 değeri bellekte 78 56 34 12 şeklinde saklanır.
  • Big-Endian (BE): En çok anlamlı bayt (MSB) önce gelir. Aynı 0x12345678 değeri bellekte 12 34 56 78 şeklinde saklanır.

Bir 32 bit float değeri, iki adet 16 bitlik register’a bölündüğünde, hem bu iki 16 bitlik kelimenin kendi arasındaki sıralaması (Word Endianness), hem de her bir 16 bitlik kelimenin içindeki 8 bitlik baytların sıralaması (Byte Endianness) sorun yaratabilir. Bu farklı sıralamalar, okunan verinin hedef sistemde doğru bir 32 bit float olarak yorumlanabilmesi için düzeltme işlemleri, yani swap işlemleri gerektirebilir.

Çalışma Prensibi ve Teknik Veriler

Bir 32 bitlik kayan noktalı sayı, genellikle IEEE 754 standardına göre temsil edilir. Bu standart, sayının işaretini, üssünü (exponent) ve mantisini (mantissa) belirli bit pozisyonlarında saklar. Örneğin, pozitif bir float değeri olan 123.45‘in IEEE 754 32-bit gösterimi hexadecimal olarak 0x42F6E666‘dır (Big-Endian gösterimi). Bu değerin baytları sırasıyla 42 F6 E6 66‘dır.

Şimdi bu 32 bitlik değeri, iki adet 16 bitlik register’a nasıl bölündüğüne ve farklı swap senaryolarına bakalım:

Bir 32 bitlik değeri `ABCD` olarak düşünelim, burada `A` en anlamlı bayt (MSB) ve `D` en az anlamlı bayt (LSB) olsun. Yani `0xABCD` değeri aslında `0xAA BB CC DD` (burada her harf 8 bitlik bir baytı temsil ediyor).

  • Big-Endian (BE) Sıralama: Bellekte `AA BB CC DD` şeklinde saklanır.
  • Little-Endian (LE) Sıralama: Bellekte `DD CC BB AA` şeklinde saklanır.

PLC’den iki adet 16 bitlik register okuduğumuzu varsayalım: `Register 0` ve `Register 1`. Bu register’ların içeriği ve bunların hedef sistemde nasıl birleştirileceği, nihai float değerini belirler.

16 Bit Register’dan 32 Bit Float Okurken Word Swap ve Byte Swap Nasıl Anlaşılır?

Örnek Değer Üzerinden İnceleme: Float 123.45

Float 123.45’in IEEE 754 32-bit hex karşılığı (Big-Endian bayt sırasına göre): 0x42F6E666

Baytları: `42` (A), `F6` (B), `E6` (C), `66` (D)

16 Bit Register’dan 32 Bit Float Okurken Word Swap ve Byte Swap Nasıl Anlaşılır?

Olası Senaryolar ve Swap İhtiyaçları:

  1. Senaryo 1: PLC Big-Endian, Register Sırası (R0=MSW, R1=LSW), Hedef Sistem Big-Endian
    • PLC’den okunan 16 bitlik register’lar:
    • Register 0: `0x42F6` (MSW – Most Significant Word)
    • Register 1: `0xE666` (LSW – Least Significant Word)
    • Hedef sistem (BE) bunları doğrudan birleştirirse: `0x42F6E666`. Sonuç: Doğru (123.45).
    • Swap Gerekli mi? Hayır.
  2. Senaryo 2: PLC Little-Endian, Register Sırası (R0=LSW, R1=MSW), Hedef Sistem Little-Endian
    • PLC’den okunan 16 bitlik register’lar (bayt sırası ters):
    • Register 0: `0xE666` (LSW)
    • Register 1: `0x42F6` (MSW)
    • Hedef sistem (LE) bunları doğrudan birleştirirse: `0x42F6E666`. Sonuç: Doğru (123.45).
    • Swap Gerekli mi? Hayır.
  3. Senaryo 3: PLC Big-Endian, Register Sırası (R0=LSW, R1=MSW), Hedef Sistem Big-Endian (Word Swap Gerekli)
    • PLC’den okunan 16 bitlik register’lar:
    • Register 0: `0xE666` (LSW – ancak PLC’nin varsayımı R0’ın MSW olduğu)
    • Register 1: `0x42F6` (MSW – ancak PLC’nin varsayımı R1’in LSW olduğu)
    • Hedef sistem (BE) bunları doğrudan birleştirirse: `0xE66642F6`. Sonuç: Yanlış.
    • Bu durumda, 16 bitlik kelimelerin sırası ters gelmiştir. Word Swap (R0 ve R1 yer değiştirir) uygulanır.
    • Swap sonrası: Register 0: `0x42F6`, Register 1: `0xE666`.
    • Birleştirme: `0x42F6E666`. Sonuç: Doğru (123.45).
    • Swap Gerekli mi? Sadece Word Swap.
  4. Senaryo 4: PLC Little-Endian, Register Sırası (R0=MSW, R1=LSW), Hedef Sistem Little-Endian (Word Swap Gerekli)
    • PLC’den okunan 16 bitlik register’lar:
    • Register 0: `0x42F6` (MSW – ancak PLC’nin varsayımı R0’ın LSW olduğu)
    • Register 1: `0xE666` (LSW – ancak PLC’nin varsayımı R1’in MSW olduğu)
    • Hedef sistem (LE) bunları doğrudan birleştirirse: `0xE66642F6`. Sonuç: Yanlış.
    • Bu durumda da Word Swap (R0 ve R1 yer değiştirir) uygulanır.
    • Swap sonrası: Register 0: `0xE666`, Register 1: `0x42F6`.
    • Birleştirme: `0x42F6E666`. Sonuç: Doğru (123.45).
    • Swap Gerekli mi? Sadece Word Swap.
  5. Senaryo 5: Byte Swap Gerekli (Örn: PLC Big-Endian Word, Big-Endian Byte, Hedef Sistem Little-Endian)
    • PLC’den okunan 16 bitlik register’lar (BE):
    • Register 0: `0x42F6` (baytları: `42 F6`)
    • Register 1: `0xE666` (baytları: `E6 66`)
    • Hedef sistem (LE) bunları birleştirmeye çalışırsa: `0x66E6F642`. Sonuç: Yanlış.
    • Bu durumda hem kelime sırası hem de bayt sırası ters olabilir. Eğer hedef sistem Little-Endian ise ve PLC Big-Endian bayt sırasına sahipse, her 16 bitlik kelimenin içindeki 8 bitlik baytların yerini değiştirmek gerekir (Byte Swap).
    • Önce Word Swap: `0x42F6` ve `0xE666` yer değiştirmez.
    • Sonra her 16 bitlik kelime içinde Byte Swap:
    • `0x42F6` -> `0xF642`
    • `0xE666` -> `0x66E6`
    • Birleştirme (LE olarak): `0x66E6F642`. Hala yanlış.
    • Buradaki karışıklık, hem Word Endianness hem de Byte Endianness’ın birlikte ele alınması gerektiğidir.
    • Genellikle Modbus gibi protokollerde 4 farklı float sıralaması tanımlanır:
      • CDAB (Little-Endian Word, Little-Endian Byte): `R0_LSB R0_MSB R1_LSB R1_MSB` -> `R1_MSB R1_LSB R0_MSB R0_LSB`
      • ABCD (Big-Endian Word, Big-Endian Byte): `R0_MSB R0_LSB R1_MSB R1_LSB` -> `R0_MSB R0_LSB R1_MSB R1_LSB`
      • BADC (Big-Endian Word, Little-Endian Byte): `R0_LSB R0_MSB R1_LSB R1_MSB` -> `R0_MSB R0_LSB R1_MSB R1_LSB` (ancak her 16 bitlik kelime içindeki baytlar ters çevrilmiş)
      • DCBA (Little-Endian Word, Big-Endian Byte): `R0_MSB R0_LSB R1_MSB R1_LSB` -> `R1_MSB R1_LSB R0_MSB R0_LSB` (ancak her 16 bitlik kelime içindeki baytlar ters çevrilmiş)
    • Doğru swap kombinasyonunu bulmak için, okunan 4 baytlık verinin (örneğin `byte0, byte1, byte2, byte3`) tüm 24 olası permütasyonunu denemek yerine, genelde 4 temel kombinasyona bakılır:
      1. byte0 byte1 byte2 byte3 (No Swap)
      2. byte1 byte0 byte3 byte2 (Byte Swap within each 16-bit word)
      3. byte2 byte3 byte0 byte1 (Word Swap)
      4. byte3 byte2 byte1 byte0 (Word Swap + Byte Swap within each 16-bit word)
Parametre Değer/Açıklama
Veri Tipi 32-bit IEEE 754 Kayan Noktalı Sayı (Float/REAL)
Register Genişliği 16 Bit (Word)
Gerekli Register Sayısı 2 adet 16-bit register (bir 32-bit float için)
Veri Sıralama Katmanları Word Endianness (16-bit kelime sırası), Byte Endianness (8-bit bayt sırası)
Anahtar Kavramlar Little-Endian (LE), Big-Endian (BE), Word Swap, Byte Swap
Sık Görülen Durumlar Modbus RTU/TCP, OPC UA, EtherNet/IP, Profinet haberleşmeleri
Tanılama Yöntemi Bilinen float değerleriyle test, hexadecimal veri analizi, simülasyon
16 Bit Register’dan 32 Bit Float Okurken Word Swap ve Byte Swap Nasıl Anlaşılır?

Sahada Dikkat Edilmesi Gerekenler

  • Cihaz Dokümantasyonu ve Haberleşme Protokolü Spesifikasyonları:

    Her zaman ilk başvurulması gereken kaynaktır. PLC, sensör veya haberleşme gateway’inin teknik dokümanları, float değerlerinin hangi endianness formatında saklandığını (Big-Endian mı, Little-Endian mı) ve 16 bitlik register’lara nasıl bölündüğünü (MSW/LSW sırası) açıkça belirtmelidir. Modbus gibi protokollerin farklı uygulamalarında dahi bu sıralamalar değişebilir. Örneğin, Siemens PLC’ler genellikle Big-Endian, Rockwell (Allen-Bradley) PLC’ler ise Little-Endian eğilimindedir.

  • Bilinen Değerlerle Kapsamlı Testler Yapmak:

    Sistemi devreye almadan önce veya sorun giderme aşamasında, PLC’ye bilinen, kolayca tanınabilir float değerleri (örneğin, 0.0, 1.0, -1.0, 123.45, 3.14159, büyük pozitif/negatif sayılar) yazın ve hedef sistemden okuyun. Okuduğunuz ham 16 bitlik hex değerlerini not alın. Bu değerleri bir hex to float dönüştürücü ile manuel olarak test ederek hangi swap kombinasyonunun doğru sonucu verdiğini belirleyebilirsiniz. Örneğin, 1.0 değeri IEEE 754’te 0x3F800000’dır. Eğer okunan değerler bu kalıba uymuyorsa, swap kombinasyonlarını denemeye başlayın.

  • Hexadecimal Veri Analizi ve Byte Sıralamasını Anlama:

    Okunan iki adet 16 bitlik register’ın (örn: `0xABCD`, `0xEFGH`) ham hexadecimal değerlerini alın. Bir 32 bit float’ın hexadecimal karşılığını bilen bir araç (online dönüştürücüler veya programlama dillerindeki araçlar) kullanarak, doğru float değerinin hex karşılığını elde edin. Ardından, okuduğunuz 4 baytı (A, B, C, D, E, F, G, H) farklı sıralamalarla birleştirerek (örn: `ABCDEFGH`, `EFGHABCD`, `BADCFEHG`, `HGFEDCBA` vb.) doğru eşleşmeyi bulun. Bu, hangi swap işleminin gerektiğini net bir şekilde gösterecektir. Örneğin, 16 bitlik kelimelerin yerini değiştirmek (Word Swap) mi, yoksa her kelimenin içindeki baytların yerini değiştirmek (Byte Swap) mi, yoksa her ikisi mi gerekli?

  • PLC/DCS Programlama Ortamındaki Veri Tipi Tanımlamaları:

    PLC programında float değerlerinin (genellikle REAL veya DINT/DWORD olarak tanımlanır) nasıl ele alındığını kontrol edin. Bazı PLC’ler 32 bitlik veriyi doğrudan tek bir adres olarak ele alırken, bazıları iki ayrı 16 bitlik register olarak ele alır ve bu register’ların sıralaması PLC’nin kendi iç mimarisine veya programlama diline göre değişebilir.

  • Haberleşme Sürücüsü (Driver) veya OPC Sunucusu Ayarları:

    Eğer bir OPC sunucusu, SCADA yazılımı veya özel bir haberleşme sürücüsü kullanıyorsanız, bu yazılımların genellikle dahili endianness veya swap ayarları bulunur. Bu ayarlar, veriyi okurken otomatik olarak doğru dönüşümleri yapabilir. Yanlış ayar yapılması durumunda, veri hatalı okunacaktır. Çoğu modern driver, bu swap işlemlerini kullanıcıya sunulan bir konfigürasyon seçeneği olarak sunar (örn: “Float Swap”, “Word Order”, “Byte Order”).

  • Veri Bütünlüğü ve Hata Kontrolü:

    Swap işlemleri sadece verinin doğru yorumlanmasını sağlar, haberleşme hatalarını düzeltmez. Haberleşme sırasında oluşan CRC hataları veya paket kayıpları, anlamsız değerlere yol açabilir. Bu nedenle, haberleşme katmanındaki hata kontrol mekanizmalarının düzgün çalıştığından emin olun.

16 Bit Register’dan 32 Bit Float Okurken Word Swap ve Byte Swap Nasıl Anlaşılır?

Sık Karşılaşılan Sorunlar ve Çözümleri

Sahada karşılaşılan en yaygın sorun, PLC’den okunan float değerlerinin anlamsız, çok büyük, çok küçük, negatif veya NaN (Not a Number) olarak görünmesidir. Bu durumlar genellikle yanlış swap konfigürasyonundan kaynaklanır.

  • Sorun 1: Okunan float değeri sürekli “NaN” veya “Inf” (Infinity) olarak geliyor.

    Çözüm: Bu durum, genellikle okunan 4 baytlık verinin, IEEE 754 standardına göre geçerli bir float sayısını temsil etmemesinden kaynaklanır. Bu, ya çok ciddi bir endianness/swap hatası, ya da haberleşme hatası nedeniyle bozuk veri okunması anlamına gelir. Tüm olası 4 temel swap kombinasyonunu (No Swap, Word Swap, Byte Swap, Word+Byte Swap) deneyerek test edin. Ayrıca, PLC’deki orijinal float değerinin gerçekten geçerli bir sayı olduğundan emin olun.

  • Sorun 2: Okunan float değeri, PLC’deki değerin çok farklı, ancak tutarlı bir versiyonu (örn: 123.45 yerine 2.7E-38 gibi).

    Çözüm: Bu, büyük olasılıkla yanlış bir swap kombinasyonunun uygulandığını gösterir. Örneğin, sadece Word Swap yerine Byte Swap veya tam tersi uygulanmıştır. Bir hex editör kullanarak PLC’den okunan ham 4 baytlık veriyi analiz edin. Bilinen bir float değerinin hex karşılığını alın ve bu iki hex değerini karşılaştırarak hangi baytların veya kelimelerin yer değiştirmesi gerektiğini tespit edin. Genellikle 4 temel swap kombinasyonundan biri doğru sonucu verecektir.

  • Sorun 3: Okunan float değeri, beklenen değerin sadece pozitif veya negatif işaretinin değişmiş hali.

    Çözüm: Bu durum nadir de olsa, özellikle custom haberleşme protokollerinde veya hatalı bit manipülasyonlarında görülebilir. Float değerinin en yüksek anlamlı biti (MSB), işaret bitidir. Eğer bu bit yanlışlıkla ters çevrilirse, işaret değişir. Bu, genellikle bir byte swap hatasıyla birlikte veya özel bir bit