Tüm yazılar
Haberleşme Protokolleri

Modbus Nedir? RTU-TCP Farkı, Register Adresleme ve 247 Slave

Modbus'un 1979'dan beri neden sökmeye çalıştığımız her hatta durduğunu, RTU ile TCP'nin kafa kafaya farkını, 'neden 247 slave?' sorusunu ve 0x/1x/3x/4x register dünyasını kendi hat vakalarımla anlatıyorum.

Modbus Nedir? RTU-TCP Farkı, Register Adresleme ve 247 Slave

Kısa Cevap (Özet): Modbus, Modicon (bugünkü Schneider Electric) tarafından 1979’da geliştirilen, açık ve telif ücreti gerektirmeyen endüstriyel seri haberleşme standardıdır. İki yaygın ucu vardır: Modbus RTU (RS-485 üzerinde, 2 telli ekranlı kablo, CRC16 ile hata kontrolü) ve Modbus TCP/IP (Ethernet üzerinde, port 502, MBAP başlığı). Bir ağda en fazla 1 master + 247 slave yaşar; her slave 1–247 arasında 1 baytlık bir adres taşır. Veriler dört tabloda tutulur: ayrık girişler (0x), bobinler (1x), giriş register’ları (3x) ve holding register’ları (4x).

Gece, bir deşarj tankının basınç sensörüne yeni bir transmitter takmıştım. Kurulum temiz, kablo doğru, adresi de boştu — ama terminalde slave 37’nin karşılığı gelmiyordu. Baud aynıydı, parity aynıydı; on beş dakikalık sessizlikten sonra hatırladım: cihaz 8N1’di, terminalim 8E1’di. Bir bitlik fark, bir saatlik sessizlik. Modbus’un sahadaki karakteri budur: protokolü bilen hata vermez, aynı şeyi iki yerde farklı yazan hata verir. Bu yazı o bir biti ve 1979’dan beri biriken her şeyi anlatıyor.

1979’dan Beri Neden Hâlâ Orada?

Modbus, o dönemin ilk ve en güçlü PLC üreticilerinden Modicon tarafından geliştirildi; şirket bugün Schneider Electric’in parçası. Protokolün bugün hâlâ ayakta kalmasının sebebi teknik bir mucize değil, üç sade karar:

  1. Açık: spesifikasyonu ücretsiz; hiçbir üretici telif ödemiyor.
  2. Basit: bir baytlık adres, dört tablo, birkaç fonksiyon kodu — bir mikrodenetleyici bile kaldırır.
  3. Her yerde: PLC’den inverter’a, transformatordan binanın klima santraline kadar milyonlarca cihaz Modbus konuşuyor.

Yeni bir hat kuruyorsan PROFINET ya da EtherCAT’ı tercih edersin; ama mevcut sahayı açacaksan karşına Modbus çıkacak — çıkıyor da. Benim sahayı anlamamı en çok zorlayan protokol de o.

RTU mu, TCP mi, ASCII mi?

Aynı protokolün üç taşıma biçimi var:

Modbus RTU Modbus TCP/IP Modbus ASCII
Ortam RS-485 (2 telli) Ethernet RS-232/485
Paket frame + CRC16 MBAP başlığı + PDU hex karakterler + LRC
Hata kontrolü CRC16 TCP’nin kendisi LRC
Port — 502 —
Sahada yaygın yeni hatlarda yaygın neredeyse hiç

RTU’da paketin sonundaki CRC16, hattın gürültüsünü yakalar; bozuk frame atılır, master tekrar sorar. TCP’de bu işi kendi hata kontrolü üstlendiği için CRC yoktur; paketin önüne eklenen MBAP başlığı (transaction ID, protocol ID, length, unit ID) “bu frame kimden, kaçta, ne kadar” sorularını taşır. Pratik sonuç: RTU’nun bir slave adresi, TCP’de unit ID’ye kayar — aynı fiziksel ağda birden fazla RTU hattı köprüyle birleştirilirse işte o zaman ayırt edici olur.

Neden 247 Slave?

Bir Modbus ağında 1 master + en fazla 247 slave yaşar. Neden 247? Çünkü slave adresi 1 bayttır: 0–255 aralığından 0 broadcast’e (herkesi dinle) ayrılmış, kalan 1–255 içinde standardın sınırladığı üst sınır 247’dir. Yani adres genişletmek istersen yeni bir ağ, yeni bir port — “248. slave” diye bir şey yok.

Bu sınır sahada iki kez yakaladı beni: birinde 30 cihazlık bir hat, diğeri 247’nin eşiğinde “bir tane daha sığar mı” inatlaşması. İkisinde de cevap aynıydı: sığdırma, segmente böl.

Kablo ve Sonlandırma: 2 Telli Ekranlı, 120 ohm

RTU hattı iki şey ister: 2 telli ekranlı (shielded) bükmlü çift kablo ve hattın her iki ucuna 120 ohm sonlandırma direnci. Standart Modicon kablosu 0.25 mm² × 2’lik ekranlıdır; öz direnci düşük, iletkenliği iyi. Ekranı tek noktada toprakla — iki noktadan topraklarsan ekran üzerinden toprak gerilimi akar, veri bozulur.

Baud hızı esnektir (9.6 kbit/s’in klasik değeriyle başlar, 115.2 kbit/s’e kadar çıkar); ama hızı yükseltirken kablo uzunluğu ve gürültü payı daralır — tıpkı PROFIBUS’taki gibi.

Register Dünyası: 0x, 1x, 3x, 4x

Modbus verileri dört tabloda tutar; her tablo en fazla 9999 kayıtta, adresler 0000–270E (hex) aralığındadır:

Tablo Adresleme (klasik) İçerik OKU YAZ
1x Coils (bobin) 00001–09999 ON/OFF çıkışlar ✓ ✓
0x Ayrık girişler 00001–09999 ON/OFF sensörler ✓ —
4x Holding register 40001–49999 sayısal değerler (16 bit) ✓ ✓
3x Giriş register 30001–39999 sayısal ölçümler (16 bit) ✓ —

İki ayrım hatırlanmalı: OKUNAN tablolar (0x girişler, 3x register) slave’den gelir, PLC onları değiştirmez; YAZILAN tablolar (1x bobin, 4x holding) PLC’nin kontrol eder. Bobin 1 bit’tir; register 16 bit (2 bayt). Klasik numaralandırma offset taşır: 40001 no’lu holding register’ın paketteki gerçek adresi 0x0000’dır — offset 40001’dir. 1x’ın offset’i 1, 0x’ın 10001, 3x’ün 30001. Bu offset tuzağına düşen çoktur: “40001’i okuyorum ama 40002’deki değeri alıyorum” şikâyetinin neredeyse tamamı buradan doğar.

Sahada Ne Zaman Modbus?


O geceki bir bitlik parity farkı, bana Modbus’un asıl dersini verdi: protokolü değil, iki ucundaki ayarı tanı. Adres, baud, parity, sonlandırma — dört küçük ayar, dört büyük sessizlik. Dördünü de elinle doğruladın mı, Modbus 47 yıldır verdiği gibi cevap verir.