PLC Veri Toplama Rehberine Geri Dön

Modbus TCP/IP ile PLC Verisi Okuma ve Entegrasyon Aşamaları

Endüstriyel sahadaki makinelerden, PLC'lerden ve enerji analizörlerinden veri toplamanın en köklü ve evrensel yolu olan Modbus TCP/IP protokolünü, register mimarisini ve adım adım MES entegrasyon yöntemlerini keşfedin.

30 Temmuz 2026 12 dk okuma Oemsoft Otomasyon & IoT Ekibi
📋 Özet (BLUF)

Modbus TCP/IP, endüstriyel cihazların standart Ethernet (TCP/IP) ağları üzerinden haberleşmesini sağlayan, açık kaynaklı, lisans maliyetsiz ve evrensel bir istemci-sunucu (Client-Server) protokolüdür. Varsayılan TCP 502 portu üzerinden çalışan bu yapı; PLC kontrolörleri, enerji analizörleri, sürücüler ve sıcaklık kontrol cihazlarından sayısal (Coil/Discrete Input) ve analog (Holding/Input Register) verileri milisaniyeler seviyesinde okumayı mümkün kılar. Doğru yapılandırılmış bir Modbus TCP/IP entegrasyonu; MES (Üretim Yürütme Sistemi) ve Üretim Verisi Analitiği altyapılarına kesintisiz, düşük gecikmeli ve güvenilir gerçek zamanlı makine verisi sağlar.

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:

[ MES / SCADA / Edge Gateway ] (Modbus TCP Client / Master) │ │ TCP/IP Port 502 (Ethernet Switch) ├──► [ PLC 1 - Siemens S7-1200 ] (Modbus Server / Slave ID: 1) ├──► [ PLC 2 - Schneider M241 ] (Modbus Server / Slave ID: 1) └──► [ Enerji Analizörü Gateway ] (Modbus Gateway -> RTU Slave ID: 2,3,4)
  • 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ı.
⚠️ Kritik Mühendislik İpucu: 0-Index vs 1-Index Adresleme ve Ofset Farkı

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, %MW100 gibi 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ı 40010 adresindeyse, 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

Sıkça Sorulan Sorular (SSS)

Modbus TCP/IP; 1979 yılında geliştirilen açık kaynaklı Modbus protokolünün standart Ethernet (TCP/IP) ağları üzerinden çalışabilen modern versiyonudur. Lisans ücreti gerektirmemesi (royalty-free), son derece basit register yapısı, minimum donanım kaynağı tüketmesi ve dünyadaki neredeyse tüm PLC, analizör ve sensör markaları tarafından desteklenmesi nedeniyle endüstri standardı haline gelmiştir.
Modbus RTU; seri hatlar (RS-485 veya RS-232) üzerinden bayt tabanlı veri aktarır ve veri bütünlüğünü CRC (Cyclic Redundancy Check) ile sağlar. Modbus TCP/IP ise standart Ethernet kabloları ve switch altyapısıyla 502 portu üzerinden çalışır, hata kontrolünü TCP katmanına bırakır ve 7 baytlık MBAP (Modbus Application Protocol) başlığı içerir. Bu sayede çok daha yüksek hız, uzun mesafe ve standart IT ağları ile doğrudan entegrasyon sunar.
Input Register (3x adres bloğu), sadece okunabilir (Read-Only) 16-bitlik veri alanıdır ve genellikle sensörlerden gelen anlık sıcaklık, basınç gibi analog giriş değerlerini temsil eder. Holding Register (4x adres bloğu) ise hem okunabilir hem yazılabilir (Read/Write) 16-bitlik hafıza alanıdır; set değerleri, reçete parametreleri, çevrim sayıları ve kontrol komutları için kullanılır.
Modbus veri tablosunda adresler genellikle 1'den başlar (Örn: Holding Register 40001), ancak haberleşme paketindeki (PDU) gerçek protokol ofset değeri 0'dan başlar (0x0000). Birçok PLC ve SCADA yazılımında 40001 adresi 0 ofsetine denk gelir. Eğer okuduğunuz veri bir önceki veya bir sonraki register'a kayıyorsa, yazılımınızın 0 tabanlı mı yoksa 1 tabanlı mı adresleme yaptığını kontrol edip 1 sayı ekleyerek/çıkararak eşitlemeniz gerekir.
Modbus register'ları 16-bit (2 bayt) uzunluğundadır. 32-bitlik Float veya Çift Tamsayı (DINT) değerleri okumak için 2 ardışık register birleştirilir. Ancak cihaz üreticileri bayt ve kelime sıralamasını (Big-Endian veya Little-Endian / Word Swap) farklı uygulayabilir. Eğer okunan sayı anlamsız çıkıyorsa (örneğin 25.4 °C yerine devasa bir sayı), okuma motorunuzda "Word Swap" (CDAB) veya "Byte Swap" (BADC) dönüşümü aktif edilmelidir.