Stm32 ve CanOpen

Başlatan robikod, 08 Temmuz 2020, 14:15:50

robikod

Merhabalar,

Elimde CanOpen destekli bir sensör ve önceden çalışmış olduğum bir Canbus tecrübem var. Az çok Canbus haberleşmesi yapabiliyorum.

Elimde CAN tranceiver vs. gibi her türlü donanım mevcut. Ancak Canopen haberleşmesi için nereden başlamam gerktiğini bilmiyorum.

https://github.com/zenglongGH/stm32f4-CANopen-project şeklinde bir kod buldum ancak bu koda nereden başlamalıyım nasıl ilerlemelyim tavsiyelerinize ihtiyacım var.

e-zeki

Hocam CANOpen'a ilk defa gireceksen şurası benim için çok açıklayıcı olmuştu bir göz at istersen https://www.csselectronics.com/screen/page/canopen-tutorial-simple-intro/language/en

Şurası da olayın membaı https://www.can-cia.org/canopen/

robikod

Alıntı yapılan: e-zeki - 08 Temmuz 2020, 14:45:03Hocam CANOpen'a ilk defa gireceksen şurası benim için çok açıklayıcı olmuştu bir göz at istersen https://www.csselectronics.com/screen/page/canopen-tutorial-simple-intro/language/en

Şurası da olayın membaı https://www.can-cia.org/canopen/


Video çok faydalı oldu teşekkürler.CanCia'dan 301 dökümanını indirdim elimdeki sensör CiA 301 destekliyormuş. İncelemeye başladım.
Stm32 ile daha önce çalışma yaptınız mı Canopen ile ilgili?

Tagli

Alıntı yapılan: robikod - 09 Temmuz 2020, 08:33:42Stm32 ile daha önce çalışma yaptınız mı Canopen ile ilgili?
Ben yaptım, ama sahada denemem olmadı. Python için yazılmış canopen ile deneme yaptım. Aklımda kaldığı kadarıyla soruları cevaplayabilirim.
Gökçe Tağlıoğlu

e-zeki

Alıntı yapılan: robikod - 09 Temmuz 2020, 08:33:42Video çok faydalı oldu teşekkürler.CanCia'dan 301 dökümanını indirdim elimdeki sensör CiA 301 destekliyormuş. İncelemeye başladım.
Stm32 ile daha önce çalışma yaptınız mı Canopen ile ilgili?
Maalesef CANOpen ile direkt bir tecrübem yok. bir proje için kullanmayı düşünüp bir kısmını öğrenmiştim fakat yeterli zaman olmadığı için stm32'de kendimize has bir protokol geliştirip onu kullandık.

robikod

#5
Alıntı yapılan: Tagli - 09 Temmuz 2020, 09:51:18Ben yaptım, ama sahada denemem olmadı. Python için yazılmış canopen ile deneme yaptım. Aklımda kaldığı kadarıyla soruları cevaplayabilirim.

Peki nasıl başlamalıyım?

Şu kodları referans almayı düşünüyorum : https://github.com/zenglongGH/stm32f4-CANopen-project
Elimde Slave olarak Canopen Destekleyen bir cihaz var kendi Object dictionary'si mevcut.

Önce bir Canopen Initilize gerçekleştirmem gerekiyor sanırım bunun için mevcut kodlarda,CO_Init() fonksiyonu var daha sonra Can ile aynı mantıkta receive ve transmit interrupları olmalı sanıyorum. Ancak yapı çok kompleks geldi. Kendi OD adreslerimi eklemem gerekecek diye düşünmekteyim. 
https://www.alfasanayi.com/content/img/INC/INC_110_Serisi_Can_Open_Cikis.pdf bu sensörü kullanmaya çalışıyorum. Burda bir tablo verilmiş. Bu tbaloyu tek tek bir programla CO_OD.c ve CO_OD.h' a mı dönüştürmeliyim?
Siz master olarak nasıl bir kod kullanmıştınız Stm32 için?

