Modbus RTU 3.5 karekter suresi

Başlatan ecunnu, 31 Ocak 2016, 22:55:47

ecunnu

Herkese merhaba,

       Modbus RTU ile haberlesen slave bir yazılım yaziyorum. Fakat anlamadıgım ufak bir nokta oldu sizlerle paylasmak istedim. Bu haberlesme modu en az 3,5 karekter bosluktan sonra baslamalı ve mesaj bittikten sonra bir 3,5 karekterlik daha bosluk olmalı. Artık en az demiyorum siz anlarsınız nede olsa:D eger bu 3,5 karekterlik sure kuralına uyulmaz ise slave cihaz hata dondurmeli. Birde 1,5 karakter kuralı var buda mesaj alınmaya başladıktan sonra, mesaj bitmeden en fazla 1,5 karekter bosluga izin veriliyor eger bundan fazla bir bosluk olur ise slave cihaz bundan once gelen verileri yok sayıyor ve bir sonraki byte'ı yeni bir mesaj olarak algılıyor.  Buraya kadar bir yanlışım var ise tecrubeli arkadaslar duzeltirse sevinirim.
        Gelelim anlamadıgım kısma:
        1) neden bu 3,5 karekter kuralına ihtiyac duyulmus sizce?
        2) Yazacagım yazılımda bu sureleri takip etmek icin bir timer kullanmalımıyım yoksa baska bir yollada yapılabilirmi? Protokolu kullanan arkadaslar bu sureleri takip etmek için nasıl bir yol izliyorlar acaba paylasırlarsa sevinirim. Sırf bu iş için islemciyi yormak istemiyorum acıkcası.

magnetron

o 3.5 karakter boşluk sayesinde yeni bir paketin geldiğini ( başladığını ) anlıyor bufferi sıfırlıyor

bir de modbus ascii var orda bir karakter paketin başını ( 0x3a )
0xd  0xa sonunu gösteriyor paket ise tamamen harf karakterlerinden oluştuğundan paketin başını sonunu
zaman koymadan anlıyor

ama modbus ascii hızı tabii rtu dan düşük oluyor

kenan_re

#2
Tek amaç yeni paket bilgisi. İlk olarak kimlik bilgisine bakıyorum, daha sonra paketin türüne göre beklemem gereken paket sayını belirliyorum; yeterli sürede gelmez ise herşeyi sıfırlayıp yeni soru bekliyorum.

ecunnu

#3
            "magnetron" hocam modbus ascii de inceledim fakat rtu varken pek mantıklı gelmedi. Acii olarak çalısmak programlama kısmını biraz kolaylastırıyor fakat iletisimde sizinde dediğiniz gibi isleri uzatıyor.

             "kenan_re" hocam peki bu sureyi timer kullanarak mı hesaplıyorsunuz?
               
           

memo333

3.5 karakter şart değil.. ayrıca bazı inverterlerin, plclerin min 10mS tepki süresi var. bu yüzden ben daha çok 10mS 20mS gecikmeyle cevap veriyorum/alıyorum. birde bu cihazların veri bekleme süreleri genellikle 500mS veya ayarlanabilir oluyor.

haberleşeceğiniz sistemin datasheetine bakın.
Gömülü Linux Notları --> http://linuxedu.xyz/

alexsi




Konu ile ilgili daha bilimsel olabilecek bir açıklamayı paylaşmak isterim. Kolay gelsin.
http://www.kontrolarge.com/ Bildiklerimiz öğrendiklerimiz kadardır. Ya bilmediklerimiz ..?

Tagli

3.5 karakter süresi şart. Bu paket başı ve sonunu belirliyor. Bir diğer deyişle "framing" için gerekli. memo333, senin dediğin şey cevap için gerekli süre. Bu ayrı bir şey. Modbus master cihaz timeout değerini istediği seviyede tutabilir. 500 ms olabilir mesela. Bu sürede cevap gelmezse iletişimin başarısız olduğuna hükmeder.

