logo

ModBus
Dificuldades com Endereços


H-1115
H-1115
 horímetro parcial, totalizador e registro contador de eventos.


HC-1180

HC-1180
ModBus RTU Horímetro, Contador de Eventos, Datalogger, Calendário. Para gerenciamento de máquinas, manutenção programada, controle de qualidade da ferramenta, etc.

H-1144

H-1144
Poupando espaço e simplificando a leitura diária:
Horímetro Quádruplo. Faz tomadas indivuduais para cada canal ou  uma só leitura dos quatro horímetros.
Três registros para cada horímetro, parcial, total e contador de eventos on/off do horímetro.

Vamos tentar esclarecer alguns pontos críticos do protocolo ModBus-RTU que são também comuns ao ModBus-ACSII e ModBus-TCP. Para programadores de software e firmeware. O conceito será repetido no texto de diversas formas.

Endereços do Modelo Modbus (Registros) e Endereços ModBus.

Na mensagem (frame), o Endereço do Modelo Modbus é composto pelo offset do bloco a que pertence mais o número da função.
 Nem sempre as especificações são escritas de forma didática.
A seguir descrevemos detalhadamente.

Há uma confusão na literatura que ora o objeto é chamado de registro com certo número atribuído ao seu endereço ou simplesmente de endereço ModBus, dentre outros nomes.

Pelo valor do endereço, observando o contexto, seja em um texto ou em um aplicativo, é possível identificar se estamos lendo o Endereço do Registro do Modelo ModBus ou Endereço ModBus da mensagem, usado na aplicação.

O Endereço do Modelo de Dados Modbus, é definido para identificar o bloco de memória . Por exemplo, variando de um (00001) até 49999 nos blocos básicos definidos pelo protocolo (ver figura 1 retângulos em cores). Veja endereços desses blocos na tabela 1 coluna 2. Há outros valores acima de 50000 chamados de endereços estendidos.

Endereço ModBus (ou endereço de mensagem), ou simplesmente endereço, é o offset do Endereço do Modelo ModBus de cada bloco que será enviado e recebido pela aplicação (programa supervisório etc.). Os endereços ModBus para mensagens, vão de 0 (zero) a 65535.

Endereço do Modelo ModBus inicia em 1 a nnnn, para cada bloco específico de memória, conforme tabela 1 coluna 2. Considerando o offset de cada bloco, ficam restrito de 1 a 9.999.

Vamos analisar a primeira possível confusão que é desfeita pelo número da função:

Enviar uma mensagem para o endereço (input register do modelo modbus) 30022 decimal. No frame da mensagem será enviado o offset do endereço: 21 (22 – 1 = 21). Na prática alguns raciocinam como sendo 30022 – 30000 = 22 menos uma unidade = 21 (30000 é a referência do bloco que está sendo endereçado).

Suponha agora endereçar para outro bloco 40022 (holding register). No frame da mensagem, será enviado o endereço 21 ! O mesmo que acima, mas para blocos diferentes.

Como será interpretado esse endereço ? Onde entra o identificador do bloco como 30000 e 40000 se para esses dois blocos estamos enviando o mesmo offset 21 ?

Simplesmente diferenciado pela função utilizada. A função utilizada amarra implicitamente esses endereços aos blocos.

Concluímos que o endereço Modbus é determinado pelo número da função e o deslocamento (offset) menos um, relativo ao Endereço do Modelo Modbus.

Como no exemplo acima, a função 03(decimal) para leitura e o offset 21(decimal) amarram o endereço 40022(Endereço do Modelo ModBus).

Observar que cada bloco do modelo tem uma referência, como exemplo, Holding Register 40000. Inicia em 40001. O endereço 40001 na aplicação, será o deslocamento (offset) 1 (um) menos uma unidade, ou seja, offset zero. Este é o offset que vai para a mensagem (datagrama).

Na área em cinza da figura 1, o fabricante vai designar um endereço próprio qualquer da memória do aparelho. Por exemplo, o endereço zero ModBus, poderá estar associado a outro qualquer na memória do aparelho (microcontrolador).

