Cihazınızı İnternete Açın: Modbus TCP/IP!
Haberleşme metotları, gerek data aktarmak olsun gerekse canlı debug için kullanılır olsun cihazların çok sık birbirleriyle konuştuğu günümüzde olmazsa olmazlardan sayılır. Bu yüzden mikrodenetleyicilerin çoğu en az bir UART, SPI ya da I2C data hatlarına sahiptir; bunların içinden UART ise haberleşme için en sık tercih edilen haberleşme metodu sayılabilir. Bu yöntemde gürültüler ve uzun mesafede haberleşmelerde parazit kapma problemleri olabileceği için daha önce buradaki yazımda modbus haberleşme protokolünden bahsetmiş ve detaylı irdelemiştik. Daha sonrasında ise herkesin kullanabilmesi için özellikleri kısıtlanmış “Petit Modbus” kütüphanemi, burada anlatmış ve GitHub üzerinden paylaşmıştım.
Bir cihazı uzaktan kontrolü yukarıda anlattığım metotlarla yapılabilir olsa da bunlar özel iletişim hatları içereceğinden esneklikleri sınırlı olacaktır. Oysa zaten tüm dünyayı saran yapısı ile internet ağları, oldukça standartlaşmış ve belli bir güvenlik seviyesinde yapılar ortaya koyduğundan, tasarladığınız cihazı ağa açmak, onun uzaktan kontrolünü oldukça kolaylaştıracaktır. Bu metotlar içerisinde bir çok yöntem olsa da kullanıl yaygınlığı ve kolaylığı nedeniyle Modbus TCP karşımıza çıkmaktadır.
Modbus TCP Nedir?
Günlük hayatta kullandığımız Modbus ASCII ve RTU yapıları, seri haberleşme altyapısı üstüne kurulmuş protokollerdir. Modbus TCP, modern endüstriyel otomasyon ve kontrol sistemleri için ideal olan, cihazlar arası iletişimi sağlamak için Transmission Control Protocol (TCP) ve Internet Protocol (IP) kullanır. Bu da ethernet ağları üzerinden daha güvenilir ve verimli veri alışverişi sağlar. Bu adapte olma, endüstriyel uygulamalarda popüler bir tercih haline gelmesini sağlamaktadır, çünkü daha iyi performans, ölçeklenebilirlik ve mevcut ağ altyapısıyla kolay entegrasyon sunmaktadır.Modbus RTU ve TCP arasındaki en belirgin fark yukarıda görülebilir. Modbus RTU protokol yapısı, genelde RS485 gibi diferansiyel hatlar üzerinde olsa da temelde seri haberleşmeyi kullandığından, elektriksel gürültülerden dolayı yanlış data transferine yer vermemek için CRC16 kullanır.
Modbus TCP’de ise CRC kullanılmaz. TCP (Transmission Control Protocol) hali hazırda kabul görmüş, güvenilir bir iletişim protokolü olduğu için kendi içerisinde veri bütünlüğünü sağlamak, veri paketlerinin doğru sırayla iletilmesini garanti etmek ve iletişim hatasını algılamak için çeşitli mekanizmalara sahiptir. TCP’nin sağladığı bu güvenilirlik, CRC gibi ek hata kontrol mekanizmalarının kullanılmasını gereksiz hale getirir. Bu nedenle, Modbus TCP iletişiminde CRC yerine, TCP’nin kendi hata algılama ve düzeltme mekanizmalarından yararlanılır.
Burada ek olarak karşımıza çıkan Modbus TCP MBAP başlığı (Modbus Application Protocol Header) ise Modbus TCP iletişiminde kullanılan özel bir başlıktır. Bu başlık, iletişimde yer alan bilgileri içerir ve iletişimdeki mesajların doğru şekilde yönlendirilmesini sağlar. MBAP başlığının ana bileşenleri şu şekilde tanımlanır:
1) İşlem Tanımlayıcısı (Transaction Identifier): İletişimdeki her mesaj için benzersiz olarak atanır. Bu tanımlayıcı, bir mesajın doğrulanmasına ve yanıtının takip edilmesine yardımcı olur. Genellikle gönderilen data karşıdan cevap olarak beklenir.
2)Protokol Tanımlayıcısı (Protocol Identifier): Modbus TCP için sabit bir değer olan 0 olarak ayarlanır. Bu değer, mesajın Modbus TCP protokolünü kullandığını belirtir.
3) Uzunluk (Length): MBAP başlığı ve PDU (Protokol Veri Birimi) toplamının uzunluğunu belirtir. Bu, alınacak olan mesajın boyutunu belirler.
4) Birim Tanımlayıcısı (Unit Identifier): İletişimde yer alan cihazın adresini belirtir. Modbus TCP’de IP adresi ana adres belirleyici olduğu için bu değer genellikle 0 olarak ayarlanır.
5) Fonksiyon Kodu (Function Code): Modbus RTU’da olduğu gibi istenilen fonksiyonun kodunu ifade eder. En çok kullanılan değerler Read Holding Registers (0x03), Write Single Register (0x06) ve Write Multiple Registers (0x16) şeklindedir.
6) Data: İstemcinin istediği değerlerin tümünü ifade eder. Data iki ana parçadan oluşur, istemci yani master için başlangıç adresi (16bit) ve kaç adet veri okunacağı bilgisi (16bit) içerirken, slave tarafında ise byte sayısı ve verilerden oluşur.
Aşağıda örnek bir Modbus TCP’nin istek ve cevapları görülebilir:
Master İstek [hex]: 00 00 00 00 00 06 01 03 00 00 00 02
Transaction Identifier: 00 00 (İşlem tanımlayıcısı)
Protocol Identifier: 00 00 (Protokol tanımlayıcısı)
Uzunluk: 00 06 (Mesaj uzunluğu)
Birim Tanımlayıcısı: 01 (Cihazın birim tanımlayıcısı)
Fonksiyon Kodu: 03 (Okuma işlevi)
Başlangıç Adresi: 00 00 (Okuma işlemine başlanacak adres)
Okuma Sayısı: 00 02 (İki adet register okunacak)
Slave Cevap [hex]: 00 00 00 00 00 05 01 03 04 56 78 23
Transaction Identifier: 00 00 (İşlem tanımlayıcısı)
Protocol Identifier: 00 00 (Protokol tanımlayıcısı)
Uzunluk: 00 05 (Mesaj uzunluğu)
Birim Tanımlayıcısı: 01 (Cihazın birim tanımlayıcısı)
Fonksiyon Kodu: 03 (Okuma işlevi)
Byte Sayısı: 04 (Döndürülen byte sayısı)
Register Değerleri: 56 78 ve 23 01 (İki register değeri)
TCP/IP Protocol Stack
Modbus TCP, yukarıda da değindiğimiz gibi aslında Modbus RTU’dan daha sade ve basit bir protokol olsa da bu haberleşmenin kurulacağı TCP/IP temeli bir o kadar karmaşıktır. Söz konusu, kaynakları oldukça kısıtlı mikrodenetleyiciler ile ağa bağlanmak olduğunda ise TCP/IP protokol kütüphanesi önem kazanır. TCP/IP stack’i konusunda, özellikle mikrodenetleyicilere uIP adlı popüler stack’i hazırlamış olan Adam Dunkels‘ı anmadan geçmek olmaz. FatFS kütüphanesi gibi çok ünlü olan bu kütüphane, bir çok marka tarafından desteklenmiş ve şu an internet of things dediğimiz şeylerin internetinin altyapısını oluşturmuştur. Yalnız haberleşmelere ve yazılıma aşina olmayan kişiler için kütüphane orta/zor düzeyinde karmaşıktır.
Bir güç elektronikçi olarak karmaşık haberleşmeler ve TCP/IP protokol stack’i çoğu zaman alanım dışında olsa da IoT’nin gelişen evreniyle beraber bizlerin de kullanabileceği, internet ağlarına otomatik bağlanabilen ve fiyat performansı oldukça güçlü entegrelere ulaşılabilirlik kolaylaşmıştır.
Modbus RTU over TCP/IP Nedir?
Modbus RTU over TCP/IP, Modbus RTU protokolünün TCP/IP ağı üzerinden iletilmesini sağlayan bir iletişim yöntemidir. Bu yöntem, Modbus RTU’nun seri haberleşme özelliklerini (Rs232 veya Rs485 gibi) kullanarak cihazlar arasında iletişim kurmasına olanak tanırken, TCP/IP protokolünün avantajlarını sağlar. Bu yöntemde, Modbus RTU mesajları TCP/IP paketleri içinde taşınır. Bu sayede, Modbus RTU’nun endüstriyel otomasyon ve kontrol sistemlerinde kullanılan güvenilirliği ve verimliliğiyle birlikte, TCP/IP’nin geniş ağ iletişim standartlarından faydalanılır. Bu da Modbus RTU tabanlı cihazların Ethernet ağlarına entegrasyonunu kolaylaştırır.Bu yöntem özellikle Modbus RTU yapısı değiştirilemeyen cihazlar için geliştirilmiştir. Yukarıdaki şemadan da görülebileceği gibi, Modbus RTU ve Rs485 üzerindne haberleşen bir cihazı öncelikle Rs485/TCP-IP çeviriciden geçirerek ağa açabilir ve veri akışı sağlayabiliriz. Modbus RTU over TCP/IP’nin günümüz yeni cihazların çoğunda artık olmasa da, eskiyi desteklemek için hâlâ kullanılan bir yapı olduğunu söylemek gerekir.
Uygulama Örneği!
Modbus RTU’nun basit haberleşme protokolünü daha önce, buradan ulaşabileceğiniz yazıda sizlerle paylaşmıştım. Petit Modbus her ne kadar giriş seviyesi için kullanılabilir bir kütüphane olsa da bazı kısıtlarının olduğundan bahsetmiştim. Modbus TCP ile birlikte yaklaşık 11 yıldır geliştirmekte olduğum Modbus kütüphaneme TCP komutlarını yerleştirerek aşağıdaki uygulamayı gerçekledim.Petit Modbus kullananların bildiği gibi hazırladığım kütüphaneyi taşımak ve istediğiniz mikrodenetleyiciye uyarlamak oldukça kolay olduğundan buradaki örnekte sadece 8 bacaklı, daha önce burada değindiğim Puya işlemciyi kullandım. IP adresini 192.168.1.200 ve bağlantı portunu da 502 ayarlayıp, daha sonra da ev ağıma bağlanarak aşağıdaki videoda göreceğiniz uygulamayı yaptım. Uygulamada 1 ve 2. adreslerde sinüs ve cosinüs koşarken, 5-6-7-8-9. adreslerdeki datayı sırayla 10-11-12-13 ve 14. adreslere yazdım. Modbus Poll programının yeni chart özelliği ile de verileri görselleştirdim.
Kütüphaneyi Edinmek İçin…
Şu an, TCP protokolünü de dahil etmiş olduğum, içerisinde master ve slave kütüphanelerini aynı anda barındıran ve V1.5 versiyonuna ulaşan Modbus kütüphanemi maalesef açık kaynak olarak sunamıyorum. Aşağıda header dosyasının başlangıcı görülebilecek kütüphaneye edinmek isteyen tasarımcıların iletişim bölümünden bana ulaşmaları gerekmektedir.
Bitirirken…
Modbus, ilk tanıştığım günden bugüne hemen hemen her tasarladığım cihazda kullandığım, gerek debug gerekse haberleşme için en sevdiğim protokollerden biri olmuştur. Özellikle güç elektroniği alanında gürültüye karşı bağışık olması, CAN haberleşmesinden sonra Modbus’ı benim için vazgeçilmez yapmıştır. Günümüzde artık hemen hemen her cihazın internete bağlanabildiği bu ortamda Modbus TCP, otomasyonun ve haberleşmenin temel yapıları haline gelmiştir. Yeni çıkan ürünlerle beraber, tasarımcılara sunulan yeni imkanlar ise her geçen gün hızlanan teknolojinin bize sunduğu nimetler olarak görülebilir. Gelecekte çok daha karmaşık haberleşme sistemlerinin, çok daha kolay kullanılabilir olduğuna tanık olacağımız günlerin çok yakın olduğuna inanıyorum.
Yukarıdaki çalışmalarımda bana çokça yardımı dokunan İbrahim Tanağardıgil‘e teşekkürü bir borç bilirim.
Soru ve önerilerinizi yorumlar kısmından iletebilirsiniz.
Herkese çalışmalarında başarılar dilerim!
Merhaba. Elinize sağlık. Kütüphaneyi edinmemiz için ne yapmak gerekir?
Merhabalar,
Kütüphane maalesef ücretsiz değildir, edinmek için iletişim bölümünden ulaşıp bilgi alabilirsiniz.
Merbaha, harici TCP/IP çevirici mi kullandınız?
Evet, TCP/IP çeviricilerden yararlandım.
Fakat çevirici kullanmasam dahi küçük işlemcilerle çalışmak için mutlaka fiziksel çevrim yapan bir entegre kullanma zorunluluğum olacaktı, özellikle trafolu ethernet soketlerini sürmek için.
Dolayısı ile içerisinde trafolu ethernet soketini sürebilecek SPI ya da UART çalışabilen TCP/IP çeviriciler fiyat anlamında da kullanılabilir gözüküyor.