Basit Bir şekilde ModBus Haberleşmesi

Başlatan Mucit23, 14 Ekim 2019, 21:42:03

Mucit23

Selamlar

Elimde ModBus ile haberleşen Hamilton'nun PH problarından var.

Prop içerisinde Sıcaklık ölçüm elemanı ile birlikte birde mikrokontrolör var. Bu sayede Modbus üzerinden doğrudan PH ve Sıcaklık değerleri okunabiliyor.
Bu sensörlerle haberleşen elimde bir donanım var. SCADA benzeri bir panel Modbus üzerinden PH ve Sıcaklık değerlerini okuyup Ekranda gösteriyor. Ben ise aynı şekilde PH ve sıcaklık değerlerini kendi çipimle okuyup farklı işler yaptıracağım.

Sensör ModBus ile haberleşiyor. Burada Programmers Manual var.
https://craft-sensors.s3.amazonaws.com/File-Uploads/pH_ARC_ProgrammersManual_EPHUM031_62430003.pdf?mtime=20180725234944

Bu Tek bir MAster ve Slave Cihaz olacak şekilde bir bağlantı kurmak istiyorum. Bunun için Tümüyle Modbus RTU altyapısını kurmak gerekiyormu? Basit bir şekilde bu sensör ile nasıl iletişim kurabilirim. Daha önce hiç ModBus uygulaması yapmadım. Döküman karmaşası yaşıyorum. 

tunayk

Tüm fonksiyonları implemente etmene gerek yok. Eğer sadece düz input register okuma yapcaksan, göndereceğin sorgu frame'i zaten sabit olacak.  Her seferinde bu byte dizisini göndereceksin, sensör de sana bunun karşılığı olan frame'i gönderecek. Eğer riskli bir ortam değilse CRC kontrolü de atlanabilir. sadece gelen frame'de adres, fonk, byte uzunluğu vb. sabit byte'ların yerli yerinde olduğunu kontrol eder doğruysa, gelen veriyi doğru kabul edersin.  İmkanın varsa CRC kontrolünü de yapar sağlama almış olursun.

apsis

3,4,16 'ıncı fonksiyonlar işini görüyor zaten.

http://www.simplymodbus.ca/FAQ.htm

Burada fonksiyonlar hakkında bilgi var.

İnternetten freemodbus stm32 uygulamalarına bak. Master uygulamaları da var.

"Makineye Beyin" MEKATRONİK

Mucit23

Teşekkürler. Dediğiniz gibi tüm modbus fonksiyonlarını gömmeme gerek yok. Basit bir gönderip alma fonksiyonu yazacağım.

secretagent

MErhaba bende bu konu altında birşey sormak istiyorum. Modbus haberleşme mantığını biliyorum fakat bunu koda dökerken sıkıntı yaşıyorum. Hazır kütüphaneler kullanmak yerine forumda tecrübeli birileri çıkıp bunun koda dökülme mantığını anlatabilir mi acaba? Mesela 3.5 karakter 1.5 karakter gibi bekleme olayları falan var bunları kod kı8smına nasıl dökebiliriz. Sadece bir fonksiyon kullanarak bunun koda dökülme mantığını açıklarsanız sevinirim. Birçok kişiyede mantığının oturması adına fyadalı olacağı kanaatindeyim.

Mucit23

Selamlar

Aradan baya vakit geçti. Açıkçası cihaz okulun laboratuvarında olduğundan dolayı pek birşey yapamadım. Amacım sensör datasını bilgisayarda görüntülemek yada bilgisayara aktarmak. Labda Bu sensör için HMI tarzı bir ekran var. Cihazın içine baktığımda HMI panelde RS485 ucları doğrudan sensöre bağlanmış durumda. Ben ilk başta bu HMI paneli aradan çıkarıp onun yaptığı sorgula ve oku işini kendi MCU'm ile yaparım diye düşünüyordum fakat hali hazırda çalışan sistemi bozmamı istemiyorlar.

Bende sistemin çalışmasını engellemeyecek şekilde hatta USB-RS485 dönüştürücü bağlayıp doğrudan bilgisayardan okuma yapayım diye düşündüm. Elimdeki dönüştürücüyü hatta bağlayıp terminalde izlemeye başladım. Uygun baudrateyi bulamıyorum. Elimdeki dönüştürücü ile terminalden birçok baudrateyi denedim. Hepsinde bir şeyler geliyor. Örneğin 38400 Baudrate için paket paket aşağıdakine benzer datalar geliyor.