Esta implementação é determinação de cada fabricante. Não importa qual o número do endereço alocado pelo fabricante.
Ao transmitir os dados desta memória (do servo) para o master, o aplicativo do servo deve traduzir para um endereço válido do protocolo Modbus.




Modelo de Dados Modbus Figura 1


O bloco colorido ao centro é o Modelo de Dados Modbus. Os retângulos coloridos têm os endereços definidos conforme tabela 1, não estão na mesma ordem da figura 1, figura retirado do guia Modbus ².


Resumo dos endereços.             Col.2                                  Col.3                          Col.4                              Col.5

Memory area

Address of the application layers in the Modbus device

Modbus address transferred in the message (Data Link Layer)

Função

Obs.

Coils (output bits)

referência 00000

1 to 9999

0 to 9998

01 read / 05 write

Leitura e escrita de bits na saída

Discrete Inputs (input bits)

referência 10000

10001 to 19999

(faixa 1 a 9999)

0 to 9998

02 read

Somente leitura bits valores digitais da entrada

Input Register (input words)

referência 30000

30001 to 39999
(faixa 1 a 9999)

0 to 9998

04 read

Somente leitura entrada (exemplo: analógica inteiro 16bits)

Holding Register (output words)

referência 40000

40001 to 49999
(faixa 1 a 9999)

0 to 9998

03 read / 06 -16 write

Leitura e escrita múltiplos registros

06 um registro.

Tabela 1

Nos modelos com endereços estendidos, será o antigo endereço (x10) de 400001 to 465536.
Observe que na tabela 1 o endereço do modelo de dados Modbus já tem outro nome : “endereço da camada de aplicação” no aparelho Modbus. Não confundir com endereço Modbus da mensagem.

Em síntese:

No frame: 01 03 27 0E 00 01 CRC.l CRC.h estaremos lendo um registro de 16 bits no endereço 49999. O offset é 9998 (0x270E) endereço a ser transmitido. O endereço 49999 está implícito na combinação da função 03 com o offset 0x270E (9998 d “9999 - 1”).

01 endereço do servo

03 função leitura múltiplos registros

27 endereço Hi byte inicial dos registros a ler (0x270E)

0E endereço Low byte inicial dos registros a ler (0x270E)

00 quantidade Hi byte de registros (0x0001)

01 quantidade Low byte de registros (0x0001)

crc low byte

Mas a função 03 não é para leitura de múltiplos registros ? Sim, mas nada impede de ser lido um registro apenas. No entanto, um programa rigoroso poderia rejeitar esse tipo de pedido. Na prática é muito usado a função 03 para ler um ou mais registros.

Um erro severo seria utilizar uma função que não seja designada para determinado tipo de bloco. Estaremos compondo outro endereço. Certamente estaremos lendo ou escrevendo em uma memória que não é a que queremos. Esta checagem deve ser rigorosa, no aplicativo.

Lembrar que cada registro Modbus aponta para uma estrutura de dados com dois bytes (16 bits).
O protocolo permite trabalhar com estrutura de dados maior que 16 bits, transmitindo vários “inteiros” com 16 bits.

Para transmitir um número maior que 16 bits, podemos alocar 2 registros Modbus, por exemplo, um inteiro com 32 bits. Usamos o endereço 40001 e 40002 com a função 16 para escrita e 03 para leitura.

Da mesma forma escrever ou ler em uma variável de 64 bits iniciaria no registro 40001 a 40004 quatro registros de 16 bits.

Bibliografia

1- Modicon Modbus Protocol Reference Guide, AEG, PIMBUS-PI–MBUS–300 Rev. J, March 1996 [Modicon 1996]

2- MODBUS APPLICATION PROTOCOL SPECIFICATION V1.1b3 April 26, 2012

Críticas e correções enviar para:
educa@rodelta.com.br

Este artigo pode ser copiado em seu todo ou em parte para qualquer finalidade desde que cite sua origem.