RS485 Haberleşmesi

Başlatan robikod, 27 Mayıs 2021, 11:32:21

robikod

Elimde stm32 ve rs485 tranceiver mevcut.

Kendi tanımladığım bir data yapım var, master-slave arasında haberleşme sağlayabilecek. Bu frame yapısı içerisinde, node-id gibi her bir node'un özelliğini belirtebilecek bir alan mevcut.

Bir Rs485 bus'una 10 adet node bağladığımı varsayalım. Bu cihazlardan birisi Master diğer 9 cihazda Slave olsun.

Soru 1 ) Master hatta data yolladığı zaman mesela sadece node-3'ü ilgilendiren bir mesaj yollasın. Tüm node'lar bu mesajı dinler mi? Yani her bir işlemcinin Uart-Rx pinlerine bu mesaj gelir mi ? Uart-rx e kadar gelen mesajı alıp ignore edip etmemek bize mi kalıyor ?

Soru 2) Yukarıdaki sorunun bir devam sorusu olarak, Tranceiver kısmında Node ID ile ilişkilendirilip, işlemcinin UART-RX pinine yönlendirmemesinin bir yöntemi var mı ? 


apsis

Hattaki diğer cihazlar dinleme yapar. Ancak başlangıç olarak bir slave ID doğrulaması yapıp verilerin geri kalanının alınıp alınmamasına karar verilebilir.

İkinci sorun için belki sorunu maksadınla beraber açman iyi olacaktır. Bunu cevaplarken "tamam ID eşleşmesi yanlış o halde rx'i kapat. Ama tekrar neye göre açacaksın?" gibi soru işareti oluşabiliyor.
"Makineye Beyin" MEKATRONİK

robikod

#2
Alıntı yapılan: apsis - 27 Mayıs 2021, 11:43:27Hattaki diğer cihazlar dinleme yapar. Ancak başlangıç olarak bir slave ID doğrulaması yapıp verilerin geri kalanının alınıp alınmamasına karar verilebilir.

İkinci sorun için belki sorunu maksadınla beraber açman iyi olacaktır. Bunu cevaplarken "tamam ID eşleşmesi yanlış o halde rx'i kapat. Ama tekrar neye göre açacaksın?" gibi soru işareti oluşabiliyor.


robikod

Yani node-id bitlerini alana kadar uart-rx'den data gelmeye devam eder. Uart-rx den işlemciye gelmez ama tranceiverın rx'ine data hala gelmeye devam eder.Eğer istenmeyen bir data ise geri kalanının alınıp alınmamasına işlemci kısmında karar verilebilir mi ? Daha sonra veri almaya başlamasını nasıl sağlayabiliriz bu durumda ?

Mucit23

Masterin gönderdiği veriyi hepsi alsın. Ama ID ler uyuşmuyorsa gelen veriyi değerlendirmesin. Senin bahsettiğini anladım ama RS485 yapısında bu durum tamamen senin yazacağın senaryoya bağlı. Master 1 byte bile gönderse bütün slave'lere ulaşır. Bundan sonrası senin yazacağın koda göre çalışır.

Ama mesela Can bus'da donanımsal olarak mesaj filtreleme yapabiliyorsun. Sistem sadece belirlediğin mesaj aralığını dinlesin gibi seçenekler mevcut.

e-zeki

İstediğin şey UART haberleşmeler için mümkün değil. @Mucit23  ün dediği gibi sanırım sadece CANBUS da böyle bir özellik var.
UART tabanlı tüm networkler her mesajı dinler her mesajı anlamlandırır. sadece id kısmını dinleyip gerisini dinelemeyeyim de diyemezsin. örneğin slave id si 1 gelen mesaj idsi 2 seni ilgilendirmiyor diye keser sonra başlarsan o sırada belki 2. noda giden mesaj içerisinde "0x01" değeri olan bir byte'a denk gelirsen aa bu benim bana geliyor diyerek anlamlandırma yapmaya başlarsın ve senle alakalı olduğunu sandığın tamamen anlamsız bir mesaj elde etmiş olursun. belli bir paket yapın yoksa mesaj içeriklerini karıştırmaya başlarsın bi SOM/EOM yapısı kurman gerek. ya da koda MODBUS entegre etmen gerek.

