Modbus haberleşme protokolü herkes tarafından bilinen açık bir mimariye sahiptir.
Modbus haberleşme protokolü, haberleşme yapılacak olan cihazın adresini, gönderilecek olan mesajı, ne tür bir görevin yapılması gerektiği bilgilerini içerir. Ayrıca, haberleşme sırasında olabilecek hataları belirlemek için kendine ait algoritmaları bulunmaktadır. Bu algoritmaları kullanarak elde edilen değerleri de modbus mesaj yapısı içermektedir.
Modbus haberleşme protokolü Uart haberleşme modülü ve fiziksel katman olarak RS232, RS422, RS485 ile uyumludur.
• Modbus heberleşme protokolü 1 master cihazı ve en fazla 247 tane slave cihazından oluşmaktadır. Sorguları sadece master başlatabilir. Slave ise sorguda master tarafından istenilen işlevi yerine getirmek durumundadır.
• Master, sorgu yapmak istediği slave’ in adres değerini modbus mesaj yapısına girmek zorundadır. Ayrıca master, bir görevi ağda bulunan tüm slave’ lerin yapmasını istiyorsa broadcast sorgu gönderebilmektedir.
• Broadcast sorgu ile ağda bulunan tüm slave cihazlarına aynı anda aynı sorgu gönderilmek amaçlanır.
• Master, istediği slave’ e bir sorgu göndermekte ve sorgu gönderilen slave, master’ a cevap vermektedir.
• Master, broadcast sorgu yaptığında, slave’ ler cevap göndermezler.
• Sorgu ve cevaplar, slave adres bilgisini, yapılan görevi belirten fonksiyon kodunu, gönderilecek veya alınacak veri bilgilerini ve hata denetleme algoritması sonucu oluşan bilgiyi içermektedir.
Sorgu
Sorgu yapısnda, adres bilgisi iletişim kurulmak istenilen cihazı, fonksiyon kodu ilgili slave’ in ne tür bir görev yapması gerektiğini, veri alanları ihtiyaç duyulan ilave bilgileri içermektedir. Örneğin, fonksiyon kodu ‘03’ ile ilgili slave’ den veri okumak istenmektedir. Fakat, hangi veriyi okumak istediğimizi veri alanları ile belirtmeliyiz. Sorgu yapısındaki hata denetleme alanı ise gönderilen mesaj yapısnın doğru olup olmadığını kontrol edebileceğimiz bilgiyi içermektedir.
Cevap
Haberleşmede herhangi bir problem olmadığında adres değeri ve fonksiyon kodu, sorguda kullanılan slave adres değeri ve fonksiyon kodunun aynısıdır. Veri alanı slave’ den istenilen veriyi içermektedir. Eğer haberleşmede hata olursa, fonksiyon kodu hatayı belirtmek için değiştirilmekte, veri alanı ise ne tür bir hatanın olduğunu belirtmektedir. Hata denetleme alanı ise gönderilen mesaj yapısnın doğru olup olmadığını kontrol edebileceğimiz bilgiyi içermektedir.
MODBUS MOD ÇEŞİTLERİ
Modbus haberleşme protokolü iki farklı moddan oluşmaktadır:
‽ Modbus ASCII
‽ Modbus RTU
2 mod mesaj yapısı bakımından tamamen aynıdır. Tek farkı seri olarak gönderilen bit içerikleridir.
Modbus haberleşme ağında bulunan master ve slave’ ler aynı mod modbus protokolünü kullanmak zorundadır.
ASCII(American Standard Code for Information Interchange) Mod
Mesaj yapısında bulunan her bir hexadecimal karakter 1 ASCII karakter kullanılarak gönderilmektedir. Bu modun en büyük avantajı herbir karakter arasındaki zaman aralığının bir saniyeye kadar çıkabilmesidir.
Hata denetleme yöntemi olarak Longitudinal Redundancy Check (LRC) algoritması kullanılmaktadır.
RTU (Remote Terminal Unit)
Modbus mesaj yapısında bulunan her bir hexadecimal karakter 4 bitten oluşmaktadır. Bu modun avantajı ise mesaj yapısında daha az bit sayısı içermesidir. Yani aynı mesaj, Modbus ASCII moda göre daha az bit sayısı ile gönderebilmektedir. Hata denetleme yöntemi olarak Cyclical Redundancy Check (CRC) algoritması kullanılmaktadır.
ASCII Mesaj Yapısı
Modbus ASCII mesaj yapısı ‘:’ (ASCII 3A hex) karakteri ile başlamakta ve ‘CRLF’ (ASCII 0D ve 0A hex) çifti ile sonlandırılmaktadır. Modbus ASCII mesaj yapısındaki diğer alan için kullanılan hexadecimal karakterler, ASCII karakteri değerleri ile ifade edilir. Ağda bulunan slave cihazları ağı sürekli olarak kontrol eder, eğer master’ dan gelen karakter ‘:’ ise, diğer cihazlar bir haberleşmenin başlayacağını anlar. Master’ dan gelen diğer ascii karakterlerini inceleyerek iletişime geçilecek olan cihazın adres bilgisinin kendisine ait olup olmadığına bakar, eğer adres bilgisi kendisinin değilse, o slave gelen sorguyu umursamaz ve master’ a cevap göndermez. Adres bilgisi eşleşen slave ise master’ ın sorgusuna bakarak, istenilen görevi yerine getirerek master’ a cevap verir.
Ardışık gelen ASCII karakterler arasında bir saniyeye kadar zaman aralığı olabilir. Fakat, bir saniyeyi geçtiğinde, verileri alan cihaz bir hatanın olduğunu varsayar.
RTU Mesaj Yapısı
Modbus RTU haberleşmesi en az 3.5 karakter sessizlik (haberleşmenin olmaması) zaman aralığının sonunda başlar. Sistemdeki baudrate hızı, sessizlik zaman aralığını belirlemektedir.
Sistemin hızı 9600 baudrate olsun.
3.5 karakter = 28 bit, 14/9600 = 0.00290 s.
Sistemin hızı 921600 baudrate olsun.
28/921600 = 0.0000302 s.
Ağda bulunan tüm cihazlar ağı sürekli olarak dinlemektedirler. Herbir slave en az 3.5 karakter sessizlik zaman aralığından sonra gelen ilk bilgiye (adres bilgisi) bakarak, master’ ın kendisi ile haberleşmek isteyip istemediğini anlar. Eğer adres bilgisi kendisinin değilse herhangi bir haberleşme o slave ile gerçekleşmez. Adres bilgisi eşleşen slave ise master’ ın sorgusuna bakarak, istenilen görevi yerine getirerek, master’ a cevap verir.
Haberleşmenin bittiği bilgisi, haberleşmenin başlama bilgisi gibi en az 3.5 karakter sessizlik zaman aralığı ile anlaşılmaktadır.
Modbus mesaj yapısındaki veriler gönderilirken birbirine ardışık olan karakterler arası en fazla 1.5 karakter zaman aralığı uzunluğunda olmalıdır. Eğer, veri gönderilirken birbirine ardışık olan karakterler arası 1.5 karakter uzunluğundan fazla olursa, veriyi alan cihaz aldığı tüm verileri yok sayar, ve bir sonraki gelen veriyi adres bilgisi olarak varsayar. Bu durum ise hataya yol açar.
Modbus Adres Alanı
Modbus ASCII modunda 14 bit uzunluğundadır. Modbus RTU modunda 8 bit uzunluğundadır.
Slave adres aralığı 1-247’ dir.
Adres 0 bilgisi, broadcast mesajdır ve bu durumda ağda bulunan tüm slave cihazlar, master tarafından istenilen görevi yerine getirmek zorundadır.
Modbus Fonksiyon Kodu
Modbus ASCII modunda 14 bit uzunluğundadır. Modbus RTU modunda 8 bit uzunluğundadır. Geçerli fonksiyon kodları 1-255 dahil olmak üzere, aralığındadır.
Modbus mesaj yapısındaki fonksiyon kodu, master tarafından slave’ in yapması gerektiği görevi belirler. Bu görevler, slave’ den istenilen bir register değerini öğrenmek, bir register değerini değiştirmek, dijital input veya outputların değerleri öğrenmek veya değiştirmek, vs. içermektedir.
Haberleşmede herhangi bir hatanın olmadığı durumda slave, master tarafından gönderilen fonksiyon kodunu modbus mesaj yapısına koymakta ve master’ a göndermektedir.
Bazı haberleşme hatalarında slave, master tarafından gönderilen fonksiyon kodunun en yüksek değerlikli bitini (MSB) bir yaparak modbus mesaj yapısına koyar ve cevap olarak bu mesaj yapısını master’ a gönderir.
Örneğin, master ‘ ın slave’ den bir değişkenin değerini öğrenmek istediğini ve haberleşmede bir hatanın olduğunu varsayalım. Master, slave’ den bir değişkenin değerini öğrenmek istediği için fonksiyon kodu olarak ‘0x03’ (0b00000011) gönderecektir. Fakat, haberleşme sırasında bir hata olduğu için slave master’ a cevap olarak fonksiyon kodunu ‘0x83’ (0b1000011) gönderecektir.
Slave ,bazı durumlarda fonksiyon kodunun en yüksek değerlikli bitini bir yapmak yerine, master’ a hatanın nedenini belirten fonksiyon kodunu mesaj yapısına koyarak, gönderir.
Örnek Fonksiyon Kodları
01 Read Coil Status
02 Read Input Status
03 Read Holding Registers
04 Read Input Registers
05 Force Single Coil
06 Preset Single Register
07 Read Exception Status
08 Diagnostics
11 Fetch Comm. Event Ctr.
12 Fetch Comm. Event Log
15 Force Multiple Coils
16 Preset Multiple Registers
17 Report Slave ID
Modbus Veri Alanı
Veri alanı, master tarafından gönderilen fonksiyon koduna ek bilgileri içermektedir. Örneğin master, slave’ in sahip olduğu bir register’ ın değerini öğrenmek istemekte olduğunu varsayalım. Bunun için gerekli olan fonksiyon kodu haricinde okumak istediği register’ ın değerini de slave’ e göndermek zorundadır.
Slave ise, ilgili fonksiyon kodu haricinde master’ ın istediği register’ ın değerini, master’ a göndermek zorundadır.
Farklı bir örnek olarak master’ in herhangi bir slave’ de bulunan bir register’ ın değerini değiştirmek istediğini düşünelim. Master veri yazmak için gönderdiği fonksiyon kodunun haricinde hangi register’ a, ne değeri yazacağını da göndermek zorundadır.
MODBUS HATA DENETLEME YÖNTEMLERİ
Modbus mesaj yapısında bulunan verilerin doğru olarak iletilip, iletilmediği kontrol altında tutulmalıdır. Modbus haberleşme protokolünde, 2 farklı hata denetleme algoritması bulunmaktadır.
Modbus Hata Denetleme Alanı
Modbus RTU modu CRC algoritmasını, Modbus ASCII modu ise LRC algoritmasını hata denetleme yöntemi olarak kullanmaktadır. 2 yöntemde de amaç master veya slave’ den gönderilen verilerin karşı tarafa doğru ulaşıp ulaşmadığını belirlemektir.
CRC ve LRC algoritmaları haricinde parity kontrolü de yapılabilmektedir. Parity kontrolü ile gönderilen mesaj yapısında herbir karakterin (ASCII 7 bit, RTU 8 bit) kontrolü yapılmaktadır. Fakat bu yöntem CRC ve LRC kadar etkili bir yöntem değildir. Ayrıca, herbir karaktere bir bit eklemete ve bunun sonucunda haberleşme süresi uzamaktadır.
Even Parity
Even Parity, modbus mesaj yapısında bulunan herbir karakterin toplam bit sayısını çift yapmayı amaçlamaktadır. Örneğin, 0b00001111 verisinin sonuna parity olarak sıfır eklenmektedir. Çünkü, veride 4 tane bir vardır ve toplamı çifttir.
0b0000111 verisinin sonuna ise parity olarak bir eklenmektedir. Çünkü, veride 3 tane bir vardır ve toplamı tektir, veriyi çift yapabilmek için verinin sonuna parity olarak bir eklenmektedir.
Odd Parity
Odd Parity, modbus mesaj yapısında bulunan herbir karakterin toplam bit sayısını tek yapmayı amaçlamaktadır. Örneğin, 0b00001111 verisine parity olarak bir eklenmektedir.
Çünkü, veride 4 tane bir vardır ve toplamı çifttir, veriyi tek yapabilmek için verinin sonuna parity olarak bir eklenmektedir. 0b0000111 verisinin sonuna ise parity olarak sıfır eklenmektedir. Çünkü, veride 3 tane bir vardır ve toplamı tektir.
Parity Kontrolünün Eksik Yönü
Haberleşme ağı elektirksel olarak gürültülü bir alanda ise verideki herhangi bir bitin bir iken, sıfır olması veya sıfır iken, bir olması sonucu teklik veya çiftlik değişecektir. Bunun sonucunda veriyi alan cihaz bunu bir hata olarak görecektir. Fakat, 2 bitin değişmesi durumunda teklik veya çiftlik değişmeyecektir. Veriyi alan cihaz bunu hata olarak görmeyecektir.
Ayrıca, parity kontrol yapmak opsiyoneldir. Parity kontrolünün yapılıp yapılmayacağı seri portun başlangıç ayarlarında belirtilir. Eğer, yapılacak ise hangi parity (odd-even) kontrolünün yapılacağı belirtilmelidir.
Örneklerin hepsinde CRC ve LRC 4 tane hexadecimal karakterden oluşmaktadır.
01 Read Coil Status
Dijital çıkışların durumunu (ON-OFF) okumak için kullanılmaktadır.
ON = 1
OFF = 0
Bu fonksiyon kodu broadcast mesajı desteklemez.
Başlangıç adres değeri sıfır ile başlamaktadır (referanslıdır). Yani, başlangıç adres değerinin bir eksiği, modbus mesaj yapısına girilmelidir.
Sorgu
Sorgu mesajı, başlangıç dijital çıkış adres değerini ve o adres değerinden başlanarak kaç tane dijital çıkış okunacağını içerir.
1) Aşağıdaki sorguda slave adresi 17, başlangıç adres değeri 20 ve başlangıç adresinden başlayarak 32 tane durum (ON -OFF) öğrenilmek istenmiştir.
Cevap
İlk veri byte’ ının en düşük değerlikli biti (LSB) başlangıç adresindeki durumu ifade etmektedir. Diğer durumlar sırasıyla artan adres değerlerini ifade etmektedir. Eğer, okunacak olan durum sayısı 8’ in katı değilse (bu örnekteki gibi) en son veri byte’ ında kalan kısımlar sıfırlar ile doldurulur.
(20-27) >>> 0xCD = 0b11001101
(28-35) >>> 0x6B = 0b01101011
(36-43) >>> 0x0E = 0b00001110
(52-56) >>> 0x0E = 0b00011011 (Kalan bitler sıfırlar ile doldurulmuştur.)
Slave tarafından master’ a gönderilen cevapta, son iki byte hata denetim algoritmaları sonucu elde edilen yüksek değerlikli CRC – LRC byte’ ı ile düşük değerlikli CRC – LRC byte’ ını (Modbus RTU veya MODBUS ASCII) içermektedir.
2) 03 Read Holding Registers
Slave’ den bir veya birden fazla register değerini okumak için kullanılmaktadır.
Bu fonksiyon kodu broadcast mesajı desteklemez.
Başlangıç adres değeri sıfır ile başlamaktadır (referanslıdır). Yani, başlangıç adres değerinin bir eksiği, modbus mesaj yapısına girilmelidir.
NOT : 1 register = 16 bit
Sorgu
Sorgu mesaj yapısında, slave’ den okunacak register’ ın başlangıç adres değeri ve kaç tane register okunacağı belirtilir.
Yukarıdaki sorguda 17 numaralı slave cihazından 108, 109, 110 numaralı register ‘ ların değerleri okunmak istenmiştir.
Cevap
Toplamda 3 tane register (6 byte) okunmak istendiği için, aşağıdaki şekilde görüldüğü gibi slave’ den 6 byte veri gönderilmiştir. Ayrıca, bu fonksiyon kodunun cevap mesaj yapısında byte sayısı bilgisi de bulunmaktadır. Cevap mesaj yapısında byte sayısının altında bulunan ilk iki byte 108 numaralı register’ ın değerini, onun altındaki 109 numaralı register’ ın değerini, onun altındaki iki byte ise 110 numaralı register’ ın değerlerini bildirmektedir.
3) 06 Preset Single Register
Bu fonksiyon kodu ilgili slave’ in sadece 1 register değerini belli bir değere ayarlamaktadır.
Bu fonksiyon kodu broadcast mesajı desteklemektedir.
Başlangıç adres değeri sıfır ile başlamaktadır (referanslıdır). Yani, başlangıç adres değerinin bir eksiği, modbus mesaj yapısına girilmelidir.
NOT : 1 register = 16 bit
Sorgu
Sorgu mesaj yapısında, ilgili slave’ e yazılacak değer ve hangi register’ a yazılacağı belirtilir.
Aşağıdaki sorguda 17 numaralı slave cihazının 2 numaralı register’ ı 0x0003 değerine ayarlanmak istenmiştir.
Cevap
Slave tarafından gönderilen cevap, aşağıdaki şekilde görüldüğü gibi, sorgunun aynısıdır.
Bu yorum bir blog yöneticisi tarafından silindi.
YanıtlaSil