Modbus Master-Slave

Modbus Master-Slave

Modbus en yaygın kullanılan haberleşme protokollerinin başında gelir. Çok basit, hızlı ve güvenlidir. Seri port ile kullanıldığında Modbus RTU, Ethernet ile kullanıldığında Modbus TCP/IP olarak tanımlanır. Son dönemlerde Modbus UDP’de popüler olmaya başlamıştır. Eskilerde ise Modbus ASCII’de vardı ama artık pek kullanılmıyor.

Fulmatic 7 PLC’lerde Modbus Master kodu için buraya tıklayınız.

Modbus Tabloları

İlk olarak Modbus tablo yapısını anlamalıyız. Modbus protokolünde 4 adet tablo vardır. Tablolardan ikisi Analog (16 Bit), diğer ikisi ise bit şeklindedir. Her tabloda 65536 değişken bulunur. Diğer bir deyişle Analog Holding tablosunda 65536 word, Discrate Output Coil tablosunda ise 65536 bit bulunur.

Adres aralığıOkuma-YazmaTablo ismiTip
0-65535Okuma ve yazmaDiscrate Output Coils1 Bit
0-65535Sadece okunabilirDiscrate Input Contacts1 Bit
0-65535Sadece okunabilirAnalog Input Registers16 bit
0-65535Okuma ve yazmaAnalog Holding Registers16 Bit
Modbus Tablosu

Gerçek tablo yukarıdaki gibi olmakla beraber en yaygın kullanımı aşağıdaki tabloda gösterilmiştir. Yukarıdaki tabloda kullanıcılar bir değer için tablo ismini ve değişken adresini bildirmek zorundadır. Örneğin “Analog Holding 500. word” şeklinde ifade edilmelidir. Aşağıdaki tabloda ise adresler değişkenin ait olduğu tabloyu da belirtir. Örneğin “Analog Holding 500. word” adresi için “40501” yazılması yeterlidir. Adres alanı Analog Holding olduğu için başlangıç adresi 40001 + word adresi 500 = 40501 sonucuna ulaşılır. Eğer “Analog Input 500. word” olsaydı 30501 olacaktı.

Adres aralığıOkuma-YazmaTablo İsmiTip
1-9999Okuma ve yazmaDiscrate Output Coils1 Bit
10001-19999Sadece okunabilirDiscrate Input Contacts1 Bit
30001-39999Sadece okunabilirAnalog Input Registers16 Bit
40001-49999Okuma ve yazmaAnalog Holding Registers16 Bit
Modbus Yaygın Kullanılan Tablo

İkinci tablo bazı adreslere erişimi kısıtlasa bile hala çok fazla data alanını adresleyebiliyor. Bir de üçüncü yöntem var. Bu yöntem tüm data alanlarının tek bir sayı ile ifade edilmesini mümkün kılıyor. Bu yönteme 6 dijit Modbus adresleme deniyor. Adres aralığı 6 rakamdan oluşuyor.

Adres AralığıOkuma – YazmaTablo İsmiTip
1-65536Okuma ve yazmaDiscrate Output Coils1 Bit
100001-165536Sadece okunabilirDiscrate Input Contacts1 Bit
300001-365536Sadece okunabilirAnalog Input Registers16 Bit
400001-465536Okuma ve yazmaAnalog Holding Registers16 Bit
6 Dijit Modbus Adresleme

Not: WinTr SCADA programı, Focus HMI programı ve bir çok benzer programlar 5 ve 6 dijit adreslemeyi destekler. Aynı anda her iki adreslemeyi desteklemek bir problem ortaya çıkartır. 6 Dijitte 1-65536 Discrate output coils, 5 dijitte bulunan adresler ile çakışır. Bu yüzden 6 dijit adreslemede Discrate output coils için en başa bir adet 0 konulması gereklidir.

Üç farklı tablo yapısını gördük. Aslında gerçek olan ilk tablo, diğer ikisi ise bu tabloya erişim için kullanılan iki farklı yöntemden ibarettir. Modbus ile çalışan cihaz üreticileri bu adres tablosunu üç yöntemden biri ile verebilir. Tablodan tabloya adres dönüşümü yapmak zorunda kalırsınız. Yada bu konuyu öğrenmeden geçip sürekli başkalarından destek talep edersiniz. Aşağıdaki tabloyu örnek dönüşümler için hazırladım.

İlk adres bildirimiİkinci adres bildirimiÜçüncü adres bildirimi
Analog Holding 040001400001
Analog Holding 100041001401001
Analog Input 10030101300101
Discrate Input 1010011100011
Modbus Adresleme

Modbus Sorguları

Yukarıda anlatılan tablolardan veri okumak veya yazmak için Master cihaz bir sorgu gönderir. Gönderilen sorguya slave cihaz cevap verir. Haberleşme devam ettiği sürece Master gönderir, slave cevap verir. Modbus sorguları ve cavaplarını anlamak için benim çok kullandığım https://www.simplymodbus.ca/FC03.htm sitesini önerebilirim. Tüm iletişim gönderilen ve alınan baytların değerleri ile ilgilidir. Aşağıda örnek Modbus sorgusu üzerinden açıklamaya devam ediyorum.

Örnek Modbus Sorgusu:

İstasyon adresi 17 olan bir cihazın Holding Register 107’den itibaren 3 word boyunda data okumak için oluşturulan sorguyu aşağıda görebilirsiniz.

