modbus é um protocolo de comunicação serial desenvolvido pela Modicon e publicado pela Modicon® em 1979 para utilização em controladores lógico programáveis (CLPs). Em termos simples, é um método usado para transmitir informação sobre redes seriais entre dispositivos eletrônicos. O dispositivo que solicita a informação é chamado de modbus Master (Mestre) e os dispositivos que fornecem informação são os modbus Slaves (Escravo). Em uma rede padrão Modbus, podemos ter um Master e até 247 Slaves, sendo que cada um recebe um endereço de 1 a 247. Por este endereçamento, o Master pode escrever as informações nos escravos.

1- Para que se Utiliza o Modbus?

O modbus é um protocolo aberto. Isto significa que ele é livre para que os fabricantes o implementem em seus equipamentos sem que haja a necessidade de pagar royalties. Ele se tornou um protocolo de comunicação padrão na indústria e atualmente é o meio mais comum para conectar dispositivos eletrônicos industriais. É utilizado amplamente por vários fabricantes em diferentes segmentos industriais, sendo o modbus tipicamente usado para transmitir sinais de instrumentação e dispositivos de controle para um sistema controlador ou sistema de coleta de dados. Por exemplo, um sistema que mede a temperatura e umidade pode comunicar e enviar os resultados para um computador utilizando este protocolo. O Modbus é frequentemente usado para conectar um computador a terminais remotas (RTU) e sistemas supervisórios de controle e aquisição de dados (SCADA). O protocolo Modbus possui a versão para aplicações seriais (Modbus RTU e Modbus ASCII) e aplicações Ethernet (Modbus TCP).

2 – Como Funciona o Protocolo Modbus?

O Modbus é transmitido sobre redes seriais que conectam dispositivos e sua configuração mais simples seria um cabo serial conectando portas seriais de dois dispositivos (Master e Slave).

modbus serial

Os dados são enviados em uma série de uns e zeros (1’s e 0’s) chamado bits, onde cada bit é enviado como um voltagem onde os 0’s são voltagens positivas e os 1’s voltagens negativas. Os bits são enviados muito raPIDamente e uma transmissão típica pode atingir a velocidade de 9600 baud (bits por segundo).

Você Gostou Deste Artigo?
Cadastre-se hoje e receba atualizações por e-mail. Respeitamos a sua privacidade e você nunca terá seu e-mail divulgado.

3 – O que é Hexadecimal?

Quando você se deparar com problemas, pode ser útil ver os dados reais que estão sendo transmitidos. Neste sentido, strings longas compostas por 0’s e 1’s podem ser difíceis de se ler sendo mais fácil sua interpretação quando combinados em hexadecimal, onde cada bloco de 4 bits são representados por 16 caracteres (0 a F). Veja a tabela abaixo:

0000 = 0 0100 = 4 1000 = 8 1100 = C
0001 = 1 0101 = 5 1001 = 9 1101 = D
0010 = 2 0110 = 6 1010 = A 1110 = E
0011 = 3 0111 = 7 1011 = B 1111 = F

Baseando-se na tabela, podemo dizer que cada bloco de 8 bits  (chamado byte) pode ser representado por 256 caracteres que variam de 00 a FF.

4 – O que é ASCII?

O padrão ASCII (American Standard Code for Information Interchange) é uma combinação de 8 Bits formando 1 Byte que juntos representam cada caractere em uma combinação de 256 ASCII caracteres, incluindo letras e números de um teclado. Veja na tabela abaixo alguns dos caracteres ASCII e a correlação com as representações binárias, decimal e hexadecimal:

