# Modbus

Modbus é um Protocolo de comunicação de dados utilizado em sistemas de automação industrial. Criado originalmente no final da década de 1970, mais especificamente em 1979, pela fabricante de equipamentos Modicon. É um dos mais antigos e até hoje mais utilizados protocolos em redes de Controladores lógicos programáveis (PLC) para aquisição de sinais(0 ou 1) de instrumentos e comandar atuadores. A Schneider Electric (atual controladora da Modicon) transferiu os direitos do protocolo para a Modbus Organization (Organização Modbus) em 2004 e a utilização é livre de taxas de licenciamento. Por esta razão, e também por se adequar facilmente a diversos meios físicos, é utilizado em milhares de equipamentos existentes e é uma das soluções de rede mais baratas a serem utilizadas em Automação Industrial.

## Características técnicas

O Modbus é um protocolo de comunicação da camada de aplicação (modelo OSI) e pode utilizar o RS-232, RS-485 ou Ethernet como meios físicos - equivalentes camada de enlace (ou link) e camada física do modelo. O protocolo possui comandos para envio de dados discretos (entradas e saídas digitais) ou numéricos (entradas e saídas analógicas).

## Modelo de comunicação

O protocolo Modbus especifica que o modelo de comunicação é do tipo mestre-escravo (ou servidor-cliente). Assim, um escravo não deve iniciar nenhum tipo de comunicação no meio físico enquanto não tiver sido requisitado pelo mestre. Por exemplo, a estação mestre (geralmente um PLC) envia mensagens solicitando dos escravos que enviem os dados lidos pela instrumentação ou envia sinais a serem escritos nas saídas, para o controle dos atuadores ou nos registradores. A imagem abaixo mostra um exemplo de rede Modbus com um mestre (PLC) e três escravos (módulos de entradas e saídas, ou simplesmente E/S). Em cada ciclo de comunicação, o PLC lê e escreve valores em cada um dos escravos.

## Acesso ao meio

No entanto, ainda é possível haver colisões durante o acesso ao meio compartilhado, e o protocolo não é específico em como solucioná-las. Como ilustração de um problema possível, suponha que, em uma dada aplicação do protocolo Modbus sobre um barramento RS-485, o mestre requisita seus escravos em sequência. Suponha também que o mestre, após um tempo específico, passa a requisitar o escravo seguinte, tendo recebido ou não uma resposta do escravo anterior. Nesse caso, se o primeiro escravo demora mais tempo para responder do que o tempo que o mestre espera, pode acontecer de o primeiro escravo responder bem no período em que o mestre resolveu fazer a requisição ao escravo seguinte, ou no período em que o segundo escravo já tinha iniciado sua resposta – havendo colisão no meio. Não há nada especificado no protocolo para resolver esse tipo de problema. Cabe inteiramente à aplicação – através de hardware ou software - implementar de forma correta o acesso ao meio, os parâmetros de time-out etc.

## Frames

Basicamente, uma comunicação em Modbus obedece a um frame que contém o endereço do escravo, o comando a ser executado, uma quantidade variável de dados complementares e uma verificação de consistência de dados (CRC).
Exemplo-1: Se o PLC precisa ler as 10 primeiras entradas analógicas (do endereço 0000 ao 0009) no módulo 2. Para isso é preciso utilizar o comando de leitura de múltiplos registros analógicos (comando 3). O frame de comunicação utilizado é mostrado abaixo (os endereços são mostrados em sistema hexadecimal):
| endereço | comando | end. dos registros | end. dos registros | quant. de registros | quant. de registros | CRC |
| 02 | 03 | 00 | 00 | 00 | 0A | 2 caracteres |
A resposta do escravo seria um frame semelhante composto das seguintes partes: O endereço do escravo, o número do comando, os dez valores solicitados e um verificador de erros (CRC). Em caso de erros de resposta (por exemplo um dos endereços solicitados não existe) o escravo responde com um código de erro.
A resposta para a pergunta acima seria a seguinte:
Mas antes uma pequena recordação!
Para se entender este frame de resposta, antes precisamos saber corretamente o que é um byte.
Cada palavra tem as seguintes formas, - bit, - nibble, - byte e - word.
Segue abaixo uma tabela representação de cada formato.
| Bit | Nibble | Byte | Word |
| 1 | = 4 bits | = 8 bits | = 16 bits |
Agora que ja sabemos o que é byte podemos então decifrar o frame da rede modbus.
Exemplo-2: Reposta da pergunta citada no exemplo-1.
* RX 02 03 14 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 (xx xx CRC)
O primeiro byte(02) é o nó do escravo; O segundo byte(03) é a função utilizada para leitura, sendo essa um Holding Register; O terceiro byte é a quantidade de endereços que o Slave(escravo) está enviando ao Master, sendo que a cada 2 bytes se forma uma Word que significa uma palavra de 16 bit, por isso este frame tem 14 (hexadecimal) = 20 bytes que é = 10 word ou 10 palavras de 16 bits que tem seu range mínimo de -32768 ate 32767.
Com isso entendemos que o Slave(Escravo) respondeu 10 endereços a ao master e todos com o valor zero.

## Comandos do MODBUS

