📝 Protokol

Modbus Register Haritası: Veri Tipi, Byte Sırası ve Adres Tabanı

Argus EMS · 21.09.2026 · 6 dk okuma

Modbus Register Haritası: Veri Tipi, Byte Sırası ve Adres Tabanı — Argus EMS

Enerji analizörü panoya takıldı, haberleşme kuruldu, cihaz her sorguya cevap veriyor; ama ekranda 230 V yerine 2,3×10²³ V, frekans yerine sıfır, enerji sayacında ise hiç ilerlemeyen ya da anlamsız biçimde sıçrayan bir değer görünüyor. Bu tablo sahada çoğu zaman kablo arızası sanılır. Oysa cevap geliyorsa fiziksel katman büyük olasılıkla sağlamdır; sorun, üreticinin register haritasının yanlış yorumlanmasıdır. Bu yazıda protokolün temellerine girmeden, haritadaki dört kritik bilgiyi ele alıyoruz: veri tablosu ve fonksiyon kodu, adres tabanı, veri tipi, byte ve word sırası.

Register Haritası Neyi Anlatır?

Üretici dokümanındaki her satır bir parametreyi tarif eder: parametre adı, adres, okunacağı tablo ya da fonksiyon kodu, veri tipi, kaç register kapladığı, çarpan veya ölçek, birim ve erişim hakkı. Modbus dört veri tablosu tanımlar ve her birinin kendi okuma fonksiyonu vardır:

TabloKlasik gösterimOkuma fonksiyonuİçerik
Coil0xxxxFC01Tek bit, okunur ve yazılır
Discrete input1xxxxFC02Tek bit, salt okunur
Input register3xxxxFC0416 bit kelime, salt okunur
Holding register4xxxxFC0316 bit kelime, okunur ve yazılır

Protokol yalnızca 16 bitlik kelimeler taşır. 32 bitlik bir güç değeri ya da IEEE 754 kayan noktalı sayı iki register'a, 64 bitlik bir enerji sayacı dört register'a bölünür. Yanlış tabloyu sorgulamak (input yerine holding) cihazdan ILLEGAL DATA ADDRESS istisnası döndürür ya da daha kötüsü, aynı numaralı başka bir parametreyi getirir.

Adres Tabanı Tuzağı: 40001 mi, 0 mı?

Dokümanlar adresi üç farklı biçimde yazar: klasik gösterim (40001), 1 tabanlı register numarası (Register 1) ve 0 tabanlı protokol adresi (0x0000). Kablodan giden istekte ise yalnızca 0 tabanlı ofset bulunur: 40001, FC03 ile adres 0 demektir; 40108 ise adres 107. Birçok yazılım kütüphanesi 0 tabanlı çalışır, bazı SCADA araçları 1 tabanlı numara bekleyip bir çıkarma işlemini kendisi yapar. Çıkarma iki tarafta birden yapılırsa ya da hiç yapılmazsa okuma tam bir register kayar.

Kaymanın belirtisi nadiren hata mesajıdır; cihaz komşu register'ı sorunsuz döndürür. Tek register'lık değerlerde komşu parametre gelir, 32 bitlik değerlerde ise bir parametrenin düşük kelimesi diğerinin yüksek kelimesiyle birleşir ve anlamsız bir sayı ortaya çıkar. Sahada yaşadığımız bir örnek: bir chiller'ın bina otomasyonu dokümanı register numaralarını 1 tabanlı listeliyordu, okuyucu ise 0 tabanlı adres bekliyordu. Çıkış suyu sıcaklığı ancak adres, register numarasından bir çıkarılarak girildiğinde panelle eşleşti. Başka bir üreticinin dokümanında ise yazılan numara zaten 0 tabanlıydı ve bir çıkarmak kaymaya yol açardı. Kısacası kural ezberlenmez, her cihaz modeli için doğrulanır.

Veri Tipleri ve Ölçek

