Modbus register adreslerindeki 40001 mi yoksa 0 mı başlangıç karışıklığı, protokolün kendisinin 0-tabanlı (zero-based) adresleme kullanması, ancak endüstriyel standartların ve çoğu HMI/SCADA yazılımının kullanıcı dostu olması için 1-tabanlı (one-based) adresleme (örneğin 40001) göstermesinden kaynaklanır. Çözüm, kullanılan sistemin veya yazılımın hangi standardı benimsediğini anlamak ve genellikle 1-tabanlı adresten 1 çıkararak (örneğin 40001 için 0) gerçek protokol adresini elde etmektir.
Modbus Register Adresi 40001 mi 0 mı Başlıyor Karışıklığı Nasıl Çözülür? Nedir?
Endüstriyel otomasyonun temel iletişim protokollerinden biri olan Modbus, özellikle register adreslemesi konusunda sıkça kafa karışıklığına yol açar. Bu karışıklık, protokolün kendi iç işleyişi ile kullanıcı arayüzleri ve dokümantasyonun sunduğu perspektif arasındaki farktan doğar. Modbus protokolü, veri adreslerini dahili olarak 0-tabanlı bir offset (kaydırma) değeri olarak ele alır. Bu, bir Modbus cihazından veri okumak istediğinizde, aslında cihazın hafızasındaki belirli bir konuma 0’dan başlayarak bir indeks gönderdiğiniz anlamına gelir. Örneğin, bir Modbus Holding Register’ını okumak için kullanılan fonksiyon kodu (0x03) ile birlikte gönderilen adres, 0’dan başlayan bir değerdir. Eğer cihazın ilk Holding Register’ını okumak istiyorsanız, protokol seviyesinde gönderilen adres ‘0’ olacaktır.
Ancak, Modbus protokolünün ilk ortaya çıktığı dönemlerden itibaren, kullanıcıların ve programcıların bu adresleri daha kolay anlaması için 1-tabanlı adresleme şemaları benimsenmiştir. Bu şemada, Holding Register’ları 40001’den başlar, Input Register’ları 30001’den, Discrete Inputs 10001’den ve Coils 00001’den başlar. Bu sayılar, register tipini (4xxxx Holding Register olduğunu gösterir) ve registerın sırasını (40001 ilk Holding Register’dır) belirtmek için birer konvansiyon olarak kullanılır. Dolayısıyla, bir SCADA sistemi veya HMI paneli genellikle size “40001” adresini girmenizi isterken, bu adres arka planda Modbus protokolü tarafından “0” offset değerine dönüştürülür. Bu ikili yapı, sahada çalışan mühendisler ve teknisyenler için doğru adreslemeyi yaparken dikkat edilmesi gereken kritik bir noktadır.
Çalışma Prensibi ve Teknik Veriler
Modbus protokolü, veri modellerini dört ana kategoriye ayırır: Coils, Discrete Inputs, Input Registers ve Holding Registers. Her bir kategori için geleneksel olarak 1-tabanlı adres aralıkları tanımlanmıştır:
- Coils (0xxxx): Genellikle tek bitlik dijital çıkışları temsil eder (ON/OFF). Geleneksel olarak 00001-09999 aralığına denk gelir. Fonksiyon kodları 0x01 (Oku) ve 0x05/0x0F (Yaz).
- Discrete Inputs (1xxxx): Genellikle tek bitlik dijital girişleri temsil eder (ON/OFF). Geleneksel olarak 10001-19999 aralığına denk gelir. Fonksiyon kodu 0x02 (Oku).
- Input Registers (3xxxx): Genellikle 16-bitlik analog veya sayısal giriş değerlerini temsil eder. Geleneksel olarak 30001-39999 aralığına denk gelir. Fonksiyon kodu 0x04 (Oku).
- Holding Registers (4xxxx): Genellikle 16-bitlik analog veya sayısal çıkış/parametre değerlerini temsil eder. Hem okunabilir hem de yazılabilir. Geleneksel olarak 40001-49999 aralığına denk gelir. Fonksiyon kodları 0x03 (Oku) ve 0x06/0x10 (Yaz).
Modbus iletişimi sırasında, bir master cihaz (örneğin bir PLC veya SCADA) bir slave cihaza (örneğin bir sensör veya motor sürücüsü) bir istek gönderir. Bu istek, bir fonksiyon kodu ve bir veri adresi (offset) içerir. Örneğin, bir master, slave’den ilk Holding Register’ını okumak istediğinde, gönderdiği Modbus PDU (Protocol Data Unit) genellikle şu yapıda olacaktır: Fonksiyon Kodu: 0x03 (Read Holding Registers), Başlangıç Adresi: 0x0000 (yani 0 offset), Register Sayısı: 0x0001 (bir register oku). Buradaki 0x0000 değeri, 1-tabanlı adreslemede “40001” olarak ifade edilen register’a karşılık gelir.
Bu dönüşümün temel mantığı şudur: 1-tabanlı adresleme, register tipini belirten ilk rakamı (örneğin 4xxxx için ‘4’) ve ardından registerın sırasını (0001) içerir. Protokol seviyesinde ise bu ‘4’ rakamı tamamen göz ardı edilir ve sadece sıradan 1 çıkarılarak elde edilen 0-tabanlı offset değeri kullanılır. Yani, 40001 adresli Holding Register için protokol offseti (40001 – 40001) = 0’dır. Benzer şekilde, 40010 adresli Holding Register için protokol offseti (40010 – 40001) = 9’dur. Aynı mantık 3xxxx, 1xxxx ve 0xxxx serisi için de geçerlidir; 30001 için offset 0, 10001 için offset 0, 00001 için offset 0’dır.
Bu karmaşıklık, Modbus’un farklı sistemler ve üreticiler arasında nasıl yorumlandığına dair derinlemesine bir anlayış gerektirir. Çoğu modern SCADA yazılımı veya PLC Modbus kütüphanesi, bu dönüşümü otomatik olarak yapar ve kullanıcıdan 1-tabanlı adresleri girmesini bekler. Ancak, düşük seviyeli programlama yaparken veya özel bir Modbus sürücüsü geliştirirken, 0-tabanlı offset değerlerini doğru bir şekilde kullanmak hayati önem taşır.
| Parametre | Değer/Açıklama |
|---|---|
| Modbus Veri Modeli | Holding Registers (4xxxx) |
| 1-Tabanlı Adres Aralığı | 40001 – 49999 (Genel Konvansiyon) |
| 0-Tabanlı Protokol Offset Aralığı | 0x0000 – 0x270E (0 – 9999 ondalık) |
| Modbus Fonksiyon Kodu (Oku) | 0x03 (Read Holding Registers) |
| Modbus Fonksiyon Kodu (Yaz) | 0x06 (Write Single Register), 0x10 (Write Multiple Registers) |
| Veri Tipi | 16-bit İşaretsiz Tamsayı (Uygulamaya göre Float, 32-bit int vb. yorumlanabilir) |
| SCADA/HMI Yazılımı Yorumu | Genellikle 1-tabanlı adresi (örn. 40001) doğrudan girmenizi bekler. |
| PLC/Gömülü Sistem Kodu Yorumu | Genellikle 0-tabanlı offseti (örn. 0) kullanır. |

