Argus EMS · 21.09.2026 · 6 dk okuma
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ı.
Ü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:
| Tablo | Klasik gösterim | Okuma fonksiyonu | İçerik |
|---|---|---|---|
| Coil | 0xxxx | FC01 | Tek bit, okunur ve yazılır |
| Discrete input | 1xxxx | FC02 | Tek bit, salt okunur |
| Input register | 3xxxx | FC04 | 16 bit kelime, salt okunur |
| Holding register | 4xxxx | FC03 | 16 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.
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 tipi | Register sayısı | Tipik kullanım | Dikkat noktası |
|---|---|---|---|
| UINT16 | 1 | Frekans, durum kodu | 0xFFFF bazen veri yok anlamına gelir |
| INT16 | 1 | Güç faktörü, sıcaklık | Negatif değerler ikiye tümleyen biçimdedir |
| UINT32 / INT32 | 2 | Gerilim, akım, aktif güç | Word sırası ve işaret biti |
| FLOAT32 | 2 | Ölçeksiz fiziksel değerler | Byte ve word sırası kritik |
| UINT64 / INT64 | 4 | Enerji sayaçları | Kelime sırası üreticiye göre değişir |
| ASCII | N | Seri 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.
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:
Ö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üzeni | Gelen register'lar | ABCD varsayımıyla çözülen değer |
|---|---|---|
| ABCD | 0x4366 0x8000 | 230,5 |
| CDAB | 0x8000 0x4366 | −2,4×10⁻⁴¹ |
| BADC | 0x6643 0x0080 | 2,3×10²³ |
| DCBA | 0x0080 0x6643 | 1,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.
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
Bir demo oturumunda kendi verilerinizle sistemi keşfedin.