Tagli

CANopen'da tam anlamıyla bir master-slave ilişkisi yok. Ama genel olarak slave cihaz yaptığım söylenebilir. Genel olarak master cihaz hatta bağlı bir bilgisayar veya PLC olur. Görevi sistemi ayarlamak ve başlatmak, çalışan sistemi takip etmek ve gerektiğinde müdahale etmektir ama onun dışında iletişime doğrudan karışmaz.

Ben kütüphaneyi sıfırdan kendim yazdım. CANopen gerçekten de karmaşık. Eğer sıfırdan bir kod yazmayı düşünüyorsan öncelikle object dictionary (OD) ve SDO'lar ile başlamanı öneririm. Bunları çalıştırdıktan sonra PDO servislerini ekleyebilirsin.

Yaptığın cihazda CANopen'ın tüm özelliklerini desteklemene gerek yok. İşine yarayacak kadarını desteklemen yeterli. Bildiğim kadarıyla bazı çok dandik CANopen cihazlarda OD bile yok, önceden belirlenmiş PDO'ları hatta basıyorlar sadece.

Master rolünde bir cihaz yapmaya çalışıyorsan bence sistemi tekrardan bir düşün. Gerçekten böyle bir cihaza ihtiyacın var mı? Yukarıda bahsettiğim Python canopen işini görebilir belki. Sistemin hakkında daha fazla bilgi verirsen belki öneride bulunabiliriz.
Gökçe Tağlıoğlu

robikod

Alıntı yapılan: Tagli - 09 Temmuz 2020, 11:19:22CANopen'da tam anlamıyla bir master-slave ilişkisi yok. Ama genel olarak slave cihaz yaptığım söylenebilir. Genel olarak master cihaz hatta bağlı bir bilgisayar veya PLC olur. Görevi sistemi ayarlamak ve başlatmak, çalışan sistemi takip etmek ve gerektiğinde müdahale etmektir ama onun dışında iletişime doğrudan karışmaz.

Ben kütüphaneyi sıfırdan kendim yazdım. CANopen gerçekten de karmaşık. Eğer sıfırdan bir kod yazmayı düşünüyorsan öncelikle object dictionary (OD) ve SDO'lar ile başlamanı öneririm. Bunları çalıştırdıktan sonra PDO servislerini ekleyebilirsin.

Yaptığın cihazda CANopen'ın tüm özelliklerini desteklemene gerek yok. İşine yarayacak kadarını desteklemen yeterli. Bildiğim kadarıyla bazı çok dandik CANopen cihazlarda OD bile yok, önceden belirlenmiş PDO'ları hatta basıyorlar sadece.

Master rolünde bir cihaz yapmaya çalışıyorsan bence sistemi tekrardan bir düşün. Gerçekten böyle bir cihaza ihtiyacın var mı? Yukarıda bahsettiğim Python canopen işini görebilir belki. Sistemin hakkında daha fazla bilgi verirsen belki öneride bulunabiliriz.

Tamamen Canopen'ı öğrenme ve çalıştırma amacım var. Canopen destekleyen sensörle haberleşmeyi amaç edindim . Mesela Canopen ile sensör verilerini almak gibi. Aslında sıfırdan kod yazma gibi bir amacım yok tamamen mevcut kodlar üzerinden ilerleyerek gitmek istiyorum. Elimdeki cihazın kendi OD'si de mevcut. Basit bir iletişim kurmak bile benim için büyük bir adım olacaktır. Stm32 ile yapmak istiyorum bu işlemi.

e-zeki

Alıntı yapılan: robikod - 09 Temmuz 2020, 11:27:28Tamamen Canopen'ı öğrenme ve çalıştırma amacım var. Canopen destekleyen sensörle haberleşmeyi amaç edindim . Mesela Canopen ile sensör verilerini almak gibi. Aslında sıfırdan kod yazma gibi bir amacım yok tamamen mevcut kodlar üzerinden ilerleyerek gitmek istiyorum. Elimdeki cihazın kendi OD'si de mevcut. Basit bir iletişim kurmak bile benim için büyük bir adım olacaktır. Stm32 ile yapmak istiyorum bu işlemi.


