Fırat DEVECİ

Tarihi Haberleşme Metodu: Modbus RTU

  • 2 sene önce, Fırat DEVECİ tarafından yazılmıştır.
  • 23 Yorum
  • 12.325 Kişi Okudu

ModbusElektronik ve onun üzerine tasarım yapan herkes cihazlarını birbirleriyle haberleştirmek için çeşitli metotlar kullanır. Bu metotlar kullanıcılardan çeşitli parametreler alınması için olabileceği gibi, bir cihazın belirli parçaları arasında bilgi transferi için de kullanılabilirler. Günümüzde bilgisayarı az çok bilen kullanıcıların çoğu Ethernet, USB, HDMI gibi haberleşme metotlarına aşina olsa da alt seviyeye inildiğinde bir çok hayat kurtarıcı haberleşme tekniği bulunmaktadır; SPI, I2C, UART, CAN, One Wire ve daha bir çoğu. Bu iletişim metotlarının her birisi kendine has fiziksel alt yapıya sahiptir ve haberleşmenin yapılacağı fiziksel ortama göre değişiklikler gösterir; bunlardan en çok bilineni RS232, RS485 ve türevleridir.

İlk Modbus alt yapısı 1979 yılında, mikrodenetleyicilerin olmadığı, mikroişlemcilerin ise bebeklik çağlarını yaşadığı yıllarda, özellikle PLC’leri ve bunun türevi sistemleri haberleştirmek için Modicon firması (şu an herkes bu firmayı Schneider Electric olarak biliyor) tarafından oluşturularak kullanıcılara sunulmuştur. Bir adet master’ın bulunduğu sistem 247 adet slave cihaz okuyabilecek şekilde düzenlenebilir.

Modbus’ın yaygınlaşmasındaki en büyük etmen ise; kolay anlaşılabilir, cihazlara kolay adapte edilebilir olmasının yanında ücretsiz bir lisans altında kullanıcılara sunulması gösterilebilir.

Modbus, haberleşme ve fiziksel katman olarak ikiye ayrılmaktadır. Haberleşme katmanı olarak günümüzde en çok kullanılanları Modbus ASCII, RTU ve TCP/IP’dir. Fiziksel katman olarak ise UART temelli RS232/RS485, USB/CAN gibi değişik birimler ve TCP/IP için Ethernet gösterilebilir. Biz bu yazımızda kullanıcıların en çok tercih ettiği, RS485 ve Modbus RTU’yu ele alacağız.

Modbus RTU
Modbus içerisinde seri iletişim metodunu kullanan ASCII ve RTU adı altında iki haberleşme metodu bulunmaktadır. İkisi de birbirine benzese de RTU, ASCII iletişim metoduna göre daha hızlıdır. Bunu bir örnek ile açıklamak gerekirse; 12345 sayısının seri hat üzerinde gönderimi ASCII ile “1”, “2”, “3”, “4”, “5” şeklinde 5 ayrı byte ile yapılırken, RTU’da ise bu bilgi 2x8bit olacak şekilde MSB ve LSB olarak ikiye bölünür ve 2 byte şeklinde (12345/256 bir byte, 12345%256 bir byte) gönderilerek hız kazanımı sağlanmış olur. Bu yüzden günümüzde Modbus tarafında RTU, en sık tercih edilen seri iletişim metodu olarak görülmektedir.Modbus RTU FrameModbus RTU’nun frame yapısı yukarıda görülebilir. İlk byte’ta iletişim kurulacak cihazın adresi belirlenmelidir. Slave cihaz sayısı 247 adet olabileceğinden bu bölüme 0-247 arasında sayı yazılmalıdır. İkinci byte ise Modbus için standartlaşmış fonksiyon kodlarını ihtiva etmelidir. Bu fonksiyonlar aşağıdaki gibi tanımlanmıştır. Modbus FunctionsGünümüzde en çok tercih edilen Modbus RTU fonksiyonları 3, 6 ve 16’dır.

Bundan sonraki bölümde fonksiyon tanımlamalarına göre datalar düzenlenerek, slave adresi ve fonksiyon numarasının CRC16’ı da son iki byte’a yazılarak gönderim ve alım işlemleri sağlanır.Modbus RTU Wait TimeModbus RTU için mesaj gönderim yada alımlarında, iki mesaj arası minimum 3.5 karakterlik bekleme yapılmalıdır. Bu bekleme baudrate hızına göre değişkenlik gösterecektir. Örneğin 9600 baudrate için bu değer yaklaşık 3ms iken 115200 baud değeri için 0.25ms civarında olacaktır.