Sahada Dikkat Edilmesi Gerekenler
- Cihaz Dokümantasyonu Her Şeydir: Her Modbus slave cihazının (PLC, invertör, sensör vb.) kendine ait bir Modbus haritası dokümantasyonu bulunur. Bu doküman, cihazın hangi verileri hangi register adreslerinde tuttuğunu ve bu adreslerin 1-tabanlı mı yoksa 0-tabanlı mı olduğunu net bir şekilde belirtmelidir. İlk ve en önemli adım, daima bu resmi dokümanı incelemektir. Bazı üreticiler 1-tabanlı adresleri doğrudan verirken, bazıları “register 0, register 1…” şeklinde 0-tabanlı adresleri listeleyebilir.
- SCADA/HMI Yazılımının Adresleme Mantığı: Kullandığınız SCADA veya HMI yazılımının Modbus sürücüsünün nasıl adresleme yaptığını anlamak kritik öneme sahiptir. Çoğu SCADA yazılımı, kullanıcıdan 1-tabanlı adresleri (örn. 40001) girmesini bekler ve bu dönüşümü arka planda otomatik olarak yapar. Ancak, bazı yazılımlarda veya özel Modbus ayarlarında “0-based addressing” veya “1-based addressing” seçeneği bulunabilir. Bu ayarı doğru yapılandırmak, yanlış veri okumalarının önüne geçer.
- PLC veya Gömülü Sistem Programlama Yaklaşımı: Eğer bir PLC veya mikrodenetleyici ile Modbus master uygulaması geliştiriyorsanız, genellikle programlama dilinizin veya kütüphanenizin Modbus fonksiyonları 0-tabanlı offset değerlerini bekleyecektir. Örneğin, Siemens TIA Portal’daki Modbus blokları veya Schneider Unity Pro’daki Modbus fonksiyonları, başlangıç adresi için 0-tabanlı bir offset değeri ister. Bu durumda, cihaz dokümantasyonundaki 1-tabanlı adresten 1 çıkararak doğru offseti hesaplamanız gerekir.
- Offset Hesaplama ve Doğrulama: Genel kural olarak, eğer bir cihazın dokümantasyonunda 1-tabanlı adresler (örn. 40001) belirtilmişse ve kullandığınız yazılım 0-tabanlı offset bekliyorsa,
Offset = Geleneksel Adres - Register Tipi Başlangıç Değeriformülünü kullanın. Örneğin, 40001 için offset 0’dır (40001 – 40001), 40010 için offset 9’dur (40010 – 40001). Modbus test araçları (Modscan, QModMaster vb.) kullanarak bu adresleri denemek ve doğrulamak, saha kurulumlarında zaman kazandıran etkili bir yöntemdir. - Endianness (Byte Sırası) Kontrolü: Adresleme karışıklığına ek olarak, Modbus iletişiminde sıkça karşılaşılan bir diğer sorun da endianness yani byte sırası farklılıklarıdır. Özellikle 32-bit float veya integer değerleri okurken, yüksek ve düşük sıralı byte’ların (word’lerin) nasıl sıralandığına dikkat etmek gerekir. Bazı cihazlar Big-Endian (MSB ilk), bazıları Little-Endian (LSB ilk) kullanabilir. Bu durum, okunan değerlerin anlamsız görünmesine neden olabilir ve genellikle SCADA veya PLC tarafında byte/word swap ayarlarıyla çözülür.

