Mikrodenetleyiciler İçin Mini Modbus Kütüphanesi: Petit Modbus

Başlatan FxDev, 15 Ekim 2016, 22:59:48

FxDev

Arkadaşlar merhabalar, daha önce forumun mesajlaşma kısmında belirttim ama sabitlenmesinde fayda var.

Mikrodenetleyiciler için minicik bir Modbus kütüphanesi!

Detaylar ve video için buradaki yazıma tıklayabilirsiniz: http://www.firatdeveci.com/petit-modbus-kucuk-ama-dev/

Github için: https://github.com/FxDev/PetitModbus

Forumda bazı bağnaz kişiler tarafından engellenip, atıldım. Tüm bu bağnaz kişilere rağmen Atatürkçülüğü sonuna kadar savunacağım; onlar da bağnazlıklarında boğulacaklar. Haberleşme için: info[at]firatdeveci.com / ©firatdeveci.com - ße Different Everytime!

ErsinErce

Paylaşım için Teşekkürler.
ek olarak değişkenleri stdint.h ve stdbool.h ile tanımlarsanız int short vs kavramlarının derleyiciden derleyiciye farklı olmasını engellemiş olursunuz.


FxDev

Merhabalar,

Kütüphaneyi düzenlerken özellikle int benzeri şeyler kullanmamaya özen gösterdim. Nedense hala uint_16 gibi terimler kullanmayı sevmiyorum. Benim için short 16bit long 32 bit vb. gibi yaklaşımlarım var. Yoğurt yeğiş ile ilgili.

Projeye CRC hesaplaması için tablodan çalıştıran olursa bana dosyaları atarsa sevinirim.
Forumda bazı bağnaz kişiler tarafından engellenip, atıldım. Tüm bu bağnaz kişilere rağmen Atatürkçülüğü sonuna kadar savunacağım; onlar da bağnazlıklarında boğulacaklar. Haberleşme için: info[at]firatdeveci.com / ©firatdeveci.com - ße Different Everytime!

kantirici

Paylaşım için teşekkürler.

Modbus ile daha önce hiç çalışmamış birisi olarak soruyorum, işin detayını anlatan bir döküman öneriniz varmı ? Master şunu x byte başlangıç gönderir bu x byte ın açılımları, slave cevap olarak şunu byte byte açıklamaları tarzında.

FxDev

Forumda bazı bağnaz kişiler tarafından engellenip, atıldım. Tüm bu bağnaz kişilere rağmen Atatürkçülüğü sonuna kadar savunacağım; onlar da bağnazlıklarında boğulacaklar. Haberleşme için: info[at]firatdeveci.com / ©firatdeveci.com - ße Different Everytime!

kantirici

Teşekkürler hocam. Aslında yazıyı daha önce okumuştum ama üzerinden zaman geçtiği için unutmuşum.

İlk yazı ve bu kütüphane tam modbus hapı olmuş. Benden daha önce yapan çıkmazsa ben tablodan crc hesabını ekleyeceğim.

hwdesigner

Çok faydalı oldu bu teşekkürler paylaşımınız için

ecunnu

Hocam merhaba paylaşımınız icin tesekkurler. Kütüphaneniz acaba 3.5 karekterlik sureyi kontrol ediyormu?

quarko

Daha önce modbus ile çalıştım fakat burada paylaşılan library yi inceleme fırsatım olmadı henüz. Kendi uğraştığım zamanlarda tablodan CRC hesaplaması yapan fonksiyonum şu şekildeydi.

void CalculateCRC16 (uint8_t num)
{
   uint16_t uIndex=0, m=0;
   uint8_t uchCRCHi=0xFF;
   uint8_t uchCRCLo=0xFF;
   
   
   for(m=0; m<num; m++)
   {
	 uIndex   = uchCRCHi ^ Modbus.DataBuffer[m]; 
	 uchCRCHi = uchCRCLo ^ CRC_16_TABLE[uIndex];
	 uchCRCLo = CRC_16_TABLE[uIndex+256];
   }
      
   Modbus.CRC_Hi = uchCRCLo;
   Modbus.CRC_Lo = uchCRCHi;
}



Bu da CRC tablosu;

#ifndef CRC_TABLE_H_
#define CRC_TABLE_H_