11: İstasyon adresi (11 hex = 17 dec)
03: Fonksiyon kod 3 (Holding Registers okuma kodu)
006B: İlk okuma adresi (006B hex = 107 dec veya 40001 + 107 = 40108)
0003: Okunmak istenen word sayısı (03 hex = 3 dec)
7687: CRC16 (cyclic redundancy check)

Yukarıdaki sorguda görüldüğü gibi belli bir adresten belli sayıda okuma yapabiliyoruz. Okuma işlemi için fonksiyon kod 3 kullanıldı. Bu Holding Register alanı içindir. Eğer Input Register alanından okumak isteseydik Fonksiyon kod 4 kullanılması gerekliydi. Seri port ile gönderilen bu sorgu hatta bulunan tüm alıcılar tarafından alınır. Fakat sadece istasyon adresi 17 olan cihaz cevap verecektir. 17 nolu istasyon cevap vermeden önce örneğimizde 7687 olan CRC bilgisini kontrol eder. Slave cihaz aldığı tüm baytların son iki baytının CRC olduğunu bilir. Ve CRC haricindeki baytları CRC formülünde hesaplar. Kendi hesapladığı CRC ile aldığı CRC’yi karşılaştırır. Eğer aynı ise sorgunun hatasız alındığını anlar ve istasyon adresi de aynı ise mutlaka cevap verir. Mutlaka ama her zaman doğru cevap vermeyebilir. Örneğin kendisinde bulunmayan bir adres aralığı sorgulanmışsa hata mesajı gönderir. Hata mesajlarını bu linkte görebilirsiniz. https://www.simplymodbus.ca/exceptions.htm

Her şey yolunda gittiğinde alınan cevap aşağıdaki gibi olacaktır.

11: İstasyon adresi (11 hex = 17 dec)
03: Fonksiyon kod 3 (Holding Registers okuma kodu)
06: Okunan byte sayısı (3 registers x 2 bayt = 6 bayt)
AE41: Okunan değer, adres 40108
5652: Okunan değer, adres 40109
4340: Okunan değer, adres 40110
49AD: CRC16 (cyclic redundancy check)

Yukarıdaki cevabı alan Master cihaz bazı kontroller gerçekleştirir. İstasyon adresi, CRC ve okunan bayt sayısı. Kontroller neticesinde cevap kabul edilir veya çöpe atılır.

Diğer Bilgiler

  • Seri port ile yapılan iletişimde datalar her zaman doğru iletilemeyebilir. Özellikle harmonikler çok, hat uzun ve hatta çok cihaz varsa bu bozulma daha çok olur. CRC datanın doğru okunduğunun tek kanıtıdır.
  • CRC kontrolünden sonra İstasyon adresi kontrol edilir. Hatta aynı adrese sahip birden çok cihaz olduğunda, bu cihazlar ile haberleşmek mümkün olmaz. Her cihazın ayrı bir adresi olmalıdır. 0-255 arasında cihazlara adres verilebilir. Bir çok uzak doğu ürününde 0 adres olarak verilebilse dahi çalışmaz.
  • Tek bir sorgu ile okunacak 16 bit register sayısı en fazla 127 olabilir. Zira okunan bayt sayısı en fazla 254 olabilir. Discrate olduğunda ise 255 x 8 = 2040 bit olabilir.
  • Analog tablolar her zaman 16 bitlik olmayabilir. 32 bit veya 64 bit de olabilir. Tüm iletişim bayt’lar üzerinden yapılır. Fakat Master ve Slave kendi içinde bunları birleştirir. Örneğin 40001 ve 40002 32 bitlik bir değişken olarak kabul edilebilir. Bu durumda “Word order” parametresi devreye girer. Bazı cihazlar ilk word büyük değerli, bazıları ise ikinci word büyük değerli kullanabilir. 32 bitlik değer = (40001 x 65536) + 40002 ilk word büyük değerli veya 40001 + (40002 x 65536) = ikinci word büyük değerli.
  • Master slave cihaza sorgu gönderir ve cevap bekler. Cevap gelmediğinde ya tekrar göndermeli yada sıradaki sorguya geçmelidir. Bu bekleme süresine Timeout zamanı denir.
  • Master sorgusuna cevap aldığında sıradaki sorguyu hemen göndermez. Bir süre beklemelidir. Beklemediği taktirde slave cihaz cevabı + master yeni sorgusu birleşir ve slave cihazlar tarafından kabul edilmeyebilir. Bu bekleme süresine Delay denir.
  • Modbus RTU ve TCP/IP sorguları farklıdır. TCP/IP olduğunda sorgu önüne 6 bayt eklenir ve sondaki CRC gönderilmez. Daha fazla bilgi için buraya bakınız. https://www.simplymodbus.ca/TCP.htm
  • Diğer modbus fonksiyon kodlarının kullanımı için https://www.simplymodbus.ca/FC01.htm adresini ziyaret ediniz.

No Responses to “Modbus Master-Slave”

Trackbacks/Pingbacks

  1. PLC Modbus Master - PLC | HMI | SCADA | SOFTWARE | FULTEK LTD - […] sorgu yapısını öğrenmek için https://www.fultek.com.tr/modbus-iletisimi/ burayı ziyaret ediniz. Örneğimizde slave cihazın Analog Input tablosundan sıfırıncı […]

Leave a Reply