Modbus Hatalari
Modbus RTU (RS485) iletisiminde karsilasilan hatalarin teshis ve cozum rehberi. Gateway'lerin inverter, enerji analizoru ve diger Modbus cihazlari ile iletisim sorunlarini kapsar.
Sorun Tablosu
| Semptom | Olasi Sebep | Kontrol | Cozum |
|---|---|---|---|
| CRC hatasi | Kablo uzunlugu, EMI, termination eksik | Hata orani logla, kablo uzunlugu olc | Kisa kablo, shielded, 120Ω termination |
| Timeout hatasi | Cihaz kapali, yanlis slave ID, baud mismatch | Farkli slave ID dene, baud rate dene | Dogru ID ve baud ayarla |
| Yanlis deger okuyor | Byte order, register offset, scale factor | Raw hex ile karsilastir | Template'de byte_order ve scale duzelt |
| Iletisim aralikli kopuyor | RS485 bus collision, cok cihaz | Polling interval artir | Bus segmentasyonu, cihaz sayisi azalt |
| Function code hatasi | Cihaz FC3 desteklemiyor | Cihaz dokumani kontrol | FC4 (Input Register) dene |
Detayli Teshis ve Cozumler
1. CRC Hatasi
Semptom: Seri loglarinda Modbus CRC Error tekrarliyor. Bazen dogru yanit gelse de cogunda CRC uyumsuzlugu bildiriliyor.
Olasi Sebepler:
- RS485 kablo uzunlugu > 100m (shielded degilse)
- Elektromanyetik girişim (EMI) — guc kablolari yakinindan geciyor
- Hat sonlandirma (termination) direnci eksik
- Gevşek terminal baglantilari
Kontrol Adimlari:
# Gateway seri loglarinda CRC hatalarini say
# Beklenen log:
# Modbus RX CRC Error: expected=0xA3B2, got=0xA3B4
# Modbus CRC Error Count: 15/100 (son 100 istekte 15 hata)
# Hata orani %5'in uzerindeyse fiziksel hat sorunludur
Cozum:
- Kablo kisaltma: RS485 kablo uzunlugunu mumkun oldugunca kisa tutun (ideal < 50m)
- Shielded kablo: Shielded twisted pair (STP) kablo kullanin, shield'i tek noktadan topraklayın
- Termination: RS485 hattinin her iki ucuna 120Ω direnc baglayin
- Kablo yolu: Guc kablolarindan en az 30cm uzakta doseyin, paralel gecis yapmayin
- Baglanti sıkıligi: Terminal vidalı konnektorleri kontrol edin, gevşek temas CRC hatasinin en yaygin sebebidir
2. Timeout Hatasi
Semptom: Modbus Timeout: No response from slave X mesaji tekrarliyor. Cihazdan hic yanit gelmiyor.
Olasi Sebepler:
- Modbus cihazi kapali veya enerjisiz
- Yanlis slave ID kullaniliyor
- Baud rate, parity veya stop bit uyumsuzlugu
- RS485 A/B kablolari ters baglanmis
Kontrol Adimlari:
# Cihazin fiziksel durumunu kontrol et:
# - Guc LED'i yaniyor mu?
# - RS485 iletisim LED'i var mi, yanip sonuyor mu?
# Farkli slave ID'leri sirayla dene (1-10 arasi tarama)
# Gateway loglarinda:
# Modbus scan: Slave 1 → Timeout
# Modbus scan: Slave 2 → Response OK
# Farkli baud rate dene:
# 9600, 19200, 38400, 115200
Cozum:
- Guc kontrolu: Cihazin enerjili ve calisiyor durumda oldugundan emin olun
- Slave ID: Cihaz uzerindeki fiziksel ayardan (DIP switch, ekran menusu) gercek slave ID'yi ogrenerek template'e girin
- Baud rate: Cihaz fabrika ayarlarini dokumantasyondan kontrol edin. En yaygin: 9600 (enerji analizoru), 9600/19200 (inverter)
- A/B ters: A ve B kablolarini ters baglamayi deneyin — bazi ureticiler ters etiketleme yapar
- Timeout suresi: Gateway firmware'inde response timeout'u 100ms → 500ms'ye cikararak yeniden deneyin
3. Yanlis Deger Okuyor
Semptom: Modbus'tan deger geliyor ama anlamsiz veya cok buyuk/kucuk. Ornegin inverter gucu 4.294.967.295 W gosteriyor veya gerilim 0.023 V cikiyor.
Olasi Sebepler:
- Byte order (endianness) hatasi: Cihaz Big Endian, template Little Endian bekliyor veya tam tersi
- Register offset: Template'de yazilan register adresi 1 eksik veya fazla (0-based vs 1-based)
- Scale factor: Cihaz degeri 10x veya 100x olcekli gonderiyor, template'de carpan tanimlanmamis
- Veri tipi uyumsuzlugu: 32-bit float okunmasi gerekirken 16-bit integer okunuyor
Kontrol Adimlari:
# Raw hex degeri logla ve el ile hesapla
# Ornek: Register 0x0000'den 2 register okundu
# Raw: [43 48 00 00]
# Big Endian Float32: 200.0 (dogru)
# Little Endian Float32: 1.54e-41 (yanlis!)
# Template'deki tanimlama:
# register: 0x0000
# data_type: float32
# byte_order: big_endian ← bu dogru mu?
# scale: 1.0 ← carpan dogru mu?
Cozum:
- Byte order duzeltme: Cihaz dokumantasyonundaki byte order bilgisine gore template'i guncelleyin:
big_endian(AB CD) — en yayginlittle_endian(CD AB)big_endian_word_swap(CD AB) — bazi Sofar inverterlerlittle_endian_word_swap(AB CD) — nadir
- Register offset: Modbus dokumantasyonlarinda 1-based (40001) olabilir — 0-based'e cevirirken 1 cikartin (40001 → 0)
- Scale factor: Dokumantasyonda "unit: 0.1 kW" yaziyorsa template'de
scale: 0.1ekleyin - Veri tipi:
uint16,int16,uint32,int32,float32seceneklerini dokumantasyona gore ayarlayin
4. Iletisim Aralikli Kopuyor
Semptom: Modbus iletisimi bazi zamanlarda calisiyor, bazi zamanlarda timeout veriyor. Duzensiz kesintiler yaşanıyor.
Olasi Sebepler:
- RS485 bus uzerinde cok fazla cihaz → bus collision
- Polling intervali cok kisa → cihazlar yanit vermeye yetisemiyor
- EMI kaynaklari belirli saatlerde aktif (motor, kompressor vb.)
- Gevşek kablo baglantisi
Kontrol Adimlari:
# Basarili/basarisiz okuma oranini logla
# Son 1 saat: 850/1000 basarili (%85)
# ← %95'in altinda fiziksel sorun var
# Ayni bus'taki cihaz sayisini kontrol et
# RS485 standardi: max 32 cihaz (bazi driver'lar 128)
# Polling interval: her cihaz icin minimum 100ms bekleme
# 10 cihaz x 5 register x 100ms = 5 saniye minimum tur suresi
Cozum:
- Polling interval artirma: Her okuma arasinda en az 100ms bekleme suresi birakin
- Bus segmentasyonu: 10'dan fazla cihaz varsa ayrı RS485 bus segmentleri olusturun
- Oncelik sirasi: Kritik cihazlari (inverter) daha sik, az kritik cihazlari daha seyrek poll edin
- Kablo kontrolu: Terminal vidalari sıkın, gevşek baglanti aralikli kesintinin en yaygin sebebidir
- EMI izolasyonu: Optik izolasyonlu RS485 donusturucu kullanin
5. Function Code Hatasi
Semptom: Modbus Exception: Illegal Function (01) hatasi donuyor. Cihaz istegi reddediyor.
Olasi Sebepler:
- Cihaz istenen function code'u desteklemiyor
- Holding Register (FC3) yerine Input Register (FC4) gerekiyor veya tam tersi
- Write isleminde (FC6/FC16) cihaz sadece read-only destekliyor
Kontrol Adimlari:
# Modbus function code'lari:
# FC3 = Read Holding Registers (en yaygin)
# FC4 = Read Input Registers
# FC6 = Write Single Register
# FC16 = Write Multiple Registers
# Gateway loglarinda:
# Modbus TX: [01 03 00 00 00 02 ...] ← FC3 ile istek
# Modbus RX: [01 83 01 ...] ← Exception 01 (Illegal Function)
# ↑ 0x83 = 0x80 + 0x03 → FC3 exception
# Cihaz dokumantasyonundan desteklenen FC'leri kontrol et
Cozum:
- FC4 deneyin: FC3 (Holding Register) hata veriyorsa FC4 (Input Register) ile okuma deneyin — bircok enerji analizoru sadece FC4 destekler
- Dokumantasyon kontrolu: Cihazin Modbus register haritasini inceleyerek hangi register grubunun hangi FC ile okunacagini belirleyin
- Template guncelleme: Raw template dosyasinda
function_codealanini dogru deger ile guncelleyin - Write koruması: Bazi register'lar read-only'dir — write denemesi exception uretir, template'de
read_only: trueisaretleyin
Modbus Teshis Kontrol Listesi
Bir Modbus sorunu ile karsilastiginizda su adimlari sirasiyla uygulayın:
- Fiziksel katman: Kablo, terminal, guc kaynagi kontrol
- Iletisim parametreleri: Baud rate, parity, stop bit
- Adresleme: Slave ID ve register adresleri
- Veri yorumlama: Byte order, veri tipi, scale factor
- Zamanlama: Polling interval, timeout suresi
Sorunun gateway'de mi yoksa cihazda mi oldugunu anlamak icin bagimsiz bir Modbus aracı (ornegin bilgisayara USB-RS485 donusturucu + ModbusPoll/QModMaster) ile dogrudan cihazi okumayı deneyin. Bu test basariliysa sorun gateway firmware/config'indedir.