Fakat doğrumu değil mi emin olamadım. Gelen Dataları analiz edebileceğim bir yazılım arıyorum. Modbus Analyser tarzı bir uygulama biliyor musunuz?

apsis

@Mucit23 Modbus Poll güzel program. Kırığı bulunuyor.

Bir de Radzio var. Ücretsiz ve güzel programdır.

Bu programlarla modbus adreslerinden veri okuyup yazabiliyorsun.
"Makineye Beyin" MEKATRONİK

Murat Mert

@Mucit23 baudrate bozuk değilse gelen datalar modbus datalarına benzemiyor.
mert07

Mucit23

Doğru baudrateyi bulamıyorum.  4800 9600 19200 38400 57600 115200 gibi seçenekler var sensör için. Bir tane RS485-TTL dönüştürücü bağlayıp logic analyser ile inceleyeceğim.

foseydon

@Mucit23

doğruyu yanlışı neye göre belirliyorsun hocam? Bu çıktı yanlış, şu olması lazımdı diyorsan o zaman doğru baudu hesap edebilirsin..

ErsinErce

Default 19200 8N2 gibi gözüküyor datasheet te

https://store.chipkin.com/products/tools/cas-modbus-scanner
bu aracı kullanabilirsin ücretsizdir

Mucit23

Selamlar

Sensörle iletişim kurmaya başladım. İlk başta düşündüğüm yöntemden sonuç alamayınca olması gerektiği gibi kendim kodlamaya karar verdim. Diğer Master Cihazdan Sensörü ayırıp Üzerinde Modbus transreciever olan bir STM32 kartına bağladım. Arada yine USB RS485 dönüştürücü var. Neyin gidip neyin geldiğine buradan bakıyorum. Yapı aşağıdaki gibi

Şimdi Master olarak sensöre veri gönderdiğimde sensör cevap olarak bir şeyler gönderiyor. Fakat Gelen Mesajları anlamlandıramadım.

Sensörün Adresi 0x01. Bu adresi değiştirince sensör hiç cevap vermiyor.

04 Fonksiyonu ile PH registerine istek göndererek bir deneme yaptım. Modbuss Adress 2080 olarak verilmiş. 0x0820 yapar hex olarak. Toplam 8 byte okunacak

Gönderdiğim datalar aşağıdaki gibi

01 04 08 20 00 08 F2 66

Son iki byte CRC. "01 04 08 20 00 08" için CRC hesapladığımda 0x66F2 çıkıyor. Bunu birkaç farklı kaynaktan doğruladım.

Sensör Cevap olarak aşağıdaki byte'ları gönderiyor.

01 84 02 C2 C1

İlk Byte Slave Addres C2 ve C1 CRC değeri fakat arada gelen 0x0284 değeri ne anlama geliyor? Bunu çözemedim. Normalde Benim sorguma karşılık sensör String olarak PH değerini vermesi lazım. Yorum yapabilecek olan var mı?

Tagli

#12
Illegal Data Address hatası alıyorsun. Dokümandaki 2080 değeri hex olabilir mi acaba? Ayrıca 4 değil bir de 3 ile ulaşmayı dene. Gerçi tabi input register olması daha mantıklı ama paylaştığın görüntüde garip bir şekilde ikisi de geçiyor, mantığını anlamadım.

Ekleme: Dönen değerin 2. byte'ı normalde talepteki fonksiyon kodu olmalı. Ancak buna 0x80 eklenmişse bu bir hata olduğu anlamına geliyor. Bu durumda takip eden byte (senin durumda 0x02) hatanın türünü belirten kod oluyor.
Gökçe Tağlıoğlu

Mucit23

https://craft-sensors.s3.amazonaws.com/File-Uploads/pH_ARC_ProgrammersManual_EPHUM031_62430003.pdf?mtime=20180725234944

Programmers Manual'i Yukarıda ekledim. PDF'de Hexadesimal değerler 0x.... şeklinde belirtiliyor. Dolayısıyla ben decimal olarak düşündüm ama hex olarak kabul edip bir deneme yapayım.

ibocakir

http://modbus.rapidscada.net/

Şunu kullanarak daha rahat anlayabilirsiniz.

Gönderdiğiniz mesajı parse edecek olursak:

Slave address'i   0x01 olan,
Read Input Registers şeklinde,
0x0821 adresinden itibaren,
0x0008 (8) adet,
CRC 0xF266 (62054) olacak şekilde sorgu atmışsınız.

Bu şekilde bahsettiğiniz C1 ve C2'yi de girerek(response) size gelen mesajları STM32 tarafına girmeden önce anlamlandırabilirsiniz.