/////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////      MODBUS CRC16 TABLOSU      /////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////
const uint8_t  CRC_16_TABLE[] = {
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81,
0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,
0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01,
0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41,
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81,
0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,
0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01,
0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81,
0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,
0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01,
0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81,
0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,
0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01,
0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81,
0x40, 0x00, 0xC0, 0xC1, 0x01, 0xC3, 0x03, 0x02, 0xC2, 0xC6, 0x06, 0x07, 0xC7, 0x05, 0xC5, 
0xC4, 0x04, 0xCC, 0x0C, 0x0D, 0xCD, 0x0F, 0xCF, 0xCE, 0x0E, 0x0A, 0xCA, 0xCB, 0x0B, 0xC9, 
0x09, 0x08, 0xC8, 0xD8, 0x18, 0x19, 0xD9, 0x1B, 0xDB, 0xDA, 0x1A, 0x1E, 0xDE, 0xDF, 0x1F, 
0xDD, 0x1D, 0x1C, 0xDC, 0x14, 0xD4, 0xD5, 0x15, 0xD7, 0x17, 0x16, 0xD6, 0xD2, 0x12, 0x13, 
0xD3, 0x11, 0xD1, 0xD0, 0x10, 0xF0, 0x30, 0x31, 0xF1, 0x33, 0xF3, 0xF2, 0x32, 0x36, 0xF6, 
0xF7, 0x37, 0xF5, 0x35, 0x34, 0xF4, 0x3C, 0xFC, 0xFD, 0x3D, 0xFF, 0x3F, 0x3E, 0xFE, 0xFA, 
0x3A, 0x3B, 0xFB, 0x39, 0xF9, 0xF8, 0x38, 0x28, 0xE8, 0xE9, 0x29, 0xEB, 0x2B, 0x2A, 0xEA, 
0xEE, 0x2E, 0x2F, 0xEF, 0x2D, 0xED, 0xEC, 0x2C, 0xE4, 0x24, 0x25, 0xE5, 0x27, 0xE7, 0xE6, 
0x26, 0x22, 0xE2, 0xE3, 0x23, 0xE1, 0x21, 0x20, 0xE0, 0xA0, 0x60, 0x61, 0xA1, 0x63, 0xA3, 
0xA2, 0x62, 0x66, 0xA6, 0xA7, 0x67, 0xA5, 0x65, 0x64, 0xA4, 0x6C, 0xAC, 0xAD, 0x6D, 0xAF, 
0x6F, 0x6E, 0xAE, 0xAA, 0x6A, 0x6B, 0xAB, 0x69, 0xA9, 0xA8, 0x68, 0x78, 0xB8, 0xB9, 0x79, 
0xBB, 0x7B, 0x7A, 0xBA, 0xBE, 0x7E, 0x7F, 0xBF, 0x7D, 0xBD, 0xBC, 0x7C, 0xB4, 0x74, 0x75, 
0xB5, 0x77, 0xB7, 0xB6, 0x76, 0x72, 0xB2, 0xB3, 0x73, 0xB1, 0x71, 0x70, 0xB0, 0x50, 0x90, 
0x91, 0x51, 0x93, 0x53, 0x52, 0x92, 0x96, 0x56, 0x57, 0x97, 0x55, 0x95, 0x94, 0x54, 0x9C, 
0x5C, 0x5D, 0x9D, 0x5F, 0x9F, 0x9E, 0x5E, 0x5A, 0x9A, 0x9B, 0x5B, 0x99, 0x59, 0x58, 0x98, 
0x88, 0x48, 0x49, 0x89, 0x4B, 0x8B, 0x8A, 0x4A, 0x4E, 0x8E, 0x8F, 0x4F, 0x8D, 0x4D, 0x4C, 
0x8C, 0x44, 0x84, 0x85, 0x45, 0x87, 0x47, 0x46, 0x86, 0x82, 0x42, 0x43, 0x83, 0x41, 0x81, 
0x80, 0x40  
};
/////////////////////////////////////////////////////////////////////////////////////////
/////////////      256 Byte (High) + 256 Byte (Low) = 512 Byte      /////////////////////
/////////////////////////////////////////////////////////////////////////////////////////

#endif /* CRC_TABLE_H_ */

"Aslanlar kendi hikayelerini yazmadıkça, avcıların kahramanlık hikayelerini dinlemek zorundayız."

Eren Eraslan

şu CRC hesaplama konusunu hala çözemedim. Satır satır güzelce açıklayan bir doküman inceleyen oldu mu?

Hintli youtuberlardan gerçekten usandım.

mesaj birleştirme:: 18 Ekim 2016, 10:58:44

insanın içine işleyen şarkılar ;  https://soundcloud.com/reeraslan

FxDev

3.5 karakterden daha hızlı bir iletişim mi kurmak istiyorsunuz?
Açıkçası ben hiç ihtiyaç duymadım dolayısı ile böyle bir kontrol ihtiyacı da hissetmedim.

CRC tablosunu ekleyen olursa kütüphaneyi güncelleyelim. Ama her halukarda çok da hız kazanılmayacakmış gibi geliyor.
Forumda bazı bağnaz kişiler tarafından engellenip, atıldım. Tüm bu bağnaz kişilere rağmen Atatürkçülüğü sonuna kadar savunacağım; onlar da bağnazlıklarında boğulacaklar. Haberleşme için: info[at]firatdeveci.com / ©firatdeveci.com - ße Different Everytime!

Eren Eraslan

crc tablosuna neden ihtiyaç duyuluyor ?

polinom bilgisi bilinmediği için mi?
insanın içine işleyen şarkılar ;  https://soundcloud.com/reeraslan

FxDev

Eren normalde sitemdeki bilgilere de bakarsan CRC hesaplaması uzun süren bir işlem eski işlemcilerde bu kısım epey süre alıyor eğer tablo şeklinde girersen süreden kazanıyorsun. Modbus'ın iletişim metodunda CRC16 var bir zorunluluk.
Forumda bazı bağnaz kişiler tarafından engellenip, atıldım. Tüm bu bağnaz kişilere rağmen Atatürkçülüğü sonuna kadar savunacağım; onlar da bağnazlıklarında boğulacaklar. Haberleşme için: info[at]firatdeveci.com / ©firatdeveci.com - ße Different Everytime!

Tagli

CRC'nin mikrodenetleyicide hesaplanması zaman alabiliyor. Tablo daha hızlı bir çözüm.

Örneğin şu anda üzerinde çalıştığım bir projede PIC18F26J13'ü 16 MHz'de (4 MIPS) çalıştırıyorum. 250 byte'lık veri içeren bir modbus paketinin CRC'sini yaklaşık 10.5 ms'de hesaplıyor (tablo kullanmadan). Paketin 115200 hızda seri porttan gitmesi ise yaklaşık 22 ms sürüyor.
Gökçe Tağlıoğlu