Os principais comandos do Modbus são mostrados na tabela abaixo:
| código do comando | descrição |
| 0x01 | Lê um número variável$^1$ de saídas digitais (bobinas) |
| 0x02 | Lê um número variável$^1$ de entradas digitais |
| 0x03 | Lê um número variável$^1$ de registros retentivos (saídas analógicas ou memórias) |
| 0x04 | Lê um número variável$^1$ de registros de entrada (entradas analógicas) |
| 0x05 | Força uma única bobina (altera o estado de uma saída digital) |
| 0x06 | Preset de um único registro (altera o estado de uma saída analógica) |
| 0x07 | Lê exceções$^2$ (registros de erro) |
| 0x08 | Várias funções de diagnóstico |
| 0x0F | Força uma quantidade variável$^1$ de bobinas (saídas digitais) |
| 0x10 | Preset de uma quantidade variável$^1$ de registros (saídas analógicas) |
| $^1$ A quantidade de variáveis a ler é definida no frame de solicitação $^2$ Oito bits previamente configurados. Não é necessário fornecer parâmetros de endereçamento com este comando pois o escravo vai enviar sempre os oito bits pré configurados. ||
Para alguns comandos de diagnóstico, tais como reinício de comunicação, reset do módulo ou sincronização de relógio, podem ser utilizados comunicações do tipo broadcast, ou seja, destinada a todos os escravos simultaneamente.

## Modbus serial

Em redes seriais baseadas em RS-485 ou RS-232 o Modbus pode ter dois modos de transmissão: RTU e ASCII.

### Modbus RTU

O termo RTU, do inglês Remote Terminal Unit, refere-se ao modo de transmissão onde endereços e valores são representados em formato binário. Neste modo para cada byte transmitido são codificados dois caracteres. Números inteiros variando entre -32768 e 32767 podem ser representados por 2 bytes. O mesmo número precisaria de quatro caracteres ASCII para ser representado (em hexadecimal). O tamanho da palavra no modo RTU é de 8 bits.

#### Formato do pacote RTU

| Endereço do Escravo | Código da Função | Dados | CRC |
| 1 byte | 1 byte | 0 a 252 bytes | 2 bytes (CRC-16) |

### Modbus ASCII

Os dados são dados codificados e transmitidos através de caracteres ASCII - cada byte é transmitido através de dois caracteres. Apesar de gerar mensagens legíveis por pessoas este modo consome mais recursos da rede. Por exemplo, para transmitir o byte 0x5B este deverá ser codificado em dois caracteres ASCII: 0x35 (“5”) e 0x42 (“B”). O tamanho da palavra no modo ASCII é de 7 bits. Somente são permitidos caracteres contidos nos intervalos
* 0-9
* A-F
Intervalo entre duas mensagens deve ser de 3,5 caracteres.

#### Formato do pacote ASCII

| Início | Endereço | Função | Dados | LRC | Final |
| ":" (ASCII 0x3Ah) | 2 caracteres | 2 caracteres | 0 a 2 x 252 caracteres | 2 caracteres | CR+LF (ASCII 0x0Dh + 0x0Ah) |

## Modbus TCP

Aqui os dados são encapsulados em formato binário em frames TCP para a utilização do meio físico Ethernet (IEEE 802.3). Quando o Modbus/TCP é utilizado, o mecanismo de controle de acesso é o CSMA-CD (Próprio da rede Ethernet) e as estações utilizam o modelo cliente-servidor.
Retrocompatibilidade e Conversores
Suponha que um PLC precisa trocar dados usando o protocolo Modbus-TCP com dispositivos antigos, que não suportam esse protocolo, e estão conectados em um barramento RS-485. Nesse caso, existem no mercado conversores Modbus-TCP<->Modbus Serial RS-232/485. Esses dispositivos diferem de um conversor puramente físico, que somente converteria os sinais elétricos de um protocolo físico para outro. Eles, em vez disso, implementam os protocolos TCP e IP, além de implementar também o protocolo Modbus.
Isso é necessário, pois é preciso haver uma conexão TCP entre o conversor e o PLC, já que essa conexão não pode existir diretamente com os equipamentos antigos. O conversor precisa, portanto, implementar o protocolo TCP e aceitar conexões através de sockets etc. Caso contrário, a comunicação não seria possível.
Além disso, o conversor precisará tirar os dados Modbus – que estão dentro do pacote IP, que por sua vez está dentro do quadro Ethernet – para enviar ao escravo correto no barramento RS-485.
Há também conversores com várias saídas seriais. Nesse caso, é possível separar os escravos em vários barramentos distintos, cada um em uma porta. No primeiro barramento, podem ser colocados os escravos cujos endereços vão de 1 ao 10; no segundo, de 11 a 20, e por aí em diante – isso é só um exemplo.
Nessa configuração, o conversor precisaria ler o pacote Modbus, interpretá-lo ao ponto de saber qual é o endereço do escravo de destino, para então enviá-lo à porta de saída correta.

## Modbus Plus

Versão que possui vários recursos adicionais de roteamento, diagnóstico, endereçamento e consistência de dados. Esta versão ainda é mantida sob domínio da Schneider Electric e só pode ser implantada sob licença deste fabricante.