![]() |
ModBus
|
![]() H-1115
horímetro parcial, totalizador e registro contador de eventos.![]() 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
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. 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.
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
Tabela 1 Nos modelos com
endereços estendidos, será o antigo
endereço (x10) de 400001 to 465536. 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). 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: Este artigo pode ser copiado em seu todo ou em parte para qualquer finalidade desde que cite sua origem. |