Veri tipiRegister sayısıTipik kullanımDikkat noktası
UINT161Frekans, durum kodu0xFFFF bazen veri yok anlamına gelir
INT161Güç faktörü, sıcaklıkNegatif değerler ikiye tümleyen biçimdedir
UINT32 / INT322Gerilim, akım, aktif güçWord sırası ve işaret biti
FLOAT322Ölçeksiz fiziksel değerlerByte ve word sırası kritik
UINT64 / INT644Enerji sayaçlarıKelime sırası üreticiye göre değişir
ASCIINSeri numarası, model adıHer register iki karakter taşır

İşaretli ve işaretsiz tip karışıklığı sinsi bir hatadır. INT16 olarak −15 gönderilen bir değer UINT16 okunursa 65521 görünür. Tüketim tarafında negatif güç görmek zaten akım trafosu polaritesi gibi bir bağlantı hatasının işaretidir; yanlış tip seçimi bu işareti büyük pozitif bir sayıya çevirip gizler. Tamsayı register'larda gerçek değer ham değer × çarpan + ofset ile bulunur: gerilim için onda bir, güç faktörü için binde bir gibi çarpanlar yaygındır; Fahrenheit gönderen cihazlarda çarpan ve ofset birlikte kullanılır.

Bir de geçersiz değer kodları vardır. Birçok cihaz veri yok bilgisini tipin uç değerleriyle gönderir: 0xFFFF, 0x7FFF, 0x8000 ya da 32 bitte 0x80000000. Sahada bir jeneratör kontrolörünün geçersiz değer için 0xFFFF7FFF gönderdiğini gördük. Bu kodlar sayıya çevrilirse trend grafiğinde dev sıçramalar oluşur.

Byte ve Word Sırası: ABCD, CDAB, BADC, DCBA

Modbus spesifikasyonu tek bir register içinde yüksek byte'ın önce gelmesini tanımlar, fakat çok register'lı değerlerin kelime sırasını tanımlamaz. Bu yüzden sahada dört düzen görülür. 32 bitlik değerin byte'larını en yüksekten başlayarak A, B, C, D diye adlandıralım:

  • ABCD (big-endian): yüksek kelime önce; en yaygın düzen.
  • CDAB (word swap): düşük kelime önce, kelime içi sıra korunur; PLC'lerde ve bazı sayaçlarda sık görülür.
  • BADC (byte swap): kelimeler doğru sırada, kelime içindeki byte'lar yer değiştirmiş.
  • DCBA (little-endian): tamamen ters sıra.

Örnek olarak 230,5 V değerini taşıyan FLOAT32 sayı 0x43668000'dir. Cihaz bunu dört düzenden biriyle gönderir; yazılım ABCD varsayarsa şu sonuçlar çıkar:

Cihazın düzeniGelen register'larABCD varsayımıyla çözülen değer
ABCD0x4366 0x8000230,5
CDAB0x8000 0x4366−2,4×10⁻⁴¹
BADC0x6643 0x00802,3×10²³
DCBA0x0080 0x66431,2×10⁻³⁸

Kayan noktalı sayılarda yanlış düzen neredeyse her zaman absürt bir sonuç verir, bu yüzden kolay yakalanır. Tamsayı sayaçlarda durum farklıdır: word swap yapılmış bir enerji sayacı makul görünen ama yanlış bir değer gösterir ve düşük kelime taştığında büyük adımlarla sıçrar. 64 bitlik sayaçlarda da birlik yoktur; aynı sahada bir marka dört kelimeyi yüksekten düşüğe, başka bir marka düşük kelimeyi önce gönderebilir.

