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,[1] pela fabricante de equipamentos Modicon. É um dos mais antigos e até hoje mais utilizados[2] 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[3]) em 2004 e a utilização é livre de taxas de licenciamento.[1] 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
[editar | editar código-fonte]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
[editar | editar código-fonte]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.
![Exemplo de uma rede Modbus com quatro dispositivos](http://upload.wikimedia.org/wikipedia/commons/2/22/Modbus.png)
Acesso ao meio
[editar | editar código-fonte]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
[editar | editar código-fonte]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 | 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
[editar | editar código-fonte]Os principais comandos do Modbus são mostrados na tabela abaixo:
código do comando | descrição |
0x01 | Lê um número variável1 de saídas digitais (bobinas) |
0x02 | Lê um número variável1 de entradas digitais |
0x03 | Lê um número variável1 de registros retentivos (saídas analógicas ou memórias) |
0x04 | Lê um número variável1 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ções2 (registros de erro) |
0x08 | Várias funções de diagnóstico |
0x0F | Força uma quantidade variável1 de bobinas (saídas digitais) |
0x10 | Preset de uma quantidade variável1 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
[editar | editar código-fonte]Em redes seriais baseadas em RS-485 ou RS-232 o Modbus pode ter dois modos de transmissão: RTU e ASCII.
Modbus RTU
[editar | editar código-fonte]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
[editar | editar código-fonte]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
[editar | editar código-fonte]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
[editar | editar código-fonte]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
[editar | editar código-fonte]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
[editar | editar código-fonte]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.
Referências
- ↑ a b Modbus Organization, Inc. «Modbus FAQ» (em inglês). Consultado em 30 de agosto de 2012
- ↑ ControlDesign.com. «Three Variants Dominate Industrial Ethernet» (em inglês). Consultado em 12 de outubro de 2012
- ↑ Modbus Organization, Inc. «Modbus Organization» (em inglês). Consultado em 7 de setembro de 2012
Ligações externas
[editar | editar código-fonte]Links em inglês:
- Descritivo do protocolo
- A íntegra da especificação do protocolo (versão 1.1b)
- Site da Organização Modbus - associação de fabricantes
- Site da Schneider Automation
- Como Modbus trabalha
- Modbus Test software
Links em português:
- Resumo sobre redes Modbus
- Modbus
- Modos de Transmissão RTU e ASCII do Modbus[ligação inativa]
- Modbus-Master em Ruby.
Software gratuito para Modbus:
- Software do teste do programa demostrativo de Modbus Simply Modbus
- Software gratuito que simula dispositivos escravos : Modbus Simulator
- Código fonte do protocolo para microcontrolador PIC
- Projetos de código aberto no Freshmeat
- Projetos de código aberto no Sourceforge
- Software para simulação e testes em Modbus