Modbus TCP/IP Nedir ve Neden Endüstri Standardıdır?
İlk olarak 1979 yılında Modicon (günümüzde Schneider Electric) tarafından PLC sistemleri için geliştirilen Modbus, endüstriyel otomasyon dünyasının ilk standart iletişim protokolüdür. 1999 yılında ise Ethernet ağlarının yaygınlaşmasıyla birlikte TCP/IP protokol ailesine uyarlanmış ve Modbus TCP/IP standardı doğmuştur.
Aradan geçen 40 yılı aşkın süreye rağmen, modern akıllı fabrikalarda OPC UA ve Profinet gibi gelişmiş protokollerin yanında Modbus TCP/IP'nin hâlâ en çok kullanılan protokol olmasının nedenleri şunlardır:
- Açık ve Telifsiz (Royalty-Free): Herhangi bir şirketin mülkiyetinde değildir (Modbus Organization tarafından yönetilir) ve lisans ücreti olmadan her donanıma entegre edilebilir.
- Düşük Donanım Maliyeti: Karmaşık bir protokol yığını gerektirmez; mikrodenetleyicilerden en güçlü endüstriyel bilgisayarlara kadar her cihazda kolaylıkla çalışır.
- Evrensel Donanım Desteği: Siemens, Schneider Electric, Omron, Delta, ABB, Mitsubishi, Beckhoff, WAGO ve neredeyse tüm yerli/yabancı sensör ve analizör markaları dahili Modbus TCP desteği sunar.
- Kolay Teşhis ve Hata Ayıklama: Basit paket mimarisi ve standart fonksiyon kodları sayesinde ağ analizörleri (Wireshark) ve test yazılımları (Modbus Poll) ile saniyeler içinde sorun tespiti yapılabilir.
Modbus TCP/IP Mimarisinin Çalışma Mantığı
Geleneksel Modbus RTU mimarisinde bir Master (Efendi) ve ona bağlı birden fazla Slave (Köle) cihaz seri kablo (RS-485) üzerinde haberleşirken; Modbus TCP/IP'de bu yapı Ethernet dünyasının Client (İstemci) ve Server (Sunucu) modeline dönüşür:
- Modbus Client (İstemci): Veriyi talep eden taraftır. MES yazılımları, SCADA sistemleri, veri toplama servisleri veya IoT Gateway'ler Client rolünü üstlenir. İstemci belirli aralıklarla (Polling) sorgu paketleri gönderir.
- Modbus Server (Sunucu): Veriyi üreten ve Client'tan gelen istekleri yanıtlayan sahadaki cihazdır. PLC'ler, akıllı röleler ve CNC kontrolörleri Server olarak çalışır.
- Port 502: IANA tarafından Modbus TCP protokolüne ayrılmış standart port numarasıdır. Tüm haberleşme TCP 502 portu üzerinden gerçekleşir.
Modbus TCP/IP Paket Anatomisi (MBAP Header + PDU)
Modbus RTU paketlerinde bulunan CRC hata kontrol baytları Modbus TCP'de kaldırılmıştır; çünkü Ethernet TCP/IP katmanı kendi hata kontrolünü (Checksum) otomatik olarak yapar. Bunun yerine paketin başına 7 baytlık MBAP (Modbus Application Protocol) Header eklenir:
| Alan (Field) | Uzunluk | Açıklama |
|---|---|---|
| Transaction Identifier | 2 Bayt | İstemci tarafından üretilen benzersiz sorgu kimliğidir. Yanıt geldiğinde hangi isteğe ait olduğunu eşleştirmek için kullanılır. |
| Protocol Identifier | 2 Bayt | Modbus protokolü için her zaman 0x0000 değerini alır. |
| Length | 2 Bayt | Paketin geri kalanının (Unit ID + Function Code + Data) toplam bayt uzunluğunu belirtir. |
| Unit Identifier (Slave ID) | 1 Bayt | Doğrudan PLC bağlantılarında genellikle 1 veya 255 değerini alır. Seri hat köprüsü (Gateway) arkasındaki cihazları ayırt etmek için kritik öneme sahiptir. |
| Function Code (PDU) | 1 Bayt | Sunucudan hangi işlemin yapılması istendiğini belirten operasyon kodudur (Örn: 03 = Read Holding Registers). |
| Data Payload (PDU) | N Bayt | Okunacak/yazılacak register adresi, veri adedi veya yazılacak değerleri içeren veri alanıdır. |
Modbus RTU ve Modbus TCP/IP Karşılaştırması
Sahadaki otomasyon projelerinde sıkça karşılaşılan iki protokol arasındaki temel teknik farklar aşağıdaki tabloda özetlenmiştir:
| Kriter | Modbus RTU | Modbus TCP/IP |
|---|---|---|
| Fiziksel Katman | Seri İletişim (RS-485 / RS-232 / RS-422) | Standart Ethernet (Bakır RJ45, Fiber Optik, Wi-Fi) |
| İletişim Hızı | 9.600 - 115.200 bps (Düşük/Orta) | 10 / 100 / 1000 Mbps (Yüksek Hız) |
| Maksimum Düğüm Sayısı | RS-485 hattı başına 32 (tekrarlayıcı ile 247) | IP ağı kapasitesine bağlı (Teorik olarak sınırsız) |
| Eşzamanlı Bağlantı | Tekil sorgu (Sadece 1 Master aktif olabilir) | Çoklu Client (Aynı PLC'ye MES, SCADA ve Panel aynı anda bağlanabilir) |
| Hata Denetimi | 16-bit CRC (Cyclic Redundancy Check) | TCP/IP Katmanı Checksum Doğrulaması |
| Kablo Mesafesi | Maksimum 1.200 metre (RS-485) | Segment başına 100m (Switch/Router ile sınırsız fabrika ağı) |
Modbus Bellek ve Register Mimarisi (4 Temel Veri Bloğu)
Modbus protokolü, cihaz belleğini 4 farklı veri tablosuna ayırarak yönetir. Bir PLC'den veri okumak veya yazmak istediğinizde, verinizin hangi tabloya ait olduğunu ve register adresini bilmeniz gerekir:
| Tablo Türü | Adres Aralığı | Veri Boyutu | Erişim Türü | Tipik Kullanım Alanı |
|---|---|---|---|---|
| Discrete Inputs (Ayrık Girişler) | 10001 – 19999 (1x) | 1 Bit (0 veya 1) | Salt Okunur (Read-Only) | Optik sensörler, acil durdurma butonu, limit anahtarları, motor termik durumu. |
| Coils (Bobinler / Çıkışlar) | 00001 – 09999 (0x) | 1 Bit (0 veya 1) | Okunabilir & Yazılabilir (R/W) | Röle kontakları, ikaz lambaları, kontaktör çalıştırma komutları, start/stop bitleri. |
| Input Registers (Giriş Register'ları) | 30001 – 39999 (3x) | 16 Bit (1 Word) | Salt Okunur (Read-Only) | Sıcaklık transmitteri (PT100), basınç sensörü (4-20mA), anlık akım/gerilim değerleri. |
| Holding Registers (Tutma Register'ları) | 40001 – 49999 (4x) | 16 Bit (1 Word) | Okunabilir & Yazılabilir (R/W) | Üretim çevrim sayaçları, hedef hız ayarı, reçete parametreleri, hata kodları. |
Otomasyon sahasındaki en sık entegrasyon hatası adresleme ofsetinden kaynaklanır. PLC dökümanında 40001 olarak belirtilen ilk Holding Register, Modbus TCP iletişim paketinin (PDU) içinde 0x0000 (0. ofset) olarak taşınır. Bazı yazılımlar (Siemens TIA Portal, Python pymodbus) doğrudan ofset adresini (0) kabul ederken, bazı SCADA sistemleri tablo adresini (40001) bekler. Eğer okuduğunuz değer bir önceki veya bir sonraki adrese ait çıkıyorsa, sisteminizdeki ofset değerine +1 veya -1 uygulayınız.
En Çok Kullanılan Standart Modbus Fonksiyon Kodları
Modbus Client (İstemci), Server'dan veri okumak veya yazmak istediğinde isteğini belirli Fonksiyon Kodları (Function Codes) ile tanımlar:
| Kod (Hex / Dec) | İşlev Adı | Hedef Tablo | Açıklama |
|---|---|---|---|
01 (0x01) |
Read Coils | Coils (0x) | Ardışık 1-bitlik çıkış durumlarını (Açık/Kapalı) toplu olarak okur. |
02 (0x02) |
Read Discrete Inputs | Discrete Inputs (1x) | Ardışık fiziksel dijital girişlerin durumlarını okur. |
03 (0x03) |
Read Holding Registers | Holding Registers (4x) | En sık kullanılan koddur. 16-bitlik parametre, sayaç ve konfigürasyon register'larını okur. |
04 (0x04) |
Read Input Registers | Input Registers (3x) | 16-bitlik salt okunur analog sensör ölçüm verilerini okur. |
05 (0x05) |
Write Single Coil | Coils (0x) | Tek bir dijital çıkışı ON (0xFF00) veya OFF (0x0000) yapar. |
06 (0x06) |
Write Single Register | Holding Registers (4x) | Tek bir 16-bitlik Holding Register'a yeni değer yazar. |
15 (0x0F) |
Write Multiple Coils | Coils (0x) | Birden çok bobini tek bir paketle aynı anda set/reset eder. |
16 (0x10) |
Write Multiple Registers | Holding Registers (4x) | Reçete veya 32-bit Float sayı yazmak için ardışık register'ları topluca yazar. |
Modbus TCP/IP ile PLC'den Veri Okuma Aşamaları (Adım Adım)
Bir fabrikada üretim sahasındaki bir PLC'den MES veya veri toplama yazılımına Modbus TCP/IP ile veri aktarmak 5 temel adımdan oluşur:
1 Adım 1: PLC Üzerinde Modbus TCP Server Konfigürasyonu
İlk adım, PLC'nin Ethernet portuna sabit bir IP adresi atamak (Örn: 192.168.1.50) ve PLC programında Modbus TCP Server (Slave) fonksiyon bloğunu aktif etmektir:
- Siemens TIA Portal: MB_SERVER fonksiyon bloğu çağrılır, bağlantı parametreleri (Port: 502, Interface ID) girilir ve MB_HOLD_REG işaretçisi (Pointer) tanımlanan bir Veri Bloğuna (DB) bağlanır.
- Schneider EcoStruxure: Dahili Ethernet port ayarlarında Modbus Server varsayılan olarak aktiftir;
%MW0,%MW100gibi dahili bellek adresleri doğrudan 40001, 40101 Holding Register'larına eşlenir. - Omron / Delta / WAGO: Network ayarlarından Modbus TCP aktifleştirilir ve veri register alanları (D register / %MW) eşleştirilir.
2 Adım 2: Veri Tipi Dönüşümleri ve Endianness (Byte/Word Sıralaması)
Modbus register'ları sadece 16-bitlik (2 bayt) ham tam sayıları taşır. Ancak endüstriyel proseslerde 32-bit Float (Kayan Noktalı Gerçek Sayı), 32-bit Double Integer (DINT) veya 64-bit sayılar kullanılır.
32-bitlik bir sayıyı okumak için 2 ardışık Holding Register (Örn: 40001 ve 40002) birlikte okunur ve 4 bayt birleştirilir. Farklı işlemci mimarileri baytları farklı sıralar:
- Big-Endian (ABCD - High Byte First): En yüksek anlamlı bayt ilk sırada gelir. Standart Modbus kuralıdır.
- Big-Endian with Word Swap (CDAB): Kelimeler (16-bit bloklar) yer değiştirir. Siemens ve birçok modern PLC bu düzeni kullanır.
- Little-Endian (DCBA): En düşük anlamlı bayt ilk sıradadır.
- Little-Endian with Word Swap (BADC - Byte Swap): Her kelime içindeki baytlar yer değiştirir.
Doğru veri okuma motorları (Örn: Oemsoft Veri Toplayıcı), register haritası tanımlanırken otomatik Word/Byte Swap dönüştürme seçeneği sunar.
3 Adım 3: Sinyal ve Register Doğrulama Testi
MES veya SCADA yazılımına bağlamadan önce, sahadaki PLC ile haberleşmenin çalıştığı Modbus Poll, QModMaster gibi test araçları veya Python scripti ile doğrulanır:
- Ping atılarak PLC'nin IP erişilebilirliği test edilir.
- 502 portu üzerinden bağlantı kurulur (Slave ID: 1, FC03).
- Örneğin makinedeki parça sayacı
40010adresindeyse, makine çalıştığında bu register'daki değerin arttığı canlı olarak izlenir.
4 Adım 4: Polling (Sorgulama) ve Blok Okuma Optimizasyonu
Modbus TCP, OPC UA gibi kendiliğinden abonelik (Subscription) modeline sahip değildir; Client'ın belirli periyotlarla soru sorması (Polling) gerekir:
- Örnekleme Hızı: Kritik çevrim sayımları için 100ms – 250ms, enerji analizörleri ve ortam sıcaklığı için 1.000ms – 5.000ms sorgu frekansı idealdir.
- Blok Okuma (Block Read): 10 farklı register'ı 10 ayrı sorguyla okumak yerine, tek bir FC03 paketiyle 10 ardışık register aynı anda okunmalıdır. Bu sayede ağ trafiği ve PLC CPU yükü %90 oranında azalır.
5 Adım 5: MES ve Veritabanı Entegrasyonu
Okunan ham register değerleri, MES yazılımının veri işleme motoruna aktarılır:
- Sayaç değerleri iş emirleriyle eşleştirilir ve fiili üretim miktarı hesaplanır.
- Çalışıyor/Durdu bitleri analiz edilerek anlık OEE (Toplam Ekipman Etkinliği) ve duruş raporları üretilir.
- Sıcaklık ve basınç gibi analog veriler zaman serisi veritabanına kaydedilerek kestirimci kalite analizinde kullanılır.
Python ile Modbus TCP/IP PLC Verisi Okuma (Kod Örneği)
Aşağıdaki Python scripti, pymodbus kütüphanesi kullanarak bir PLC'den hem 16-bitlik tamsayı sayaç değerini hem de 32-bitlik kayan noktalı (Float) sıcaklık değerini (Word Swap uygulayarak) okuma mantığını göstermektedir:
# Gerekli kütüphane: pip install pymodbus from pymodbus.client import ModbusTcpClient from pymodbus.constants import Endian from pymodbus.payload import BinaryPayloadDecoder import time # 1. PLC Bağlantı Ayarları PLC_IP = '192.168.1.50' PLC_PORT = 502 SLAVE_UNIT_ID = 1 client = ModbusTcpClient(PLC_IP, port=PLC_PORT) try: if client.connect(): print(f"PLC'ye başarıyla bağlanıldı: {PLC_IP}:{PLC_PORT}") # 2. FC03: Holding Register Okuma (Ofset 0'dan itibaren 4 register) # Register 0: Makine Durumu (1=Çalışıyor, 0=Durdu) # Register 1: Üretim Adedi (16-bit INT) # Register 2-3: Fırın Sıcaklığı (32-bit Float) response = client.read_holding_registers(address=0, count=4, slave=SLAVE_UNIT_ID) if not response.isError(): registers = response.registers makine_durumu = registers[0] uretim_adedi = registers[1] # 3. 32-bit Float Dönüşümü (Big-Endian Byte, Little-Endian Word / CDAB) decoder = BinaryPayloadDecoder.fromRegisters( registers[2:4], byteorder=Endian.BIG, wordorder=Endian.LITTLE ) sicaklik = decoder.decode_32bit_float() print(f"--- PLC Canlı Verileri ---") print(f"Makine Durumu : {'ÇALIŞIYOR' if makine_durumu == 1 else 'DURDU'}") print(f"Üretim Adedi : {uretim_adedi} Adet") print(f"Fırın Sıcaklık: {sicaklik:.2f} °C") else: print(f"Modbus Okuma Hatası: {response}") else: print(f"PLC'ye bağlanılamadı! IP ve ağ kablosunu kontrol edin.") finally: client.close() print("Bağlantı kapatıldı.")
Yaygın Modbus Hata Kodları (Exception Codes) ve Çözümleri
Modbus haberleşmesinde bir istek geçersiz olduğunda sunucu cihaz standart bir Hata Yanıtı (Exception Response) döner:
| Hata Kodu | İsim | Olası Neden | Çözüm Adımı |
|---|---|---|---|
01 (0x01) |
Illegal Function | PLC gönderdiğiniz fonksiyon kodunu desteklemiyor (Örn: Cihaz sadece FC03 desteklerken FC04 gönderilmesi). | Cihazın kılavuzunu kontrol edin ve desteklenen doğru fonksiyon kodunu kullanın. |
02 (0x02) |
Illegal Data Address | Talep edilen register adresi PLC belleğinde tanımlı değil veya ofset taşması var (Örn: PLC'de 10 register varken 100. adresin istenmesi). | Register adres haritasını ve 0/1 ofset kaymasını doğrulayın. |
03 (0x03) |
Illegal Data Value | İstenen register adedi sınırın üzerinde (Modbus TCP tek pakette maks. 125 Holding Register okuyabilir). | Tek seferde okunan register sayısını (count) küçültün. |
04 (0x04) |
Slave Device Failure | PLC işlemcisi dahili bir hata ile karşılaştı veya veri bloğu kilitli. | PLC programını ve donanım diagnostik tamponunu (Diagnostic Buffer) inceleyin. |
11 (0x0B) |
Gateway Target Device Failed | Modbus TCP/RTU gateway arkasındaki seri cihaza erişemedi. | Seri kablo bağlantısını (A/B kutupları), baud rate ve hedef Slave ID numarasını kontrol edin. |
Oemsoft MES ile Kesintisiz Modbus Entegrasyonu
Oemsoft MES, endüstriyel haberleşme katmanında yerel olarak optimize edilmiş yüksek performanslı Modbus TCP/IP sürücüleri barındırır:
- Otomatik PLC Tarama ve Eşleme: Sahadaki Modbus cihazlarınızı hızlıca tanımlar, register bloklarını otomatik eşler.
- Dahili Byte & Word Swap Yönetimi: Float32, Float64, Int32 ve String veri tiplerini tek tıkla doğru formata dönüştürür.
- Akıllı Blok Okuma Motoru: Dağınık register'ları en az ağ paketi oluşturacak şekilde akıllı gruplayarak PLC CPU yükünü minimuma indirir.
- Eski Cihazlar İçin Modbus Gateway Çözümleri: Seri haberleşmeli (RS-485 Modbus RTU) eski makinelerinizi ve sayaçlarınızı endüstriyel gateway'lerimizle anında Modbus TCP ağına dahil eder.
- Canlı Dashboard ve OEE Entegrasyonu: Toplanan verileri anlık olarak OEE, duruş analizleri ve üretim takip ekranlarına yansıtır.
Fabrikanızdaki PLC'lerden Canlı Veri Toplamaya Başlayın
Oemsoft'un esnek Modbus TCP/IP ve OPC UA entegrasyon çözümleriyle makinelerinizi dakikalar içinde dijitalleştirin.
Ücretsiz Keşif & Demo Talep Edin