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: 

Nenhum comentário:

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...