Documente Academic
Documente Profesional
Documente Cultură
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).
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:
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:
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
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:
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).
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.
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:
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.
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.
Assim que o dispositivo com o endereço 17 receber a mensagem do Master, ele responderá com
a seguinte mensagem:
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
Como pudemos ver, cada byte de dado pode ser representado por diferentes maneiras:
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.
Em Modbus ASCII, cada byte de dado é dividido em 2 bytes representando 2 caracteres ASCII
em valor hexadecimal. Veja exemplo na tabela abaixo:
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.
Vamos utilizar o exemplo de requisição do registros 40108 a 40110 do Slave com endereço 17:
11 03 00 6B 00 03
: 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:
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