Hocam amacın efektif olarak stm32 ile can iletişimi kurmak ise işe önce layer filtreleme ile başla OD'ye bakarak requestler yapıp kendi filtrelerine düşürüp düşüremediğini kontrol et. çünkü CAN'de yanlış filtreleme gerçekten saç baş yoldurtuyor.

robikod

#9
Alıntı yapılan: e-zeki - 09 Temmuz 2020, 14:27:52Hocam amacın efektif olarak stm32 ile can iletişimi kurmak ise işe önce layer filtreleme ile başla OD'ye bakarak requestler yapıp kendi filtrelerine düşürüp düşüremediğini kontrol et. çünkü CAN'de yanlış filtreleme gerçekten saç baş yoldurtuyor.

Canbus ile çalıştım aslında az çok biliyorum alt yapısını. Bu yukarıda attığım kodlara bakınca biraz kafam karışmıştı.

Normal CAN mesajlarının içeriğine OD ye bakarak request frameleri göndersem ilk aşama için iyi bir ilerleme olur mu? Mesela şurada https://github.com/w1ne/CANOpenNode-CubeMX-HAL/tree/master/Code/Lib/bsp/CANOpenNode/STM32HAL .c ve .h dosyaları mevcut ben OD'den Indexlere ve subindexlere bakarak bu kodlarla haberleşme kurabilir miyim sizce?

Mesela incelerseniz .c dosyasında CO_CANsend(CO_CANmodule_t *CANmodule, CO_CANtx_t *buffer) şeklinde bir fonksiyon var. Bu ilk aşamda yardımcı olur mu CANmodule_t kısmına ve buffer kısmına istediğim parametreleri girsem.

Benim incelediğim kodda RTOS çalıştırılıyor sanırım çalışma sırasını tam olarak anlayamıyorum o yüzden.

e-zeki

Alıntı yapılan: robikod - 09 Temmuz 2020, 16:20:26Normal CAN mesajlarının içeriğine OD ye bakarak request frameleri göndersem ilk aşama için iyi bir ilerleme olur mu? Mesela şurada https://github.com/w1ne/CANOpenNode-CubeMX-HAL/tree/master/Code/Lib/bsp/CANOpenNode/STM32HAL .c ve .h dosyaları mevcut ben OD'den Indexlere ve subindexlere bakarak bu kodlarla haberleşme kurabilir miyim sizce?

Mesela incelerseniz .c dosyasında CO_CANsend(CO_CANmodule_t *CANmodule, CO_CANtx_t *buffer) şeklinde bir fonksiyon var. Bu ilk aşamda yardımcı olur mu CANmodule_t kısmına ve buffer kısmına istediğim parametreleri girsem.

Evet remote request gönderirsen muhtemelen bir cevap alırsın fakat kodda gördüğüm kadarıyla filtre 0,0, ayarlanmış bu haliyle CO Master gibi çalışır tüm id'ler gelir. size de mutlaka bir mesaj döndürecektir.
kod çok detaylı ama karmaşık görünüyor, muhtemelen bu kodu anlarsanız canopen'ı da büyük ölçüde bitirmiş olursunuz.

Tagli

Aklımda yanlış kalmadıysa remote request farklı bir şey ve CANopen'da kullanılması pek tavsiye edilmiyor. Bence yapılması gereken SDO protokolünü araştırmak. SDO kullanılarak OD üzerindeki verilere istenildiği gibi erişilebilir. 4 byte'a kadar olan verileri almak daha kolay. Ancak daha büyük veriler için prosedür bir miktar karışıyor.
Gökçe Tağlıoğlu