Modbus RTU Haberleşme Örneği
Modbus RTU’yu anlayabilmek için teorikten ziyade pratik uygulama üzerinden haberleşme metodunu anlamak çok daha kolaydır. Haberleşme örneğimizde sırasıyla 3 ve 16. fonksiyonları ele alacağız.
İlk olarak, fonksiyon 3 örneğimizde slave adresi 17 (0x11) olan cihazın 107 (0x6B) ve 108. (0x6C) register değerleri okunmak istendiğinde göndermemiz ve almamız gereken komutlar aşağıda görülebilir. Ayrıntılar için resmi büyütebilirsiniz. Read Holding RegistersCevap dikkatlice incelenirse, slave öncelikle kendi slave numarası ve kendisine gelen fonksiyon tanımını gönderdikten sonra 2×2 byte şeklinde veri ile bunların CRC16 değerini master’a göndermektedir. Tüm bu değerler doğru ise master cevabı kabul etmektedir.

Son olarak, fonksiyon 16 örneğimizde slave adresi 17 (0x11) olan cihazın 301 (0x12D) ve 302. adreslerine aynı anda veriler yazılacaktır. Ayrıntılar için resmi büyütebilirsiniz.Write Multiple RegistersBu kısımda da cevap dikkatlice incelendiğinde, yazım işleminde de slave’in mastera işlemin kabul edildiği bildirilmektedir.

Her iki örneğinde kilit noktalarından bir tanesi CRC16 hesaplamasıdır. Bunun için Modbus’ın kendi sitesinde lookup table bulunsa da günümüzün gelişen işlemcileriyle birlikte aşağıdaki kodu kullanmak oldukça kolay ve daha az yer kaybına neden olacaktır.

İlk kez CRC fonksiyonu işletileceğinde girdi olarak girilecek CRC değerinin 0xFFFF olması gerekmektedir.

Modbus İçin Bilgisayar Programları
Modbus her ne kadar seri iletişim metodu üzerinden haberleşse de, Serial Port Terminal benzeri programlar bu iletişim metodunu çözmede zayıf kalacaktır. Modbus için kullanılan bir çok program olmasına karşın Modbus Poll adlı program, bu konuda benim gibi bir çok kullanıcının tercih ettiği en iyi programlar arasındadır.Modbus PollEğer bilgisayar tarafında arayüz tasarlama konusunda tecrübeniz yok ise Modbus Poll ile bir çok denemenizi gerçekleştirebilir, kayıtlarınızı tutabilirsiniz. Programın deneme sürümünde zaman sınırı olsa da bir çok işlem için yeterli özelliklere sahip olduğunu söylemek gerekir.

Modbus Poll, master olarak sisteminize sorgu yapıp, slave olarak tasarladığınız cihazların testi için kullanıldığından master olarak tasarladığınız cihazlarınızın testini yine aynı firmaya ait Modbus Slave ile yapabilirsiniz.

Mikrodenetleyiciler için Modbus
Modbus’a yeni başlayan bir çok kişi, özellikle mikrodenetleyici tarafında nasıl bir yol izleyecekleri konusunda ikileme düşmektedir. İnternet özelinde bir çok örnek ve kütüphaneye rastlamak mümkün olsa da ben, kendi uygulamalarımda oluşturduğum kendi kütüphanemi kullanmayı tercih ediyorum. Eğer bu konuda zorluk çekiyorsanız internet üzerinde bulabileceğiniz FreeModbus kütüphane dosyalarını incelemenizi öneririm. Yaptığım incelemelerde 100 registerlık (100 x 2byte = 200byte) bir uygulama için FreeModbus 8.2kByte yer kaplarken, kendi uygulamam 2.4kByte kadar yer kaplamaktadır. Bu yüzden, her ne kadar hazır uygulamalar için kütüphane yazmayı zaman açısından verimli bulmasam da, Modbus için bir istisna yapıp kütüphanenizi kendiniz oluşturmanızı öneririm.

Modbus Uygulama Örneği
Modbus RTU ile ilgili aşağıda örnek uygulamaya ait ekran görüntüsünü aşağıda görebilirsiniz. Uygulamada 5 ve 6. registerdaki değerler 100ms’de bir sırasıyla arttırılıp azaltılırken, ilk 4 register ise STM32F072 Discovery üzerindeki ledleri kontrol etmektedir. Bunun yanı sıra, Modbus Poll üzerindeki değişen TX rakam değeri, her seferinde başarılı olan toplu register okuma işleminin sayısını göstermektedir. Poll süresine göre hızı değişkenlik gösteren bu sayıcıda, kütüphanenizin hızını ve verimliliğini ölçmeniz mümkündür.Modbus Exampleİlgili görüntüye ait uygulamanın .hex dosyasını buradan indirebilirsiniz. UART haberleşmesi için STM32F072’nin PA9 ve PA10 bacakları kullanılmıştır.

