MODBUS RTU - Delphi....algumas rotinas iniciais

Programação Delphi e Pascal

Moderadores: 51, guest2003

MODBUS RTU - Delphi....algumas rotinas iniciais

Mensagempor jeanfernandes » 09 Fev 2007 21:33

Tipos de Dados

Código: Selecionar todos
type
   TMODBUS_stream = record
     tamanho   :   byte;
     dados    : array[1..256] of byte;
   end;



Constantes

Código: Selecionar todos
   MODBUS_CRC_HIGH : array[0..255] of byte = (
    $00, $C1, $81, $40, $01, $C0, $80, $41, $01, $C0, $80, $41, $00, $C1, $81, $40,
    $01, $C0, $80, $41, $00, $C1, $81, $40, $00, $C1, $81, $40, $01, $C0, $80, $41,
    $01, $C0, $80, $41, $00, $C1, $81, $40, $00, $C1, $81, $40, $01, $C0, $80, $41,
    $00, $C1, $81, $40, $01, $C0, $80, $41, $01, $C0, $80, $41, $00, $C1, $81, $40,
    $01, $C0, $80, $41, $00, $C1, $81, $40, $00, $C1, $81, $40, $01, $C0, $80, $41,
    $00, $C1, $81, $40, $01, $C0, $80, $41, $01, $C0, $80, $41, $00, $C1, $81, $40,
    $00, $C1, $81, $40, $01, $C0, $80, $41, $01, $C0, $80, $41, $00, $C1, $81, $40,
    $01, $C0, $80, $41, $00, $C1, $81, $40, $00, $C1, $81, $40, $01, $C0, $80, $41,
    $01, $C0, $80, $41, $00, $C1, $81, $40, $00, $C1, $81, $40, $01, $C0, $80, $41,
    $00, $C1, $81, $40, $01, $C0, $80, $41, $01, $C0, $80, $41, $00, $C1, $81, $40,
    $00, $C1, $81, $40, $01, $C0, $80, $41, $01, $C0, $80, $41, $00, $C1, $81, $40,
    $01, $C0, $80, $41, $00, $C1, $81, $40, $00, $C1, $81, $40, $01, $C0, $80, $41,
    $00, $C1, $81, $40, $01, $C0, $80, $41, $01, $C0, $80, $41, $00, $C1, $81, $40,
    $01, $C0, $80, $41, $00, $C1, $81, $40, $00, $C1, $81, $40, $01, $C0, $80, $41,
    $01, $C0, $80, $41, $00, $C1, $81, $40, $00, $C1, $81, $40, $01, $C0, $80, $41,
    $00, $C1, $81, $40, $01, $C0, $80, $41, $01, $C0, $80, $41, $00, $C1, $81, $40
   );

   MODBUS_CRC_LOW : array[0..255] of byte = (
    $00, $C0, $C1, $01, $C3, $03, $02, $C2, $C6, $06, $07, $C7, $05, $C5, $C4, $04,
    $CC, $0C, $0D, $CD, $0F, $CF, $CE, $0E, $0A, $CA, $CB, $0B, $C9, $09, $08, $C8,
    $D8, $18, $19, $D9, $1B, $DB, $DA, $1A, $1E, $DE, $DF, $1F, $DD, $1D, $1C, $DC,
    $14, $D4, $D5, $15, $D7, $17, $16, $D6, $D2, $12, $13, $D3, $11, $D1, $D0, $10,
    $F0, $30, $31, $F1, $33, $F3, $F2, $32, $36, $F6, $F7, $37, $F5, $35, $34, $F4,
    $3C, $FC, $FD, $3D, $FF, $3F, $3E, $FE, $FA, $3A, $3B, $FB, $39, $F9, $F8, $38,
    $28, $E8, $E9, $29, $EB, $2B, $2A, $EA, $EE, $2E, $2F, $EF, $2D, $ED, $EC, $2C,
    $E4, $24, $25, $E5, $27, $E7, $E6, $26, $22, $E2, $E3, $23, $E1, $21, $20, $E0,
    $A0, $60, $61, $A1, $63, $A3, $A2, $62, $66, $A6, $A7, $67, $A5, $65, $64, $A4,
    $6C, $AC, $AD, $6D, $AF, $6F, $6E, $AE, $AA, $6A, $6B, $AB, $69, $A9, $A8, $68,
    $78, $B8, $B9, $79, $BB, $7B, $7A, $BA, $BE, $7E, $7F, $BF, $7D, $BD, $BC, $7C,
    $B4, $74, $75, $B5, $77, $B7, $B6, $76, $72, $B2, $B3, $73, $B1, $71, $70, $B0,
    $50, $90, $91, $51, $93, $53, $52, $92, $96, $56, $57, $97, $55, $95, $94, $54,
    $9C, $5C, $5D, $9D, $5F, $9F, $9E, $5E, $5A, $9A, $9B, $5B, $99, $59, $58, $98,
    $88, $48, $49, $89, $4B, $8B, $8A, $4A, $4E, $8E, $8F, $4F, $8D, $4D, $4C, $8C,
    $44, $84, $85, $45, $87, $47, $46, $86, $82, $42, $43, $83, $41, $81, $80, $40
  );