Tagli

Alıntı yapılan: robikod - 27 Mayıs 2021, 11:32:21Kendi tanımladığım bir data yapım var
Yol yakınken bu hatadan dön. Modbus kullan. Ben bu hataya düştüm, çok uzun süre uğraştırdı beni.

1) RS485'e basılan mesajları herkes görür. Genelde mesajların başına bir adres değeri koymak adettir. Slave cihazlar bu şekilde kendilerini ilgilendirmeyen adresleri göz ardı edebilirler. Ancak bu noktada iş yazılımcıya kalıyor.

Bazı işlemcilerde 9-bit veri desteği oluyor. 9. bit adres ile normal veriyi birbirinden ayırt etmeyi sağlıyor ve paketin muhatabı olmayan işlemcinin gelen veriyi donanımsal olarak göz ardı etmesine olanak veriyor. Ancak ben bu yöntemi kullanmanı tavsiye etmem. Bilgisayar tarafında pek desteklenmiyor ve sorun çıkarıyor bu 9-bit meselesi.

2) Transceiver'lar akıllı cihazlar değil. Gelen verileri işleyip değerlendirme gibi bir özellikleri yok.
Gökçe Tağlıoğlu

Mucit23

Alıntı yapılan: Tagli - 27 Mayıs 2021, 17:01:45Yol yakınken bu hatadan dön. Modbus kullan. Ben bu hataya düştüm, çok uzun süre uğraştırdı beni.

1) RS485'e basılan mesajları herkes görür. Genelde mesajların başına bir adres değeri koymak adettir. Slave cihazlar bu şekilde kendilerini ilgilendirmeyen adresleri göz ardı edebilirler. Ancak bu noktada iş yazılımcıya kalıyor.

Bazı işlemcilerde 9-bit veri desteği oluyor. 9. bit adres ile normal veriyi birbirinden ayırt etmeyi sağlıyor ve paketin muhatabı olmayan işlemcinin gelen veriyi donanımsal olarak göz ardı etmesine olanak veriyor. Ancak ben bu yöntemi kullanmanı tavsiye etmem. Bilgisayar tarafında pek desteklenmiyor ve sorun çıkarıyor bu 9-bit meselesi.

2) Transceiver'lar akıllı cihazlar değil. Gelen verileri işleyip değerlendirme gibi bir özellikleri yok.

Şuan Bende RS485 Master ve Slave cihazlar üreteceğim bir proje üzerinde çalışıyorum. Master Tek bir hat üzerinden Tek bir byte'dan oluşan durum bilgisi sorguluyor. Aynı hatta 64 tane cihaz olabiliyor adresleme şuan için 6 bit.

Kendim 4-5'byte dan oluşan sorgu-cevap frame'leri oluşturarak şuanda haberleşmeyi yapıyorum. Ama standart yok. CRC bile kullanmadım henüz.

Slave tarafta kullandığım MCU çok basit fazla hafızası olmayan bir çip. Çok basit birkaç ModBus fonksiyonu ile sistemi ModBus uyumlu hale getirebilir miyim? Standart bir haberleşme protokolü olsun istiyorum.


Tagli

Burada PIC16F1826 için bir Modbus RTU Slave örnek uygulaması yapmıştım.
Gökçe Tağlıoğlu

OG

Alıntı YapYol yakınken bu hatadan dön
bu düşünce,
haberleşme yazılımlarında uğraşmamış (saha tecrübeleri dahil) olanlar için
için geçerli olabilir.

Tecrübeli olan için ise, kendini herhangi bir protokole bağlamak israfa sebep olabilir.
FORUMU İLGİLENDİREN KONULARA ÖM İLE CEVAP VERİLMEZ.