Mostrando postagens com marcador modbus. Mostrar todas as postagens
Mostrando postagens com marcador modbus. Mostrar todas as postagens

23 de ago. de 2012

Complemento de 2 em Hexadecimal em C

Para converter um número em decimal para seu complemento de dois, conforme usado no post anterior, utilizei o seguinte programa em C:

int inteiro=236;
unsigned char buf[20];
sprintf(buf,"%X",0xFFFFF-inteiro+1);   

printf("%c%c",buf[3],buf[4]);
       
>> 14

Descrevendo as operações realizadas:
sprintf - retorna um inteiro com o númeor de caracteres (informação inútil para mim neste programa) e faz a string do primeiro argumento (buf) receber, no formato em que está (%X, que significa hexadecimal) a variável no terceiro argumento, que na verdade, é a conta de complemento de dois: FFFFF-DEC2HEX(inteiro) (ele já interpreta como hexadecimal pelo %X) +1.

21 de ago. de 2012

Calcular LRC em MODBUS ASCII

Dada uma mensagem do tipo :0104020A11, temos que calcular mais dois caracteres para serem enviados, além dos caracteres de terminação 0x0D (13) e 0x0A (11), que devem seguir no fim da mensagem. Numa mensagem do tipo ASCII, dentro do protocolo MODBUS, esses caracteres, necessários para fazer verificação de erro, são chamados Longitudinal Redundancy Check (LRC) ou horizontal redundancy check, e são calculados da seguinte maneira:

1) Passar cada par de hexa para decimal
2) Somar todos os resultados
3) Fazer a operação FFFFFFF-resultado de 2

Para o exemplo :0104020A11, fazemos

01 = 1 em hexa
04 = 4
02 = 2
A = 10
11 = 17

Você pode realizar essa operação numa planilha no Google Docs, da seguinte maneira: HEX2DEC

Passo 1: Da coluna A para B
A soma, feita em decimal mesmo, é 1+4+2+10+17=34. Em seguida, faz-se a diferença, na planilha pode ser usada a função DEC2HEX, lembrando que deve entrar o negativo do resultado da soma. De forma mais detalhada, esta operação DEC2HEX(-ans) faz a conversão do total (no exemplo, 34) em hexadecimal (que dá 22) e tira a diferença FFFFF-22=FFFFDD, somando 1 a este resultado: FFFDE (ou seja, complemento de 2).


O valor do LRC são os dois últimos caracteres e devem ser enviados junto com a mensagem. A mensagem final ficaria:

 :0104020A11DE\r\n

Se enviarmos em um terminal com seus valores na tabela ASCII, ficaria:

3A 30 31 30 34 30 32 30 41 31 31 44 45 0D 0A


Fonte de consulta: 

Quem sou eu

Raphael Fernandes
Carioca, Brasileiro, Estudante de Robótica
Hiperativo, Imperativo
Gosto de tecnologia, de transporte, de Rock, de reclamar e de propagandas criativas (e outras coisas que posso ter falado em um post ou não)
Musicalmente falando, sou assim.

Related Posts Plugin for WordPress, Blogger...

Veja também...