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