Sık Karşılaşılan Sorunlar ve Çözümleri
Modbus adresleme karışıklığı nedeniyle sahada birçok sorun yaşanabilir. İşte en yaygın sorunlar ve çözüm önerileri:
Sorun 1: SCADA/HMI’da Yanlış Veri Okuma veya “Bad Quality” Hatası
Senaryo: SCADA sistemine 40001 adresini girdiğinizde, ya hiç veri gelmiyor ya da tamamen anlamsız, tutarsız değerler görüyorsunuz.
Çözüm:
- Cihaz Dokümantasyonunu Kontrol Edin: Cihazın Modbus haritasında gerçekten 40001 adresinin neye karşılık geldiğini doğrulayın. Bazı cihazlar 40001 yerine 40000 veya 40002’den başlayabilir.
- SCADA Adresleme Ayarlarını İnceleyin: Kullandığınız SCADA yazılımının Modbus sürücüsünün adresleme modunu (0-tabanlı mı, 1-tabanlı mı) kontrol edin. Bazı yazılımlar, örneğin “0-based addressing” seçeneği ile 40001’i 0 olarak değil, 40000 olarak yorumlayabilir. Genellikle “1-based addressing” seçeneği, 40001’i 0’a dönüştürme işlemini doğru yapar.
- Modbus Test Aracı Kullanın: Bir Modbus test yazılımı (örn. Modscan, QModMaster) kullanarak doğrudan cihaza bağlanın. Hem 40001 hem de 0 adreslerini (veya 40000) deneyerek hangi adresin doğru veriyi döndürdüğünü tespit edin. Bu, SCADA yapılandırmanız için doğru referansı sağlayacaktır.
Sorun 2: PLC Programında Modbus Okuma/Yazma İşlemi Başarısız Oluyor
Senaryo: PLC’nizden bir Modbus slave cihazına veri okumaya veya yazmaya çalışıyorsunuz ancak işlem hata kodu döndürüyor veya beklenen etkiyi yaratmıyor.
Çözüm:
- Offset Hesaplamasını Gözden Geçirin: PLC Modbus fonksiyonları genellikle 0-tabanlı offset bekler. Cihaz dokümantasyonundaki 1-tabanlı adresten 1 çıkararak (örn. 40001 için 0) doğru offseti PLC programınıza girdiğinizden emin olun.
- Fonksiyon Kodunu Doğrulayın: Holding Register’lar için 0x03 (oku) veya 0x10 (yaz) gibi doğru fonksiyon kodunu kullandığınızdan emin olun. Yanlış fonksiyon kodu da hataya neden olur.
- Kablo Bağlantısı ve Baud Rate: Adresleme dışındaki temel iletişim sorunlarını da kontrol edin: RS485 kablolaması (A/B, topraklama), sonlandırma dirençleri, baud rate, parity ve stop bit ayarlarının master ve slave arasında eşleştiğinden emin olun.
Sorun 3: Farklı Modbus Cihazları Arasında Adresleme Tutarsızlıkları
Senaryo: Bir projede birden fazla farklı marka ve model Modbus cihazı kullanıyorsunuz ve her birinin adresleme şeması farklı gibi görünüyor.
Çözüm:
- Her Cihaz İçin Ayrı Dokümantasyon: Her cihazın kendi Modbus haritasını ayrı ayrı inceleyin ve adresleme mantığını (0-tabanlı mı, 1-tabanlı mı, hangi aralıktan başlıyor) not alın. Tek bir genelleme yapmaktan kaçının.
- Ortak Bir Adresleme Stratejisi Geliştirin: SCADA veya PLC programlamanızda, her cihaz için ayrı ayrı adres dönüşüm mantığı uygulayın. Gerekirse, Modbus adreslerini bir veri tablosunda veya Excel’de listeleyerek hangi 1-tabanlı adresin hangi 0-tabanlı offsete karşılık geldiğini açıkça belirtin. Bu, hata yapma olasılığını azaltır ve gelecekteki bakımı kolaylaştırır.
Uzman Tavsiyesi
Modbus protokolü, endüstriyel otomasyonun omurgalarından biri olmaya devam etmektedir ve adresleme konusundaki bu çifte standart, protokolün tarihsel gelişimi ve farklı kullanım senaryolarından kaynaklanmaktadır. Temel olarak, Modbus iletişiminin özünde 0-tabanlı offset adresleme yatar. Yani, bir Modbus cihazıyla doğrudan iletişim kurarken, ilk Holding Register için 0, ikinci için 1 vb. offset değerlerini kullanırsınız. Ancak, bu teknik detay, kullanıcıların işini kolaylaştırmak amacıyla çoğu HMI, SCADA ve bazı PLC yazılımlarında 1-tabanlı adresleme (40001, 30001 vb.) olarak sunulur. Bu, mühendislerin ve teknisyenlerin Modbus adreslerini daha sezgisel bir şekilde yönetmesini sağlar, çünkü “40001” rakamı hem register tipini hem de sırasını tek bir stringde ifade eder.
Bu karışıklığı çözmenin altın kuralı, daima cihaz üreticisinin sağladığı Modbus haritası dokümanına başvurmaktır. Bu doküman, cihazın hangi register’ları hangi adreslerde tuttuğunu ve bu adreslerin hangi formatta (0-tabanlı offset mi yoksa 1-tabanlı konvansiyonel adres mi) verildiğini net bir şekilde belirtir. İkinci önemli adım ise, kullandığınız master cihazın (PLC, SCADA, HMI) Modbus sürücüsünün veya kütüphanesinin hangi adresleme mantığını beklediğini anlamaktır. Çoğu modern sistem bu dönüşümü otomatik olarak yapsa da, özellikle eski sistemlerde veya düşük seviyeli programlama yaparken bu ayarları manuel olarak yapılandırmak gerekebilir. Şüpheye düştüğünüzde, Modbus test araçları kullanarak farklı adresleri deneyerek doğru iletişim adresini tespit etmek en güvenilir yöntemdir. Endianness (byte sırası) gibi diğer yaygın Modbus tuzaklarını da göz önünde bulundurarak, sistematik bir yaklaşımla ve dokümantasyona sadık kalarak, Modbus adresleme sorunlarını başarıyla çözebilir ve endüstriyel otomasyon sistemlerinizin sorunsuz çalışmasını sağlayabilirsiniz. Unutmayın, iyi bir Modbus uzmanı, sadece protokolü bilmekle kalmaz, aynı zamanda farklı üreticilerin implementasyonlarındaki nüansları ve yaygın sorunları da tanır ve çözer.
