biblioteca - código ModBus

Software e Hardware para uC PIC

Moderadores: andre_luis, 51, guest2003, Renie

biblioteca - código ModBus

Mensagempor marcelo campos » 08 Set 2015 13:53

Pessoal

alguém conhece alguma biblioteca ou código, de ModBus para PIC ?


valeu
"Há 10 tipos de pessoas: os que entendem números binários e os que não entendem..."
marcelo campos
Word
 
Mensagens: 648
Registrado em: 08 Ago 2009 08:37

Re: biblioteca - código ModBus

Mensagempor B-EAGLE » 09 Set 2015 11:34

Não sei exatamente como vai funcionar teu firmware, mas acho que a única coisa no Modbus RTU que é digna de alguma biblioteca é o cálculo de CRC, o resto é muito simples.

Mas talvez eu esteja subestimando tbm... esse código que uso pra verificar se os 2 ultimos bytes do CRC16 batem:

cpp code
uint8_t UTIL_CRC_Ok(volatile uint8_t *array, volatile uint8_t size) {
volatile uint16_t crc = 0xFFFF, lsb;
volatile uint8_t i, j, ss;
ss = size;
for(i = 0; i < size-2; i++) {
crc ^= array[i];
for (j = 0; j < 8; j++) {
lsb = (crc & 0x0001);
crc = ((crc >> 1) & 0x7FFF);
if (lsb) {
crc ^= 0xA001;
}
}
}
if (((crc>>8)&0xFF) == array[size-1] && (crc&0xFF) == array[size-2])
return 1;
else
return 0;
}
B-EAGLE
Word
 
Mensagens: 847
Registrado em: 19 Out 2006 14:12
Localização: Campo Grande - MS

Re: biblioteca - código ModBus

Mensagempor marcelo campos » 10 Set 2015 08:55

B-EAGLE tem razão, mas se tiver algo pronto me poupa um tempo de trabalho :-)

estava usando o da CCS, mas quero algo de licença aberta, preferência pra outro compilador que não o CCS

valeu
"Há 10 tipos de pessoas: os que entendem números binários e os que não entendem..."
marcelo campos
Word
 
Mensagens: 648
Registrado em: 08 Ago 2009 08:37

Re: biblioteca - código ModBus

Mensagempor morais » 11 Set 2015 22:36

marcelo campos escreveu:B-EAGLE tem razão, mas se tiver algo pronto me poupa um tempo de trabalho :-)

estava usando o da CCS, mas quero algo de licença aberta, preferência pra outro compilador que não o CCS

valeu

Não é uma lib mas eu comuniquei com um supervisório com este codigo, fiz no mikroC, só ta meio bagunçado.
Se vc entender o protocolo modbus vai entender o codigo.
usei com o bom e velho pic16f877a.
implementa entradas e saidas, digitais e analogicas.
MyProject.c
Você não está autorizado a ver ou baixar esse anexo.
morais
Bit
 
Mensagens: 13
Registrado em: 06 Jun 2010 22:09
Localização: MA

Re: biblioteca - código ModBus

Mensagempor marcelo campos » 14 Set 2015 09:42

morais escreveu:
marcelo campos escreveu:B-EAGLE tem razão, mas se tiver algo pronto me poupa um tempo de trabalho :-)

estava usando o da CCS, mas quero algo de licença aberta, preferência pra outro compilador que não o CCS

valeu

Não é uma lib mas eu comuniquei com um supervisório com este codigo, fiz no mikroC, só ta meio bagunçado.
Se vc entender o protocolo modbus vai entender o codigo.
usei com o bom e velho pic16f877a.
implementa entradas e saidas, digitais e analogicas.
MyProject.c


Opa morais, muito obrigado, vou testar ela e tá ótimo, já me quebrou um galhão.
vou tentar deixá-la talvez só mais ANSI C pra compartilhar, tudo bem pra você ?

abraço e obrigado,

marcelo
"Há 10 tipos de pessoas: os que entendem números binários e os que não entendem..."
marcelo campos
Word
 
Mensagens: 648
Registrado em: 08 Ago 2009 08:37

Re: biblioteca - código ModBus

Mensagempor eletroinf » 14 Set 2015 11:39

Tem ainda a opção de calcular o CRC utilizando tabela, o que ocupa mais espaço porém fica mais rápido.
Eu utilizei esta bagunça abaixo em 2006, se não peguei o arquivo errado é o que está funcionando.

Código: Selecionar todos
const unsigned char tab_crc_h[] = {
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   };

const unsigned char tab_crc_l[] = {
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   };


/***********************************************************************************
Função que calcula o CRC.
Recebe: ponteiro para o telegrama; número de bytes do telegrama.
Retorna: nada.
O CRC é salvo nos 2 bytes imediatamente subsequentes do telegrama.
***********************************************************************************/
void CRC_modbus_rtu(unsigned char *pointer, unsigned char n_bytes)
{
   unsigned char cont_carac, carac=0;
   unsigned char crc_h = 0xFF;
   unsigned char crc_l = 0xFF;
   
   cont_carac=0;
   do
   {
      carac   =crc_l ^ *pointer++;
      crc_l   = crc_h ^ tab_crc_h[carac];
      crc_h   = tab_crc_l[carac];
      cont_carac++;
   } while(cont_carac < n_bytes);
   
   *pointer++   = crc_l;
   *pointer++   = crc_h;
}
"De cada um segundo sua capacidade a cada um segundo sua necessidade."
Avatar do usuário
eletroinf
Word
 
Mensagens: 948
Registrado em: 12 Out 2006 14:59
Localização: Santa Maria - RS

Re: biblioteca - código ModBus

Mensagempor morais » 15 Set 2015 13:21

marcelo campos escreveu:
morais escreveu:
marcelo campos escreveu:B-EAGLE tem razão, mas se tiver algo pronto me poupa um tempo de trabalho :-)
Opa morais, muito obrigado, vou testar ela e tá ótimo, já me quebrou um galhão.
vou tentar deixá-la talvez só mais ANSI C pra compartilhar, tudo bem pra você ?

abraço e obrigado,

marcelo

kk , cara fica à vontade, inclusive se vc não conseguir usar o código. Eu posso rever pra vc, pq usei isso à anos.
:wink:
morais
Bit
 
Mensagens: 13
Registrado em: 06 Jun 2010 22:09
Localização: MA


Voltar para PIC

Quem está online

Usuários navegando neste fórum: Nenhum usuário registrado e 1 visitante

x