Arduino, ESP8266 ve ESP32 ile Modbus Kullanımı

Modbus, endüstriyel cihazlar arasında iletişim kurmak için kullanılan bir protokoldür. Modbus komutları, cihazlar arasında veri alışverişini sağlayan temel talimatlardır. Modbus ın çalışabilmesi için 1 tane Master (Yönetici) cihaza ve en az 1 tane Slave (Köle) cihaza ihtiyaç vardır.

Modbus protokolünde bir ağda bulunabilecek slave cihaz sayısı, kullanılan iletişim türüne ve protokolün spesifikasyonlarına göre değişir.

Modbus RTU (Remote Terminal Unit) (Seri İletişim):

Modbus RTU’da adresleme 1’den 247’ye kadar yapılır. Yani teorik olarak en fazla 247 slave cihaz bağlanabilir.

Ancak pratikte bu sayı, kablo uzunluğu, baud rate (iletişim hızı) ve kullanılan donanımın fiziksel sınırlamaları nedeniyle daha az olabilir. Genellikle bir RS-485 hattında 32 cihaza kadar stabil çalışır, ama repeater (tekrarlayıcı) kullanılarak bu sayı artırılabilir.

Modbus TCP (Ethernet Üzerinden):

Modbus TCP’de teorik bir slave limiti yoktur çünkü IP adresleme kullanılır. Ancak ağın kapasitesi, master cihazın yetenekleri ve ağ altyapısı (switch, router vb.) bu sayıyı kısıtlar. Yani binlerce slave cihaz bile mümkün olabilir, ama bu pratikte nadiren uygulanır.

Özetle Modbus RTU’da maksimum 247 slave, Modbus TCP’de limit ağ tasarımına bağlıdır. RTU ya göre teorik olarak çok daha yüksektir.

Modbus Nasıl Çalışır:

Master cihaz belirli aralıklarla Slave cihaza komut gönderir ve Response (Cevap) bekler. Bu komutlar şu şekildedir:

Okuma Komutları:

Read Coils (01): Dijital çıkışları (örneğin, açık/kapalı durumlarını) okur.

Read Discrete Inputs (02): Dijital girişleri (sensör durumları gibi) okur.

Read Holding Registers (03): Analog veya genel veri register’larını okur.

Read Input Registers (04): Sadece okunabilir analog giriş register’larını okur.

Yazma Komutları:

Write Single Coil (05): Tek bir dijital çıkışı (örneğin, bir röleyi) açar veya kapatır.

Write Single Register (06): Tek bir register’a veri yazar (örneğin, bir ayar değeri).

Write Multiple Coils (15): Birden fazla dijital çıkışı aynı anda kontrol eder.

Write Multiple Registers (16): Birden fazla register’a veri yazar.

Nasıl Çalışır?

Bir “master” cihaz (örneğin, bir PLC), “slave” cihazlara (sensörler, motorlar vb.) bu komutları gönderir.

Slave cihaz, komuta göre ya veri döndürür (okuma) ya da istenen değişikliği yapar (yazma).

Arduino, ESP8266 ve ESP32 ile Modbus Nasıl Kullanılır?

MBModbusRTUSlave isimli kütüphane ile Arduino, ESP8266 veya ESP32 gibi bir geliştirme kartımızı Modbus Slave cihazı gibi kullanacağız. Bu kütüphane Geliştirme kartımızın USB girişine bağlı olan UART (Universal Asynchronous Receiver/Transmitter) (Evrensel Asenkron Alıcı/Verici) Donanımsal Seri Port arayüzünü kullanır ve Bilgisayarımızda bulunan Modbus Master (Modbus Poll gibi) yazılımı ile Seri Port üzerinden iletişim kurar. Kütüphaneyi özelleştirerek Software Serial (Yazılımsal Seri Port) kullanarak PLC ile de Modbus üzerinden haberleştirilebilir.

MBModbusRTUSlave Kullanımı

Kütüphanenin kullanımı oldukça basittir. Geliştirilme amacı Arduino için basit ve esnek bir Modbus RTU slave kütüphanesidir. Arduinı IDE ye library sekmesinden kolayca yüklenir. İsterseniz zip dosyasını indirerek de kurabilirsiniz. ModbusRTUSlave kütüphanesini manuel yüklemek için indiriniz.

MBModbusRTUSlave Örnek Kod

Kod aşağıda verilmiştir. İletişim RTU (Remote Terminal Unit) olacağı için önce modbusBaudRate ayarlanmıştır. Kütüphane 1 tane yazma çıkışı Write Single Coil (05) ve istenilen sayıda veri registerı Read Holding Registers (03) oluşturur. En sondaki 10 parametresi register count’ u oluşturur. Registerın 0. byte’ ı her zaman LED olmaktadır.

#include <MBModbusRTUSlave.h>

long modbusBaudRate = 9600;  // Customizable baud rate
MBModbusRTUSlave modbus(0x01, 13, 5, 10);  // Slave address: 0x01, LED pin: 13, LED register: 5, Register Count: 10

void setup() {
  modbus.begin(modbusBaudRate);
  Serial.println("Modbus started");
}

void loop() {
  modbus.update();
}

Kütüphane Şahin MERSİN tarafından geliştirilmiştir. Destek ve öneri için issue açabilirsiniz. İyi çalışmalar.

https://github.com/electrocoder/MBModbusRTUSlave/issues