Picproje Elektronik Sitesi

MİKRODENETLEYİCİLER => ARM => Cortex ARM => Konuyu başlatan: Mucit23 - 14 Ekim 2019, 21:42:03

Başlık: Basit Bir şekilde ModBus Haberleşmesi
Gönderen: Mucit23 - 14 Ekim 2019, 21:42:03
Selamlar

Elimde ModBus ile haberleşen Hamilton'nun PH problarından var.
(https://i.postimg.cc/wjdXN3ry/Sensor-Easy-Ferm-Plus-Traditional.jpg)
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 (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. 
Başlık: Ynt: Basit Bir şekilde ModBus Haberleşmesi
Gönderen: tunayk - 14 Ekim 2019, 23:10:07
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.
Başlık: Ynt: Basit Bir şekilde ModBus Haberleşmesi
Gönderen: apsis - 14 Ekim 2019, 23:46:36
3,4,16 'ıncı fonksiyonlar işini görüyor zaten.

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

Burada fonksiyonlar hakkında bilgi var.

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

Başlık: Ynt: Basit Bir şekilde ModBus Haberleşmesi
Gönderen: Mucit23 - 14 Ekim 2019, 23:55:59
Teşekkürler. Dediğiniz gibi tüm modbus fonksiyonlarını gömmeme gerek yok. Basit bir gönderip alma fonksiyonu yazacağım.
Başlık: Ynt: Basit Bir şekilde ModBus Haberleşmesi
Gönderen: secretagent - 15 Ekim 2019, 10:24:01
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.
Başlık: Ynt: Basit Bir şekilde ModBus Haberleşmesi
Gönderen: Mucit23 - 04 Kasım 2019, 00:17:35
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.
(https://i.postimg.cc/Hk7S06vZ/Ekran-Al-nt-s.png)
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?
Başlık: Ynt: Basit Bir şekilde ModBus Haberleşmesi
Gönderen: apsis - 04 Kasım 2019, 09:04:33
@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.
Başlık: Ynt: Basit Bir şekilde ModBus Haberleşmesi
Gönderen: Murat Mert - 04 Kasım 2019, 21:45:09
@Mucit23 baudrate bozuk değilse gelen datalar modbus datalarına benzemiyor.
Başlık: Ynt: Basit Bir şekilde ModBus Haberleşmesi
Gönderen: Mucit23 - 04 Kasım 2019, 21:55:54
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.
Başlık: Ynt: Basit Bir şekilde ModBus Haberleşmesi
Gönderen: foseydon - 04 Kasım 2019, 23:47:05
@Mucit23

doğruyu yanlışı neye göre belirliyorsun hocam? Bu çıktı yanlış, şu olması lazımdı diyorsan o zaman doğru baudu hesap edebilirsin..
Başlık: Ynt: Basit Bir şekilde ModBus Haberleşmesi
Gönderen: ErsinErce - 05 Kasım 2019, 01:11:07
Default 19200 8N2 gibi gözüküyor datasheet te

https://store.chipkin.com/products/tools/cas-modbus-scanner
bu aracı kullanabilirsin ücretsizdir
Başlık: Ynt: Basit Bir şekilde ModBus Haberleşmesi
Gönderen: Mucit23 - 19 Kasım 2019, 00:44:22
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
(https://i.postimg.cc/ydyNtz1K/Ads-z.jpg)
Ş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
(https://i.postimg.cc/hjMqBDHS/Ekran-Al-nt-s.jpg)
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ı?
Başlık: Ynt: Basit Bir şekilde ModBus Haberleşmesi
Gönderen: Tagli - 19 Kasım 2019, 00:58:55
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.
Başlık: Ynt: Basit Bir şekilde ModBus Haberleşmesi
Gönderen: Mucit23 - 19 Kasım 2019, 01:11:45
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.
Başlık: Ynt: Basit Bir şekilde ModBus Haberleşmesi
Gönderen: ibocakir - 19 Kasım 2019, 09:12:38
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.
Başlık: Ynt: Basit Bir şekilde ModBus Haberleşmesi
Gönderen: Mucit23 - 19 Kasım 2019, 23:47:09
Adres kısmında nasıl bir hata yapıyor olabilirim? Adresi yanlış giriyorum sorun bu.

SimplyModbus'da ILLEGAL DATA ADRESS için aşağıdaki gibi bir açıklama mevcut.
Alıntı YapThe data address received in the query is not an allowable address for the slave. More specifically, the combination of reference number and transfer length is invalid. For a controller with 100 registers, a request with offset 96 and length 4 would succeed, a request with offset 96 and length 5 will generate exception 02.

Adres aralığı dökümandaki gibi doğrudan yazılıyormu yada herhangi bir ofset vs mi ekleniyor emin değilim. Fakat Doğrudan yazınca hata alıyorum. Adres değerleri dökümanda desimal olarak verilmiş. Ben HEX karşılığını gönderiyorum.

Yardımcı olabilecek biri var mı?
Başlık: Ynt: Basit Bir şekilde ModBus Haberleşmesi
Gönderen: fahri- - 20 Kasım 2019, 09:40:25
Masterdan gönderdiğin tüm datalar hex kodunda olursa kafan karışmaz sanıyorum.
Decimal veya hex farketmez. işlemcinden gönderdiğin data sonuçta karşıya hex olarak gidecek. 100Decimal göndermekle 64Hex göndermek aynı şey.
Slave'i sorguladığında sana cevap dönüyorsa slave adresin yanlış değildir. Sorgulamanda hata vardır. Çünkü adres yanlışsa slave, bu benim adresim değil der ve cevap vermez.
İlegal data adres demek, sorguladığın okumak istediğin data adresinin slave de olmaması demek. Yani yanlış data adres sorguluyorsun.
Başlık: Ynt: Basit Bir şekilde ModBus Haberleşmesi
Gönderen: Mucit23 - 20 Kasım 2019, 10:57:07
Evet aynen öyle Slave adres doğru. Adresi değişince sensör hiç cevap vermiyor. Sorun dediğiniz gibi. Sorgulama yaptığım adres yanlış muhtemelen ama anlamıyorum. Elimdeki dökümanda adresler net bir şekilde belirtilmiş. Sensörle ilgili başka bir döküman da bulamadım. Hatta aynı yapıda bir oksijen sensörünün manualine baktım. Primary Measueement Channel adresleri aynı. Request ve repsonse için örnek de vermişler. Benim yaptığım sorgular aynı. Sensörün manualinin farklı olabileceğinden şüphelenmeye başladım.

Dün gece Hamilton firmasının destek kısmına mail attım sorunumu yazdım. Bugün teknik bir yetkilinin benimle ilgileneceğini belirten bir cevap yazdılar.

Bakalım ordan ne çıkacak. 
Başlık: Ynt: Basit Bir şekilde ModBus Haberleşmesi
Gönderen: fahri- - 20 Kasım 2019, 16:28:51
Eğer adresler manuelde yanlışsa holding registerları sırasıyla tarayan ufak bir rutin yaz. Sırayla okusun, Biraz zaman alır ama bulunur.
Başlık: Ynt: Basit Bir şekilde ModBus Haberleşmesi
Gönderen: Cemre. - 20 Kasım 2019, 18:09:08
QModMaster isimli yazılım ile USB RS485 dönüştürücü kullanarak kolayca denemeler yapabilirsiniz.
Başlık: Ynt: Basit Bir şekilde ModBus Haberleşmesi
Gönderen: Mucit23 - 20 Kasım 2019, 19:39:52
Hamiltondan bana bu şekilde bir uyarı geldi. Aşağıdaki açıklamaları dikkate almam gerektiğini söylüyorlar
(https://i.postimg.cc/BnbFQ9PC/image001.png)

Verilen açıklamada "Bazı Modbus Master Protokollerinde Register sayacı 0 dan başlar. Genellikle Modbus Master Yazılımı bu addreslemeyi çevirir."

Demek istediğini anladım fakat Burda Modbus Master Yazılımı SimplyModbus gibi bir yazılım. Veya doğrudan STM32 ile gönderiyorum. Ne göndersem o gidiyor. Ama dediğini bir deneyeyim. İlginç bir durum.
Başlık: Ynt: Basit Bir şekilde ModBus Haberleşmesi
Gönderen: Mucit23 - 21 Kasım 2019, 00:03:40
Sanırım sorunu çözdüm.  :)  Aynen mailde belirttikleri gibi Okumak istenen Adres - 1 yapmak gerekiyormuş. Şimdi İllegal Data Adress hatası düzeldi. 2090 Nolu Adresten Sorgulama yaptığımda Aşağıdaki cevabı alıyorum şuanda.

01 03 14 10 00 00 00 A1 84 40 F6 00 00 00 00 00 00 00 00 00 00 41 60 64 B0

2090 Nolu Adres için Manual'de aşağıdaki gibi bir açıklama mevcut.
(https://i.postimg.cc/NM8QntnR/Ekran-Al-nt-s.jpg)

Reg3 ve Reg4 PH değeri olması gerekiyor açıklamaya göre. Yani 0x40F6A184 değeri lazım bana. Eğer sıralama yanlış olmadıysa anlık PH değeri bu olması gerekir. Bunu float olarak çevirdiğimde 7.7072163 yapar ki Buda Bekleme Sıvısının PH değeri olsa gerek.

Her okuma yaptığımda Bu değer değişiyor. Okunan değer 7.69-7.70 arası değişiyor. 

Aynı Şekilde PMC6 yı da okuyarak Sıcaklık verilerine de ulaştım. Cevap yazan arkadaşlara teşekkürler.