Baixe o app para aproveitar ainda mais
Prévia do material em texto
PROTOCOLO CRC – Mostrador Digital • CMD – Comando enviado para painel • NFR – Número do Frame • NFRAME – Número de Frames do pacote • TAM_DATA – Número de dados a serem transmitidos Input Dados (Comando 0x80): Exemplo de painel com 8 dígitos. 01 02 50 01 01 DB 01 01 80 01 01 00 08 31 32 33 34 35 36 37 38 03 6A AB Cabeçalho: 01 – SOH 02 – STX 50 – CLASSE DA ORIGEM 01 – GRUPO DA ORIGEM 01 – ID DA ORIGEM DB – CLASSE DO DESTINO (MOSTRADOR DIGITAL) 01 – GRUPO DO DESTINO 01 – ID DO DESTINO (ID do Painel – Configuração feita pela DipSwitch na CPU do Painel) 80 – COMANDO INPUT DADOS 01 – NÚMERO DO FRAME NO PACOTE 01 – NÚMERO DE FRAMES EXISTENTES NO PACOTE 00 08 – TAMANHO DOS DADOS A SEREM TRANSMITIDOS (HEX) Dados: 31 – ‘1’ (ASC) 32 – ‘2’ (ASC) 33 – ‘3’ (ASC) SOH STX CLAS. ORIG. GROUP ORIG. ID ORIG. CLAS. DEST. GROUP DEST. ID DEST. CMD NFR NFRAME TAM_DATA DATA ETX CRC 01 byte 01 byte 01byte 01 byte 01 byte 01 byte 01 byte 01 byte 01 byte 01 byte 01 byte 02 byte n bytes 01 byte 02 bytes 01h 02h 03h 34 – ‘4’ (ASC) 35 – ‘5’ (ASC) 36 – ‘6’ (ASC) 37 – ‘7’ (ASC) 38 – ‘8’ (ASC) 03 – ETX 6A AB – CRC - CHECKSUN OBS: O Exemplo acima coloca os seguintes valores nos campos: Campo 01 – Valor 12345678. *Alterando o valor enviado, basta aumentar ou diminuir o número de dados transmitidos. Configuração das Dip’s Dip 1 – OFF : Protocolo CRC / ON: Protocolo BCC Dip 2 – OFF : Não Pisca / ON: Pisca ao receber novo valor Dip 3 e Dip 4 – Tempo de Acionamento Relé e Beep. OFF – OFF: 3 segundos OFF – ON: 5 segundos ON – OFF: 7 segundos ON – ON: 9 segundos Dip 5, Dip 6, Dip 7 e Dip 8: Configuração do ID do Painel (Dip 8 menos significativa). Cálculo do CRC16 em Linguagem C: //=============================================================== // // CÁLCULO DO VALOR CRC16 // RESULTADO: Valor CRC16 (16 Bits) // //=============================================================== short CRC_Calc(unsigned char *Char_Addr,unsigned short Char_Qtdy) { unsigned short CRC16 = 0xFFFF; // Buffer para valor CRC16 calculado unsigned short Char_to_CRC; // Buffer para operar caracteres durante cálculo CRC16 unsigned char Bit_Counter; // Contador de bits do caracter a adicionar ao cálculo CRC16 unsigned char Polin_Flag; // Flag para sinalizar se necessário calcular com Polinômio const unsigned short Polynom = 0x1021; // Polinômio para cálculo do valor CRC16 while (Char_Qtdy != 0) // Enquanto não processados todos os caracteres previstos { Bit_Counter = 8; // Contador de bits de cada caracter a ser processado Char_to_CRC = (*Char_Addr * 256); // Prepara caracter do Buffer para cálculo CRC16 = (CRC16 ^ Char_to_CRC); // CRC16 = (Valor atual CRC16 EXOR'ed com caracterdo Buffer while (Bit_Counter != 0) // Enquanto não processados todos os bits do caracter atual { if (CRC16 > 32767) // Se bit 15 do CRC atual = 1 { Polin_Flag = 1; // Sinaliza necessária operação com o POLINÔMIO PADRÃO } else { Polin_Flag = 0; // Sinaliza desnecessário operação com o POLINÔMIO PADRÃO } CRC16 = (CRC16 * 2); // Shift Left valor CRC16 atual if (Polin_Flag != 0) // Se bit 15 do CRC atual = 1 { CRC16 = (CRC16 ^ Polynom); // ExOR valor CRC16 atual e polinômio padrão } Bit_Counter--; // Decrementa contador de bits do caracter atual } Char_Addr++ ; // Prepara ponteiro para o próximo caracter a processar Char_Qtdy-- ; // Decrementa contador de caracteres a processar } return CRC16; }
Compartilhar