Funções

Código: Selecionar todos
(** MOD-001 **)
function TFormPrincipal.MODBUS_CRC_Calcular(dados : TMODBUS_Stream) : word;
var
   valor       : word;
  valorh     : byte;
  valorl     : byte;
  contador  : byte;
  indice       : byte;
begin
   valorh   := $FF;
  valorl  := $FF;
  valor      := $0000;

  for contador := 1 to dados.tamanho do begin
     indice := valorl xor dados.dados[contador];
    valorl := valorh xor MODBUS_CRC_HIGH[indice];
    valorh := MODBUS_CRC_LOW[indice];
  end;

  valor := (word(valorh) shl 8) + word(valorl);

  result := valor;
end;

(** MOD-002 **)
procedure TFormPrincipal.MODBUS_CRC_Inserir(var dados : TMODBUS_Stream);
var
   valor : word;
  tam   : byte;
begin
   valor := MODBUS_CRC_Calcular(dados);

   tam := Dados.tamanho;

  Dados.dados[tam+1] := byte(valor);
  Dados.dados[tam+2] := byte(valor shr 8);

  Dados.tamanho := Dados.tamanho + 2;

end;

(** MOD-003 **)
function    TFormPrincipal.MODBUS_CRC_Verificar(dados : TMODBUS_Stream) : boolean;
var
  valor,
  valorc   : word;
begin
  valor    := word(dados.dados[dados.tamanho-1]) +  (word(dados.dados[dados.tamanho]) shl 8);
  dados.tamanho := dados.tamanho - 2;
  valorc    := MODBUS_CRC_Calcular(Dados);
  Result    := (valorc = valor);
end;



Não vou ficar chateado com agregação de valor.....

In the midnight hour, I can feel your power (Madonna)
:lol:
Jean P. Fernandes - Eng. Eletrônico - (83) 2102-2116 - APEL - www.apel.com.br - Campina Grande - PB
jeanfernandes
Word
 
Mensagens: 539
Registrado em: 11 Out 2006 15:36
Localização: Campina Grande - PB

Mensagempor petgomes » 23 Jul 2007 15:58

Jean, estou tentando implementar este código no delphi 2005 mas não estou conseguindo. Ele dá um erro na função quando tento acrescenta-la no código.

vc poderia me ajudar?
petgomes
Nibble
 
Mensagens: 64
Registrado em: 19 Out 2006 19:49

Mensagempor Wagner de Queiroz » 13 Ago 2007 17:24

Aproveitando o Gancho de protocolo.

Voce tem algum exemplo ou onde encontrar documentacao para a parte de recebimento dos dados da porta serial ?

Digo, temos a rotina que monitora a porta serial e quando chega um byte, este byte recebido é enviado para uma rotina. Esta rotina de tratamento do dado recebido. Me interesso por este pedaço.

Se monitora em busca do primeiro byte do pacote e assim que ele chega, os dados sao jogados num array ou existe uma outra forma de se tratar isso ?
Seja Livre, Use Linux
Avatar do usuário
Wagner de Queiroz
Word
 
Mensagens: 872
Registrado em: 11 Out 2006 13:38
Localização: Barueri-SP


Voltar para Delphi e Pascal

Quem está online

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

x