Modbus RTU; PLC'ler, sürücüler, enerji analizörleri ve sensörler arasında veri alışverişi için yaygın olarak kullanılan, basit bir seri haberleşme protokolüdür. Fiziksel katmanda çoğunlukla RS-485 kullanılır. Bir hatta bir istemci (eski adıyla master) ve adresleri 1 ile 247 arasında olan sunucu cihazlar (eski adıyla slave) bulunur; istemci sorar, sunucu cevap verir.
Protokol basit olduğu için "nasılsa çalışır" diye düşünülür; ama sahadaki sorunların çoğu donanım ayrıntılarından ve zamanlamadan çıkar. Aşağıda STM32 tabanlı bir cihaz tasarlarken dikkat edilmesi gerekenleri donanım ve yazılım olarak iki başlıkta topladık.
Donanım: RS-485 Tarafı
Sürücü (Transceiver) Seçimi
- STM32 3,3 V ile çalıştığından, 3,3 V beslemeli bir RS-485 sürücüsü seviye dönüştürme ihtiyacını ortadan kaldırır.
- Güvenli boşta durum (fail-safe) özelliği olan sürücüler, hat boştayken ya da kopukken alıcının rastgele karakter üretmesini önler.
- Birim yük değeri hatta kaç cihaz bağlanabileceğini belirler. Standart, hat başına 32 birim yük öngörür; 1/8 birim yüklü sürücülerle aynı hatta çok daha fazla cihaz bağlanabilir.
- Uzun hatlarda kenar hızı sınırlı sürücüler, yansımaları ve yayılan gürültüyü azaltır.
Sonlandırma ve Öngerilim
- Sonlandırma: Hattın yalnızca iki fiziksel ucuna, kablonun karakteristik empedansına yakın (tipik olarak 120 Ω) bir direnç konur. Her cihaza sonlandırma direnci takmak hattı aşırı yükler. Kart üzerinde sonlandırmayı bir köprü ya da anahtarla seçilebilir yapmak sahada büyük kolaylık sağlar.
- Öngerilim (biasing): Hat boştayken A ile B arasında tanımlı bir gerilim farkı olmalıdır. Bunun için hattın bir noktasında A ucu besleme tarafına, B ucu toprağa dirençlerle çekilir. Fail-safe özellikli sürücüler bu ihtiyacı azaltır ama her durumda tamamen ortadan kaldırmaz.
Koruma ve Yalıtım
Saha kabloları uzun ve dış etkilere açıktır. Hatta TVS diyotlar (RS-485'in −7 V ile +12 V arasındaki ortak mod aralığına uygun, asimetrik tipler) ve gerekirse seri dirençler ya da PTC sigortalar kullanılır. Cihazlar arasında toprak potansiyeli farkı olabilecek endüstriyel ortamlarda, hattı dijital yalıtıcı ve yalıtılmış DC-DC dönüştürücüyle yalıtmak en güvenli çözümdür.
Kablolama
- Bükümlü çift kablo kullanın; kılıflı kabloda kılıfı tek noktadan topraklayın.
- Cihazları zincir (daisy chain) şeklinde bağlayın; yıldız bağlantıdan ve uzun dallanmalardan kaçının.
- A ve B'nin yanında ortak bir referans (GND) hattı taşıyın.
Yazılım: STM32 Tarafı
Yön Kontrolü (DE/RE)
RS-485 yarı çift yönlüdür: aynı anda yalnızca bir cihaz konuşur. Gönderimden önce sürücü etkinleştirilir (DE), gönderim bitince bırakılır. En sık yapılan hata, sürücünün son bayt hâlâ gönderilirken bırakılmasıdır; bu durumda son baytın sonu bozulur ve karşı taraf CRC hatası görür.
- Sürücüyü, USART'ın gönderim tamamlandı (TC) bayrağı gelince bırakın. Gönderim tamponu boş (TXE) bayrağı, son bayt hâlâ hatta iken gelir.
- STM32F0, F3, G0, G4, L4 ve H7 gibi birçok yeni serinin USART birimlerinde donanımsal sürücü etkinleştirme (DE) çıkışı bulunur. Bu özellik yön kontrolünü yazılım zamanlamasından bağımsız hâle getirir; kullandığınız serinin başvuru kılavuzundan kontrol edin.
Karakter Biçimi
Modbus tanımında varsayılan karakter biçimi 8 veri biti, çift (even) eşlik ve 1 durma bitidir (8E1). Eşlik kullanılmıyorsa 2 durma biti öngörülür (8N2). Sahada 8N1 kullanan cihazlar da yaygındır; önemli olan hattaki tüm cihazların aynı ayarı kullanmasıdır. Bu ayarı cihaz menüsünden ya da yapılandırma yazılımından değiştirilebilir kılmak sahada çok işe yarar.
Çerçeve Zamanlaması
Modbus RTU'da çerçeveler arasında en az 3,5 karakter süresi sessizlik bulunmalı, bir çerçevenin karakterleri arasında ise 1,5 karakter süresinden uzun boşluk olmamalıdır. 11 bitlik bir karakterde (başlangıç biti, 8 veri biti, eşlik ve durma biti) bir karakter süresi 11 / baud hızıdır:
| Baud hızı | 1 karakter | 3,5 karakter |
|---|---|---|
| 9600 | ≈ 1,15 ms | ≈ 4,0 ms |
| 19200 | ≈ 0,57 ms | ≈ 2,0 ms |
| 38400 ve üzeri | ≈ 0,29 ms ve altı | 1,75 ms (önerilen sabit değer) |
Tanım, 19200 baud'un üzerindeki hızlarda 1,5 karakter için 750 µs, 3,5 karakter için 1,75 ms sabit değerlerinin kullanılmasını önerir.
Çerçeve Sonunu Yakalamak
STM32'de verimli bir yöntem, alımı DMA ile bir tampona yapmak ve çerçeve sonunu ayrıca algılamaktır:
- Boşta hat (IDLE) kesmesi yaygın ve pratik bir yöntemdir; ancak yaklaşık bir karakter süresi boşlukta tetiklenir, 3,5 karakteri garanti etmez.
- Tanıma tam uyum için her alınan baytta yeniden başlatılan bir zamanlayıcı (TIM) ile 3,5 karakterlik sessizlik ölçülür.
- Bazı STM32 serilerinin USART birimlerindeki alıcı zaman aşımı (receiver timeout) özelliği, bu süreyi bit süresi cinsinden donanımda saymayı sağlar.
CRC Hesabı
Her çerçevenin sonunda 16 bitlik bir CRC bulunur. Modbus CRC'si 0xFFFF başlangıç değeri ve 0xA001 (ters çevrilmiş 0x8005) polinomuyla hesaplanır; çerçeveye önce düşük bayt yazılır. Basit bir C uygulaması:
uint16_t modbus_crc16(const uint8_t *buf, uint16_t len)
{
uint16_t crc = 0xFFFF;
for (uint16_t i = 0; i < len; i++) {
crc ^= buf[i];
for (uint8_t b = 0; b < 8; b++)
crc = (crc & 1u) ? (uint16_t)((crc >> 1) ^ 0xA001u) : (uint16_t)(crc >> 1);
}
return crc; /* çerçeveye önce düşük bayt, sonra yüksek bayt yazılır */
}
Yüksek hızlarda ya da yoğun yük altında tablo tabanlı bir uygulama daha hızlıdır. Bazı STM32 serilerindeki donanımsal CRC birimi de polinomu ve bit sırası ayarlanarak kullanılabilir.
Fonksiyon Kodları ve Kayıt Haritası
En sık kullanılan fonksiyon kodları:
| Kod | İşlev |
|---|---|
| 03 | Tutma kayıtlarını okuma (Read Holding Registers) |
| 04 | Giriş kayıtlarını okuma (Read Input Registers) |
| 06 | Tek kayıt yazma (Write Single Register) |
| 16 (0x10) | Çoklu kayıt yazma (Write Multiple Registers) |
Desteklenmeyen bir istek geldiğinde cihaz, fonksiyon kodunun en üst bitini 1 yaparak (kod + 0x80) bir hata kodu döndürmelidir: 01 geçersiz fonksiyon, 02 geçersiz adres, 03 geçersiz değer. Kayıt haritasında iki noktayı belgelemek, sahadaki karışıklıkların çoğunu önler: adreslerin 0'dan mı 1'den mi başladığı (ör. 40001 gösterimi) ve 32 bitlik değerlerin iki kayda hangi sırayla yazıldığı.
Sahada Sık Görülen Sorunlar
- A ve B'nin ters bağlanması: Üreticiler A/B ve +/− adlandırmasını farklı kullanabilir; ilk kontrol edilecek şey budur.
- Eksik ya da fazla sonlandırma: Sinyal yansımaları ve rastgele hatalar.
- Öngerilim olmaması: Hat boştayken alıcı rastgele karakterler görür.
- Sürücünün erken bırakılması: Son bayt bozulur, CRC hatası oluşur.
- Eşlik ve hız uyuşmazlığı: Cihaz hiç cevap vermez.
- Kısa cevap zaman aşımı: İstemci, sunucunun cevabını beklemeden yeni sorgu gönderir.
- Toprak potansiyeli farkı: Uzun hatlarda yalıtım yoksa hatalar, hatta arızalar.
Test Önerileri
Geliştirme sırasında bir USB–RS485 dönüştürücü ve bilgisayarda çalışan bir Modbus istemci yazılımıyla cihazı uçtan uca test etmek en hızlı yöntemdir. Mantık analizörünün Modbus çözümleyicisi çerçeveleri ve zamanlamayı görmeyi sağlar; osiloskopla A–B farkını gözlemek ise sonlandırma ve yansıma sorunlarını ortaya çıkarır.
Sonuç
Sağlam bir Modbus RTU cihazı; doğru seçilmiş ve korunmuş bir RS-485 donanımının, doğru yön kontrolünün, tanıma uygun zamanlamanın ve iyi belgelenmiş bir kayıt haritasının birleşimidir.
Gömülü yazılım geliştirme hizmetimizde STM32 tabanlı cihazlar için Modbus RTU ve RS-485 haberleşmesini, donanımı tasarlayan ekiple birlikte geliştiriyoruz. Haberleşme kartına ihtiyacınız varsa elektronik kart tasarımı sayfamıza da göz atabilirsiniz.