Picproje Elektronik Sitesi

MİKRODENETLEYİCİLER => Picproje Kütüphane (Library) => Konuyu başlatan: FxDev - 15 Ekim 2016, 22:59:48

Başlık: Mikrodenetleyiciler İçin Mini Modbus Kütüphanesi: Petit Modbus
Gönderen: FxDev - 15 Ekim 2016, 22:59:48
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/ (http://www.firatdeveci.com/petit-modbus-kucuk-ama-dev/)

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

(http://i.hizliresim.com/PQaQXd.png)
Başlık: Ynt: Mikrodenetleyiciler İçin Mini Modbus Kütüphanesi: Petit Modbus
Gönderen: ErsinErce - 15 Ekim 2016, 23:22:51
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.
Başlık: Ynt: Mikrodenetleyiciler İçin Mini Modbus Kütüphanesi: Petit Modbus
Gönderen: kenan_re - 16 Ekim 2016, 11:59:17
Teşekkürler.
Başlık: Ynt: Mikrodenetleyiciler İçin Mini Modbus Kütüphanesi: Petit Modbus
Gönderen: FxDev - 16 Ekim 2016, 13:01:27
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.
Başlık: Ynt: Mikrodenetleyiciler İçin Mini Modbus Kütüphanesi: Petit Modbus
Gönderen: kantirici - 16 Ekim 2016, 13:36:08
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.
Başlık: Ynt: Mikrodenetleyiciler İçin Mini Modbus Kütüphanesi: Petit Modbus
Gönderen: FxDev - 16 Ekim 2016, 14:25:32
@kantirici: Daha önce yazdığım bir yazı var bu konu hakkında.

http://www.firatdeveci.com/tarihi-haberlesme-metodu-modbus-rtu/ (http://www.firatdeveci.com/tarihi-haberlesme-metodu-modbus-rtu/)
Başlık: Ynt: Mikrodenetleyiciler İçin Mini Modbus Kütüphanesi: Petit Modbus
Gönderen: kantirici - 17 Ekim 2016, 10:05:44
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.
Başlık: Ynt: Mikrodenetleyiciler İçin Mini Modbus Kütüphanesi: Petit Modbus
Gönderen: hwdesigner - 17 Ekim 2016, 12:40:11
Çok faydalı oldu bu teşekkürler paylaşımınız için
Başlık: Ynt: Mikrodenetleyiciler İçin Mini Modbus Kütüphanesi: Petit Modbus
Gönderen: ecunnu - 17 Ekim 2016, 22:49:36
Hocam merhaba paylaşımınız icin tesekkurler. Kütüphaneniz acaba 3.5 karekterlik sureyi kontrol ediyormu?
Başlık: Ynt: Mikrodenetleyiciler İçin Mini Modbus Kütüphanesi: Petit Modbus
Gönderen: quarko - 18 Ekim 2016, 00:15:27
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_ */


Başlık: Ynt: Mikrodenetleyiciler İçin Mini Modbus Kütüphanesi: Petit Modbus
Gönderen: Eren Eraslan - 18 Ekim 2016, 10:54:33
ş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

Başlık: Ynt: Mikrodenetleyiciler İçin Mini Modbus Kütüphanesi: Petit Modbus
Gönderen: FxDev - 18 Ekim 2016, 11:39:08
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.
Başlık: Ynt: Mikrodenetleyiciler İçin Mini Modbus Kütüphanesi: Petit Modbus
Gönderen: Eren Eraslan - 18 Ekim 2016, 13:33:39
crc tablosuna neden ihtiyaç duyuluyor ?

polinom bilgisi bilinmediği için mi?
Başlık: Ynt: Mikrodenetleyiciler İçin Mini Modbus Kütüphanesi: Petit Modbus
Gönderen: FxDev - 18 Ekim 2016, 14:36:24
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.
Başlık: Ynt: Mikrodenetleyiciler İçin Mini Modbus Kütüphanesi: Petit Modbus
Gönderen: Tagli - 18 Ekim 2016, 14:46:26
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.
Başlık: Ynt: Mikrodenetleyiciler İçin Mini Modbus Kütüphanesi: Petit Modbus
Gönderen: engerex - 18 Ekim 2016, 15:20:04
 Elinize emeğinize sağlık. Emek verdiğiniz projeyi yayınlamanız çok dah güzel.

@ Peki tablo kullanarak ne kadar fark ediyor? Deneme imkanınız oldu mu?
Başlık: Ynt: Mikrodenetleyiciler İçin Mini Modbus Kütüphanesi: Petit Modbus
Gönderen: FxDev - 25 Ekim 2016, 21:38:30
Deneme sansim olmadi zamanim oldugunda bakacagim.
Başlık: Ynt: Mikrodenetleyiciler İçin Mini Modbus Kütüphanesi: Petit Modbus
Gönderen: kantirici - 02 Haziran 2017, 08:42:15
Modbus lookup table dan crc16 hesaplama;


An example of a C language function performing Modbus CRC16 generation.

static const uint16_t wCRCTable[] = {
0X0000, 0XC0C1, 0XC181, 0X0140, 0XC301, 0X03C0, 0X0280, 0XC241,
0XC601, 0X06C0, 0X0780, 0XC741, 0X0500, 0XC5C1, 0XC481, 0X0440,
0XCC01, 0X0CC0, 0X0D80, 0XCD41, 0X0F00, 0XCFC1, 0XCE81, 0X0E40,
0X0A00, 0XCAC1, 0XCB81, 0X0B40, 0XC901, 0X09C0, 0X0880, 0XC841,
0XD801, 0X18C0, 0X1980, 0XD941, 0X1B00, 0XDBC1, 0XDA81, 0X1A40,
0X1E00, 0XDEC1, 0XDF81, 0X1F40, 0XDD01, 0X1DC0, 0X1C80, 0XDC41,
0X1400, 0XD4C1, 0XD581, 0X1540, 0XD701, 0X17C0, 0X1680, 0XD641,
0XD201, 0X12C0, 0X1380, 0XD341, 0X1100, 0XD1C1, 0XD081, 0X1040,
0XF001, 0X30C0, 0X3180, 0XF141, 0X3300, 0XF3C1, 0XF281, 0X3240,
0X3600, 0XF6C1, 0XF781, 0X3740, 0XF501, 0X35C0, 0X3480, 0XF441,
0X3C00, 0XFCC1, 0XFD81, 0X3D40, 0XFF01, 0X3FC0, 0X3E80, 0XFE41,
0XFA01, 0X3AC0, 0X3B80, 0XFB41, 0X3900, 0XF9C1, 0XF881, 0X3840,
0X2800, 0XE8C1, 0XE981, 0X2940, 0XEB01, 0X2BC0, 0X2A80, 0XEA41,
0XEE01, 0X2EC0, 0X2F80, 0XEF41, 0X2D00, 0XEDC1, 0XEC81, 0X2C40,
0XE401, 0X24C0, 0X2580, 0XE541, 0X2700, 0XE7C1, 0XE681, 0X2640,
0X2200, 0XE2C1, 0XE381, 0X2340, 0XE101, 0X21C0, 0X2080, 0XE041,
0XA001, 0X60C0, 0X6180, 0XA141, 0X6300, 0XA3C1, 0XA281, 0X6240,
0X6600, 0XA6C1, 0XA781, 0X6740, 0XA501, 0X65C0, 0X6480, 0XA441,
0X6C00, 0XACC1, 0XAD81, 0X6D40, 0XAF01, 0X6FC0, 0X6E80, 0XAE41,
0XAA01, 0X6AC0, 0X6B80, 0XAB41, 0X6900, 0XA9C1, 0XA881, 0X6840,
0X7800, 0XB8C1, 0XB981, 0X7940, 0XBB01, 0X7BC0, 0X7A80, 0XBA41,
0XBE01, 0X7EC0, 0X7F80, 0XBF41, 0X7D00, 0XBDC1, 0XBC81, 0X7C40,
0XB401, 0X74C0, 0X7580, 0XB541, 0X7700, 0XB7C1, 0XB681, 0X7640,
0X7200, 0XB2C1, 0XB381, 0X7340, 0XB101, 0X71C0, 0X7080, 0XB041,
0X5000, 0X90C1, 0X9181, 0X5140, 0X9301, 0X53C0, 0X5280, 0X9241,
0X9601, 0X56C0, 0X5780, 0X9741, 0X5500, 0X95C1, 0X9481, 0X5440,
0X9C01, 0X5CC0, 0X5D80, 0X9D41, 0X5F00, 0X9FC1, 0X9E81, 0X5E40,
0X5A00, 0X9AC1, 0X9B81, 0X5B40, 0X9901, 0X59C0, 0X5880, 0X9841,
0X8801, 0X48C0, 0X4980, 0X8941, 0X4B00, 0X8BC1, 0X8A81, 0X4A40,
0X4E00, 0X8EC1, 0X8F81, 0X4F40, 0X8D01, 0X4DC0, 0X4C80, 0X8C41,
0X4400, 0X84C1, 0X8581, 0X4540, 0X8701, 0X47C0, 0X4680, 0X8641,
0X8201, 0X42C0, 0X4380, 0X8341, 0X4100, 0X81C1, 0X8081, 0X4040 };


uint16_t CRC16 (const uint8_t *nData, uint16_t wLength)
{

uint8_t nTemp;
uint16_t wCRCWord = 0xFFFF;

   while (wLength--)
   {
      nTemp = *nData++ ^ wCRCWord;
      wCRCWord >>= 8;
      wCRCWord ^= wCRCTable[nTemp];
   }
   return wCRCWord;

}

Başlık: Ynt: Mikrodenetleyiciler İçin Mini Modbus Kütüphanesi: Petit Modbus
Gönderen: pall66 - 13 Haziran 2017, 17:35:31
modbus sanki bana uzaktan kumanda üzerinde kullanılabilir gibi geliyor deneyeceğim olursa güzel olur ben şu anda arduıno keyes üzerinde çalışma yapıyorum fakat çalışma modu güzel arduınoya aktarılabilme özelliği varsa yardımcı olabilecek arkadaşa teşekür ederim :)
Başlık: Ynt: Mikrodenetleyiciler İçin Mini Modbus Kütüphanesi: Petit Modbus
Gönderen: Ax2_Bx_C - 15 Nisan 2018, 00:23:05
Arkadaşlar kütüphaneyi deneyen oldu mu randımanlı çalışıyor mu?
Başlık: Ynt: Mikrodenetleyiciler İçin Mini Modbus Kütüphanesi: Petit Modbus
Gönderen: mehmet - 15 Nisan 2018, 00:46:34
İnsan kendi yazdığı kütüphaneyi
dememez denemez mi?
Başlık: Ynt: Mikrodenetleyiciler İçin Mini Modbus Kütüphanesi: Petit Modbus
Gönderen: Ax2_Bx_C - 15 Nisan 2018, 00:49:23
Anlamadım?