Você está na página 1de 7

Saiba Tudo Sobre o Protocolo Modbus

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

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

Para cada 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
 5642: O dado armazenado no registro 40109
 4340: 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