Adım Adım Doğrulama Prosedürü

  1. Dokümanın adres gösterimini belirleyin: klasik 4xxxx, 1 tabanlı numara ya da 0 tabanlı hex.
  2. Panelde okunabilen, yavaş değişen bir referans parametre seçin; şebeke frekansı ya da sabit bir ayar değeri idealdir.
  3. Doğru fonksiyon koduyla ham register'ları hex olarak okuyun; hedef adresin bir öncesini ve bir sonrasını da okuyun.
  4. Veri tipine göre dört byte düzenini deneyin, fiziksel olarak makul olanı seçin.
  5. İşaretli bir parametrede, örneğin güç faktöründe, işareti kontrol edin.
  6. Çarpan ve ofseti uygulayıp panelle karşılaştırın; testi farklı yük durumlarında tekrarlayın.
  7. Cihazın geçersiz değer kodlarını not edin.
  8. Blok okumalarda haritada tanımsız adres içeren aralıklardan kaçının; bazı cihazlar böyle bir bloğu tümüyle reddeder. Tek okumada en fazla 125 register istenebilir.

Argus EMS'te Register Haritası Nasıl Tutulur?

Argus EMS'te her cihaz modeli bir şablonla tanımlanır. Şablondaki her register satırı başlangıç adresini, register sayısını, veri tipini (INT16, UINT16, INT32, UINT32, FLOAT32 gibi), fonksiyon kodunu (holding ya da input), byte sırasını, çarpanı, ofseti, birimi ve değerin anlık mı kümülatif mi olduğunu taşır. Doğrulanmış bir harita böylece bir kez yazılır ve aynı modeldeki her cihazda yeniden kullanılır. Saha PC'deki field agent okuyucuları 0 tabanlı protokol adresiyle çalışır, 16, 32 ve 64 bitlik değerleri tipine göre çözer ve tanımlı geçersiz değer kodlarını sayıya çevirmek yerine boş bırakır.

Devreye almada işe yarayan bir özellik: uzaktan yönetim komutuyla sahaya gitmeden bir cihazın ham register'ları FC03 ya da FC04 ile okunup ondalık ve hex döküm olarak alınabilir; adres ve byte sırası denemeleri bu dökümle yapılır. Okunan veriler Modbus TCP ve RTU hatlarından toplanıp MQTT ile sunucuya iletilir. Bağlantı koptuğunda veriler yerel SQLite kuyrukta 30 gün tamponlanır ve sunucu teyidi (ACK) gelmeden silinmez; sunucuda anlık veriler 13 ay saklanır.

İlgili İçerikler

Modbus TCPModbus Enerji İzlemeEntegrasyonlarenerji takip ve yönetim sistemireaktif ceza önlemetrafo yük ve sıcaklık izlemeEnerji Analizörü Nedir? Seçim Rehberi ve Modbus EntegrasyonuM-Bus Nedir? Kablolu M-Bus, Wireless M-Bus ve Modbus Farkı

Sık Sorulan Sorular

Dokümanda 40001 yazıyorsa yazılıma hangi adresi girmeliyim?
Klasik gösterimde baştaki 4 holding register tablosunu, kalan kısım 1 tabanlı register numarasını ifade eder. Protokolde bu değer FC03 ile adres 0 olarak gönderilir. Kullandığınız yazılımın 1 tabanlı numara mı yoksa 0 tabanlı ofset mi beklediğini kontrol edin ve sonucu panelde değeri bilinen bir parametreyle doğrulayın.
Byte sırasının yanlış olduğunu nasıl anlarım?
FLOAT32 değerler çok küçük ya da çok büyük absürt sayılara dönüşür. Tamsayı sayaçlarda değer makul görünse de düşük kelime taştıkça büyük adımlarla sıçrar. Ham register'ları hex olarak okuyup ABCD, CDAB, BADC ve DCBA düzenlerini sırayla deneyin, panelle eşleşeni seçin.
Bazı parametreler neden sürekli 65535 ya da -32768 geliyor?
Bu değerler çoğunlukla cihazın veri yok ya da geçersiz anlamında gönderdiği uç değer kodlarıdır. Bir diğer olasılık, işaretli bir değerin işaretsiz tiple okunmasıdır. Dokümanda geçersiz değer tanımını arayın, veri tipini kontrol edin ve bu kodları grafiğe sayı olarak yazdırmayın.

Tesisinizi Argus ile İzleyin

Argus'u Tesislerinizde Görün

Bir demo oturumunda kendi verilerinizle sistemi keşfedin.