Bir süre önce PIC16F88 için örnek bir Modbus RTU Slave kütüphanesi yazmıştım. Az bir çaba ile başka işlemcilere de uyarlanabilir. 1.5 karakter kuralını uygulamadım ama. Kütüphaneye Bitbucket üzerinden git reposu olarak ulaşabilirsiniz.
https://bitbucket.org/tagli/xc8_modbus_slave_template
Gökçe Tağlıoğlu

ecunnu

Oncelikle cevap yazan herkese tessekkur ediyorum. Tagli hocam yazdiginiz kutuphaneyi ufaktan inceledim benim asıl merak ettigim 3,5 karakterlik ve 1,5 karekterlik  sureyi hesaplamak icin ne kullandıgınızdı. Sanırım sizde timer kullanmissiniz bende bu iş icin bir timeri feda edecem gibi duruyor. Timer kullanmadan bu sureyi slave tarafta kontrol etmek pek dogru degil gibi.

memo333

Alıntı yapılan: Tagli - 01 Şubat 2016, 13:16:04
3.5 karakter süresi şart. Bu paket başı ve sonunu belirliyor. Bir diğer deyişle "framing" için gerekli. memo333, senin dediğin şey cevap için gerekli süre. Bu ayrı bir şey. Modbus master cihaz timeout değerini istediği seviyede tutabilir. 500 ms olabilir mesela. Bu sürede cevap gelmezse iletişimin başarısız olduğuna hükmeder.

tagi haklı benim yazdığım maksimum süreyi kapsar... ancak pratik bilgi o kadar kesin sürelerde cevap veren sistemler özellikle modbus'ta pek yoktur.
Gömülü Linux Notları --> http://linuxedu.xyz/

yldzelektronik

Bazı işlemcilerde bu iş için özelleştirilmiş timeout var.Uart içinde gömülü.Kuruyorsun timeout olduğunda flagı set ediyor.
Kişinin başına gelen hayır Allah'tandır. Kişinin başına gelen şer nefsindendir. Nefislerimizle kendimize zulüm ediyoruz.

Okan AKÇA

#10
Konuya açıklik getirelim timeout bambaşka birsey
Timeout master cihaz sorgulama bilgisi gönderdiği zaman geri bekleme süresi eger bu sure içerisinde slave cevap vermezse cihaz timout olur end.  Sistemlerde master genelde 3 defa sorgulamadan sonra hataya düşer

3.5  karakter süresine gelince master sorgulama icin datalari gönderdiği zaman 3.5 karakter suresi içerisinde  baska data gelmez ise  slave cihaza gelen datalar isleme alinir. Olay bundan ibaret 

Yıllardır  modbus kullanıyorum  hep bu şekilde yaptim

yldzelektronik

Timeout dediğim kavramsal olarak.Yani nerede ne amaçla kullanırsanız kullanın.İster bir buçuk karaktere kurun ister üç buçuk.Ben kullanmadım.Ama master taraftada da slave tarafta da kullanıbileceğini düşünüyorum.
Kişinin başına gelen hayır Allah'tandır. Kişinin başına gelen şer nefsindendir. Nefislerimizle kendimize zulüm ediyoruz.

Tagli

Alıntı yapılan: Okan AKÇA - 02 Şubat 2016, 10:14:43
...3.5 karakter suresi içerisinde  baska data gelmez ise  slave cihaza gelen datalar isleme alinir.
Ben bu şekilde kullanmıyorum. Gelen her byte'ı - tabi eğer başlangıçtaki adres eşleşmiş ise -  geldiği anda durum makinesine (state machine) sokup işliyorum. Yani paket sonunu beklemiyorum. Elbette gelen her byte ile 3.5 karakter zamanını tutan timer sıfırlanıyor. Eğer timer taşarsa, durum makinesini sıfırlıyorum, böylece bu olaydan sonra gelen ilk byte yine adres byte'ı gibi değerlendiriliyor.

Bu arada, dün bağlantısını verdiğim kütüphanede salakça (ama çok da önemli olmayan) bir hata buldum ve düzelttim. İlgili commit yapıldı, kütüphane güncel.
Gökçe Tağlıoğlu