Fotoğraftaki kütüphane ticari projelerde kullanıldığı için paylaşımını burada yapamıyorum. Yine de bu kütüphaneye ulaşmak ya da bilgi almak istiyorsanız bana iletişim bölümünden ulaşabilirsiniz.
Sonuç Olarak…
Modbus, 35 yıllık geçmişiyle oldukça popüler ve alışıldığında bırakılmayacak bir iletişim metodu. Özellikle haberleşme istesin ya da istemesin, debug anlamında, bir projeye başlarken led blinkten sonra dahil ettiğim ilk uygulamalardan biri. Yeni bir çok iletişim metodu ve yöntemi çıkmasına karşın, gelecek yıllarda da bu ihtiyar iletişim metodunu görmeye devam edeceğimiz aşikar olduğundan, elektroniğe yeni başlayan arkadaşlar için ilk önerdiğim iletişim metotlarının arasında da yer alıyor.

Gerek Modbus gerek ise diğer endüstriyel iletişim metotları ile ilgili tüm sorularınızı bana yorum bölümünden ulaştırabilirsiniz.

Herkese iyi çalışmalar dilerim.

  1. Emre Sekmen dedi ki:

    Merhaba,

    Bu konulara tamamen uzak birisi olarak bu işe merak duyduğumdan ve babamın tatlı baskısıyla girişmek durumunda kaldım. Visual basic bilgim ve plc bilgim giriş seviyesinde desek yeridir. Visual basic 6.0 programını lise eğitim döneminde aldım ama üzerinden 13 yıllık bir süre geçti sadece alt yapı olarak aklımda var. Ama okudukça hatırlamaya çalışıyorum. Yazılan makale ve bilgileri birleştirmeye çalışıyorum ama hiç bilgim olmadığından kafam daha çok karışıyor. Bu konuda sizce nereden başlamalıyım. PLC bağlantısı ve işlem takibi yapmak istiyorum. Bir kaç hazır uygulama buldum fakat hepsi kendine özgü ocx uygulaması yapmış ve formu okuyamıyorum. Dolayısıyla boş bir form oluşturdum diyelim. ve plcde y0 çıkış bobinine enerji verdim diyelim. sadece bu çıkışı verebileceğim bir uygulama yapsam belki üzerine birşeyler katarak geliştirebilirim. Ama şuan y0 enerji verilmesine rağmen bunu pcde okuyamıyorum bu konuda bana öncülük ve bilgi paylaşımı yapabilirseniz çok sevinirim. Yada izlemem gereken bir yol bir öneri belirtirseniz bu şekildede başlayabilirim.

    Şimdiden ilginiz için çok teşekkür ederim

    Saygılarımla,

    Bağlanmak istediğim PLC Delta DVP14ss plcdir.

    • Fırat DEVECİ dedi ki:

      Merhaba Emre Bey,

      Yazımda belirtmiş olduğum Modbus Poll adlı yazılım ile PLC haberleşmesi yapabiliyor musunuz öncelikle buna bakmalısınız. İstenilen bilgileri çektikten sonra ilerlemeniz gereken yol, aynı soru kalıplarını sizin gönderip, cevap almaya çalışmanızdır.

      İyi günler dilerim.

  2. Burak dedi ki:

    Merhabalar Fırat Bey,
    Ben bu konularda çok yeniyim ve anlayışınız için teşekkür ederim.
    Öncelikle yazınız için çok teşekkür ederim. Ben PLC’den veri çekip bu verileri kaydetmek istiyorum. Bunun için basit bir c kodu yazmayı planladım fakat genel olarak haberleşmeyi nasıl yapacağımı çözemedim. Elimdeki datasheette modbus adresine ve özelliklerine göre hangi değeri alacağım mevcut örneğin
    30517 Day yield (Wh) [E-heute] 4 U64 FIX0 RO
    Cihazı usb to rs485 cihazı ile bilgisayara bağlayıp bu sonuçları almak istiyorum. Cihaza nasıl istek yolluyacağımı bilmiyorum. İstek yolladığım zaman geri dönüşü nasıl alacağım o konu hakkında da bilgim yok. Sizce nereden başlamalıyım ve sizin elinizde döküman varsa bana ulaştırabilir misiniz?
    Teşekkürler
    Burak

    • Fırat DEVECİ dedi ki:

      Merhaba Burak,

      Öncelikle bu konuda PLC’nin hangi fiziksel layer üzerinden haberleştiğini bulmalısın; RS232 mi 485’mi, Etherner mi? Daha sonrasında uygun protokolü ve bağlantıyı seçerek Modbus Poll benzeri bir program ile takip yapabilirsin. Modbus için kendi akredite sitesinde bilgi bulabilirsin. Türkçe kaynak bu konuda öneremeyeceğim.

  3. Hasan dedi ki:

    Merhaba,
    STM32F407VG üzerinden web server, TCP/IP server örneklerini çalıştırdım. Ping atma bağlanma işlemleri yapabiliyorum. Önerebileceğiniz bir modbus kütüphanesi var mı acaba. Nette keil için örnek bulmakta zorlanıyorum

    • Fırat DEVECİ dedi ki:

      Merhaba Hasan,

      Yakında PetitModbus adında bir kütüphaneyi sürmeyi düşünüyorum yalnız TCP/IP değil. Bu konuda layerlara bakıp kütüphaneyi senin yazman gerekiyor olabilir.

  4. Naci dedi ki:

    Merhabalar Fırat Bey,

    Tez çalışmam için DSP TMS320F28030 Modbus haberleşmesi yapmaya çalışıyorum gelen veya giden verilerin nasıl okunacağı ile ilgili kod örneği paylaşabilir misiniz. Normalde veri okurken 16 bit struct yapısı oluşturup
    union olarak bit bit işlem yapabiliyorum.

    Saygılar.

    • Fırat DEVECİ dedi ki:

      Merhabalar Naci,

      İlgili işlemci ile UART haberleşmesi yapabiliyor musun? Örneğin bir “deneme” yazısını seri port üzerinden gönderip, istediğin bir değişkeni bilgisayardan işlemciye gönderebiliyor musun? Eğer bunu yapamıyorsan öncelikle çözmen gereken kısım burasıdır. Haberleşmeyi yapabiliyorsan, protokolü projene dahil etmek için sadece videodaki önergeleri izlemen yeterli olacaktır.

  5. Mehmet dedi ki:

    Çok yararlı ve anlaşılır bir yazı olmuş.
    Emeğinize sağlık.

  6. Mücahit Ceylan dedi ki:

    Merhabalar Fırat Bey,
    Bir yer altı madeninin gaz izleme ve otomasyon scadasından sorumluyum.
    Protokolümüz MODBUS RTU dur.Kullandığımız master ve slaveler aynı firmaya aittir. MASTER aynı kalarak farklı markaya ait slave cihazlarını haberleştirebilmemiz mümkün müdür (örn.bir metan slave).

    İyi çalışmalar diliyorum.

  7. Oğuzhan Özdoğan dedi ki:

    İyi günler hocam, akıllı ev projem için arduino ve raspberryi modbus üzerinden ESP8266 wifi shiel ile kablosuz haberleşerek Codesysde programlamak istiyorum. Ethernet shield ile yaptım ancak ESP8266 ile nasıl arduino kodları bulamadım yardımcı olursanız sevinirim.

  8. Mustafa dedi ki:

    Merhabalar,

    RDF302 modbus lu siemens termostat, ısı sensoru, kalorimetre vs. gibi bazı cihazları İspanya’dan programlanıp gönderilmiş olan otomasyon panosuna bağlamam gerekiyor. Nasıl yapıldığını kısaca anlatabilir misiniz? Şimdiden teşekkür ederim.

    • Fırat DEVECİ dedi ki:

      Yani işi sen yap ben de üzerinden para kazanayım diyorsunuz. Şimdi ne olduğunu bile bilmediğim bir cihazın datasheet’in ulaşacağım, bunun nasıl kullanıldığını öğreneceğim, sonra gelip burada size anlatacağım. Siz de teşekkür ederim deyip, gerekli ücreti kazanacaksınız. Yani dediğim gibi işi bana yaptırtacak, cebinizi siz dolduracaksınız. Cin olmadan adam çarpmayı iyi öğrenmişsiniz. İbretlik olarak bu yorumunuzu çeşitli platformlarda paylaşacağım izninizle.

  9. Engin dedi ki:

    Selamlar.
    1. örnekte 0x6B ve 0x6C okunmaz mı? Start adresin kendisinden değil bir sonrasından mı başlıyor okumaya?

  10. Ebubekir dedi ki:

    Merhaba kendi modbus I/O modülümü yapmak istiyorum bana bu konuya nerden ve nasıl başlayacağım hakkında bilgi verebilir misiniz ?

  11. Alican dedi ki:

    Değerli paylaşımınız için teşekkür ederim.Modbus kullanımı için MODBUS cihazlarının satın alınması şart mıdır ? Yoksa her hangi bir mikrodenetleyici yardımıyla modbus protokülünü kullanmak mümkün müdür ?

Yorum Yazınız

error: Kopyalama KARDEŞ!