decimal(base10) binary(base2) Hex(base16) ASCII(base256)
0 0000 0000 00 null
1 0000 0001 01
34 0010 0010 22 #
35 0010 0011 23 $
36 0010 0100 24 %
47 0010 1111 2F /
48 0011 0000 30 0
49 0011 0001 31 1
56 0011 1000 38 8
57 0011 1001 39 9
58 0011 1010 3A :
64 0100 0000 40 @
65 0100 0001 41 A
66 0100 0010 42 B
89 0101 1001 59 Y
90 0101 1010 5A Z
91 0101 1011 5B [
95 0101 1111 5F _
96 0110 0000 60 `
97 0110 0001 61 a
122 0111 1010 7A z
123 0111 1011 7B {
174 1010 1110 AE ®
255 1111 1111 FF

5 – Como os Dados são Armazenados no Modbus?

As informações são armazenadas no dispositivo Slave em quatro tabelas diferentes onde duas tabelas armazenam valores discretos on/off (bobinas) e outras duas tabelas armazenam valores numéricos (registros). Entenda duas tabelas para cada tipo devido ao fato de que uma tabela é apenas leitura (read-only) e outra tabela é leitura-escrita (read-write) e independente do tipo de tabela, elas possuem as mesmas características, sendo que:

  • Cada tabela pode ter até 9999 valores;
  • Cada bobina ou contato é 1 bit atribuído a um endereço entre 0000 e 270E;
  • Cada registro é 1 palavra (word) = 16 bits = 2 bytes e também pode ter endereço de dados entre 0000 e 270E.
Números Bobinas/Registros Endereço do Dado Tipo Nome da Tabela
1-9999 0000 to 270E Read-Write Saídas Discretas (Bobinas)
10001-19999 0000 to 270E Read-Only Entradas Discretas (Contatos)
30001-39999 0000 to 270E Read-Only Registros de Entradas Analógicas
40001-49999 0000 to 270E Read-Write Registros de Saídas Analógicas

 

Os números de bobinas e registros podem ser pensados como nomes de locais, uma vez que eles não aparecem nas mensagens reais e sim os endereços de dados. Por exemplo, o primeiro registro de saída analógica, número 40001 tem o endereço de dados 0000, sendo que a diferença entre estes dois valores se chama offset. Veja que cada tabela possui um offset diferente (1, 10001, 30001 e 40001).

6 – O que é Slave ID?

Pada Slave na rede é atribuído um único endereço de 1 a 247 e quando o Master requisita dados, o primeiro byte da mensagem contem o endereço do Slave. Dessa forma, cada Slave sabe se deve ou não ignorar a mensagem. Em outras palavras ele sabe se a mensagem é pra ele ou não.

7 – O que é Código de Função?

O segundo byte da mensagem envida pelo Master é o código de função e este número diz ao escravo qual tabela deve acessar e se deve somente ler ou ler e escrever. Veja abaixo uma tabela com os códigos de função:

Código de Função Ação Nome da Tabela
01 (01 hex) Read Saídas Discretas (Bobinas)
05 (05 hex) Write single Saídas Discretas (Bobinas)
15 (0F hex) Write multiple Saídas Discretas (Bobinas)
02 (02 hex) Read Entradas Discretas (Contatos)
04 (04 hex) Read Registro de Entrada Analógica
03 (03 hex) Read Registro de Saída Analógica
06 (06 hex) Write single Registro de Saída Analógica
16 (10 hex) Write multiple Registro de Saída Analógica

8 – O que é CRC?

O CRC é uma checagem de redundância cíclica e trata-se de dois bytes adicionados ao final de cada mensagem Modbus para detecção de erro. Cada byte na mensagem é utilizado para calcular o CRC e o dispositivo receptor também calcula o CRC c compara com o recebido pelo master. Se qualquer bit enviado na mensagem estiver incorreto, o CRC calculado será diferente do recebido e um erro será gerado.

9 – Exemplo de Comando e Requisição Modbus

Imagine dois dispositivos interligados por uma rede serial que se comunicam em Modbus. Em determinado momento, o Master precisa acessar os dispositivo Slave com endereço 17 e ler os valores de registro de saída analógica armazenados entre os endereços 40108 a 40110.

A requisição do Master para o exemplo acima ficará da seguinte forma:

11 03 006B 0003 7687, onde:

  • 11: É o endereço do Slave (11hex = 17)
  • 03: Código de Função 03 = ler registo de saída analógica
  • 006B: O endereço de dados do primeiro registro requisitado (006B hex = 107, + 40001 de offset = 40108)
  • 0003: O número total de registros requisitados (ler 3 registos  de 40108 a 40110);
  • 7687: o CRC (cyclic redundancy check) para checagem de erro.

Assim que o dispositivo com o endereço 17 receber a mensagem do Master, ele responderá com a seguinte mensagem:

11 03 06 AE41 5642 4340 49AD, onde:

  • 11: É o endereço do Slave (11hex = 17)
  • 03: Código de Função 03 = ler registo de saída analógica
  • 06: O número de bytes de dados contidos na mensagem (3 registros x 2 bytes cada = 6 bytes)
  • AE41: O dado armazenado no registro 40108
  • AE41: O dado armazenado no registro 40109
  • AE41: O dado armazenado no registro 40110
  • 49AD: o CRC (cyclic redundancy check) para checagem de erro.

10 – Quais os Tipos de Dados os Registros Podem Compor?

O exemplo acima mostra que o registro contem o dado AE41 que convertido em bits, temos 1010 1110 0100 0001. Correto, mas o que isto significa? Significa que o registro 40108 pode ser definido como um dos 16-bit tipos de dados abaixo:

  • 16-bit unsigned integer (número entre 0 e 65535): AE41 = 44609 (conversão hex para decimal)
  • 16-bit integer (número entre -32768 e 32768): AE41 = 44609 – 65536 = -20.927
  • Uma string de 2 caracteres ASCII: AE41 = ® A

O registro 40108 pode ainda ser combinado com o 40109 para formar um dos 32-bit tipos de dados abaixo:

  • 32-bit unsigned integer (número entre 0 e 4,294,967,295): AE41 5652 = 2,923,517,522
  • 32-bit integer (número entre -2,147,483,648 e 2,147,483,648): AE41 5652 = -1,371,449,774
  • 32-bit ponto flutuante: AE41 5652 = -4.395978 E-11
  • Um caractere ASCII string (4 tipos de letras): AE41 5652 = ®AVR

11 – Modbus ASCII x RTU

Como pudemos ver, cada byte de dado pode ser representado por diferentes maneiras:

  • Binario (base2): 10101110 – 2 caracteres (0 e 1)
  • Decimal (base10): 174 – 10 caracteres (0 até 9)
  • Hexadecimal (base16): AE – 16 caracteres (0 até F)
  • ASCII (base 256): ® – 256 caracteres diferentes

Delimitador de Mensagem

No Modbus RTU, bytes são enviados consecutivamente sem espaço entre eles com um caractere 3-1/2 de espaço delimitador entre as mensagens. Isto permite que o software saiba quando uma nova mensagem está começando.

Qualquer atraso entre bytes vai fazer com que o Modbus RTU interprete isso como o início de uma nova mensagem e isto faz com que o RTU não funcione bem em modens. Já o Modbus ASCII demarca o início de cada mensagem com o caractere “:” (hex 3A) e o final de cada mensagem é terminado com os caracteres de retorno e alimentação de linha (hex 0D e 0A) permitindo o espaço entre bytes seja variável tornando adequado para transmissões em alguns modens.

Tamanho do Byte

Em Modbus RTU cada byte é enviado como uma string de 8 caracteres binários enquadrado com um bit de início e um bit de parada, demarcando cada byte em 10 bits.

Em Modbus ASCII, o número de bits de dado é reduzido de 8 para 7 pois o bit de paridade é adicionado antes do bit de parada mantendo o tamanho atual do byte em 10 bits.

Divisão de Bytes de Dados

Em Modbus ASCII, cada byte de dado é dividido em 2 bytes representando 2 caracteres ASCII em valor hexadecimal. Veja exemplo na tabela abaixo:

Modbus Mode data (ASCII) data (hex) data (binary)
Modbus RTU ® AE 1010 1110
Modbus ASCII A , E 41 , 45 100 0001 , 100 0101

A variação dos bytes de dados em Modbus RTU pode ser qualquer caractere de 00 a FF. Por outro lado a variação de bytes de dados em ASCII representa apenas os 16 caracteres hexadecimais.

Erro Checksum – Cálculo LRC

Como mencionado anteriormente, cada mensagem Modbus RTU é terminada com 2 bytes de checagem de erro chamado de CRC. Similarmente, Modbus ASCII é terminado com checagem de erro chamada LRC ou Longitudinal Redudancy Check e o cálculo LRC é muito mais fácil do que o CRC.

Exemplo de ASCII x RTU

Vamos utilizar o exemplo de requisição do registros 40108 a 40110 do Slave com endereço 17:

11 03 00 6B 00 03

A requisição ASCII é feita primeiramente adicionando na mensagem os delimitadores de caracteres e os dois pontos é adicionado no início da mensagem e o LRC antes do CR (retorno de linha) e LF (alimentação de linha). Veja abaixo como fica:

: 11 03 00 6B 00 03 7E CR LF

Cada caractere é então tratado como um caractere ASCII e substituído com suas respectivas representações hexadecimais, ficando da seguinte forma:

3A 3131 3033 3030 3642 3030 3033 3745 0D 0A

Esta requisição Modbus ASCII possui 17 bytes ou 170 bits

Na mensagem equivalente RTU, temos o seguinte:

11 03 00 6B 00 03 76 87

Neste caso, veja que o tamanho da requisição em RTU possui o tamanho de 8 bytes (80 bits)

 

 

Referências:

  • Adaptado de http://www.simplymodbus.ca/
  • A especificação oficial do Modbus pode ser encontrada em www.modbus.org/specs.php