Software de emulação de rede Modbus RTU

1. Introdução


Se você tem apenas um martelo como ferramenta, cada problema começa a se parecer com um prego.

Abraham Maslow

O protocolo Modbus é bem conhecido tanto pelos leitores Habr quanto pelos leitores hicktime. Muitas publicações foram dedicadas à sua aplicação, difíceis de listar porque são muitas e, de tempos em tempos, novos artigos aparecem aqui e ali.



A popularidade deste protocolo é devido à sua abertura e simplicidade. O escopo da aplicação é amplo o suficiente: de sistemas profissionais de automação industrial a projetos amadores de bricolage de sistemas de controle distribuído, casas "inteligentes" e assim por diante. Esse protocolo também foi escolhido por mim quando minha equipe estava envolvida na criação de software para o simulador de trem. O protocolo Modbus RTU na interface física RS485 é usado neste simulador para fornecer dados ao computador de controle dos controles montados no console do motorista (não pense que o Modbus seja usado em material circulante real!).

Não vale a pena falar sobre as dificuldades envolvidas na configuração de software que interage com uma rede de controladores que controlam equipamentos. Especialmente quando parte dos dispositivos já existe no ferro e a outra parte está em processo de desenvolvimento e fabricação. Nesse caso, é necessário escrever um software de nível superior, levando em consideração sua interação com esse hardware. E é aconselhável escrevê-lo de forma a criar uma versão funcional do sistema imediatamente, sem o uso de “muletas”, sempre difíceis de limpar a partir do código.

"Você precisa escrever software quando os protótipos de trabalho de todo o hardware estiverem prontos", você diz, e você estará certo, mas ... ha ha ha, isso raramente acontece no mundo real. E aqui os emuladores de software vêm em nosso auxílio.

1. Brevemente sobre Modbus RTU


Não falarei em detalhes sobre o protocolo. Quem está interessado nos detalhes pode usar a pesquisa - o protocolo está aberto, sua especificação oficial e muitas informações estão disponíveis na rede. Só posso dizer que no Modbus RTU ele descreve o formato binário dos dados transmitidos e usa o cabo de par trançado padrão RS485 como meio de transmissão. O RS232 também pode ser usado se a rede tiver um transmissor e um receptor, ou o RS422 para transmissão de dados unidirecional.

Estaremos interessados ​​no RS485, que é uma interface half-duplex, que permite que apenas um dispositivo transmita dados por vez. A arbitragem do barramento no Modbus é realizada devido à resistência do intervalo de silêncio obrigatório de 3,5 caracteres a uma determinada velocidade de transmissão. Cada mensagem deve começar e terminar com um intervalo de silêncio. Há um dispositivo mestre na rede e vários escravos (até 31 em um segmento de rede, sem o uso de repetidores). Cada dispositivo escravo possui um identificador único (1 a 31). A transmissão de dados por escravos é realizada apenas se o mestre enviou uma solicitação para receber dados deste dispositivo.

Uma solicitação típica do assistente se parece com isso

IDCódigo de funçãoEndereço de dadosQuantidade de dados (2 bytes)DadosCRC16

O CRC16 é usado para controlar a integridade dos dados transmitidos. O Modus usa a notação de representação de dados Big Endian: para valores de 2 bytes, o byte mais significativo da mensagem vem primeiro). O protocolo usa quatro tipos de dados:

  1. Bobinas - saídas discretas (1 bit) de leitura / gravação
  2. Entradas discretas - entradas discretas somente leitura (1 bit)
  3. Registros de retenção - registros de saída (2 bytes) disponíveis para leitura / gravação
  4. Registradores de entrada - registradores de entrada (2 bytes) disponíveis para leitura

Em resposta à solicitação, o escravo envia dados no seguinte formato

IDCódigo de funçãoA quantidade de dados em bytesDadosCRC16

Uma mensagem recebida do mestre entra no buffer de recebimento de todos os dispositivos. No entanto, se o primeiro byte do buffer de recebimento não corresponder ao ID do dispositivo, ele ignorará os dados recebidos, limpando o buffer de recebimento. Se a mensagem é destinada a este dispositivo, ela forma uma resposta e, após manter o intervalo de silêncio, a envia ao mestre.

Como se costuma dizer, simples, mas com bom gosto. Você pode ler mais sobre tudo isso na especificação oficial do protocolo . Leia sobre métodos para implementar o protocolo na interface serial aqui . Nós não nos reunimos aqui para isso.

Ao desenvolver software de nível superior (mestre implementado com base em um PC, por exemplo) para uma rede assim, seria bom ter um conjunto de ferramentas de software que permitam implementar esse conceito

imagem

O significado deste esquema é o seguinte. Suponha que tenhamos uma parte dos dispositivos incluídos na rede futura. Ou até agora não existem tais dispositivos. Mas há um desejo ardente de escrever software para o nível superior de gerenciamento, depurá-lo, para que, quando a rede ainda estiver implementada em hardware, não tenhamos que reescrever nada. Para fazer isso, você precisará usar um meio de transmissão físico, para o qual usamos um dispositivo semelhante a este



Um dos adaptadores é usado para conectar o software do assistente desenvolvido. Outra é conectar um emulador de uma futura rede de escravos. Para a filial com um conector branco, conectamos a parte da rede que já está implementada no hardware. Assim, temos a oportunidade de trabalhar com calma com o protocolo de comunicação padrão, introduzindo gradualmente equipamentos reais em operação. Além disso, dando o objeto ao cliente, não somos privados da oportunidade de modificar seu software em um ambiente confortável de laboratório sem acesso ao objeto. QSlave no diagrama é exatamente a mesma parte da rede emulada pelo software. Naturalmente, você deve escrever o software apropriado, feito pelo autor.

2. QSlave - emulação de rede escrava


O QSlave é um emulador de rede modbus RTU de plataforma cruzada aberto. Você pode obtê-lo sob a licença GPL v2.0 no Github no link acima.



O aplicativo é desenvolvido em C ++ usando a estrutura Qt. O Qt, de um modo geral, possui bibliotecas para trabalhar com o Modbus , mas os detalhes da tarefa - simular uma rede de escravos em vez de um único escravo, levaram ao fato de que as bibliotecas integradas do Qt para o Modbus não foram usadas aqui. Para processar os dados recebidos da porta serial virtual, foi criada uma biblioteca modbus auto-escrita. O código desta biblioteca é implementado como um projeto separado, é completamente independente da interface do usuário e pode ser usado para conscientizar sobre simulações de software com funcionalidades mais avançadas. Devido ao fato de a emulação Modbus ser desconectada da interface do usuário, a rede é configurada usando arquivos de configuração. O formato XML foi escolhido (geralmente o usamos em nossos projetos). Uma configuração de amostra está disponível no código do projeto . Um conjunto de configurações consiste em um arquivo principal com a extensão * .net, que se parece com isso

example.net
<?xml version="1.0" encoding="UTF-8" ?> <Config> <Slave> <!--  ,     --> <Description>Traffic light</Description> <!--   --> <id>1</id> <!--  XML-  (  *.xml) --> <config>traffic-light</config> </Slave> </Config> 

e arquivos de configuração XML para cada um dos escravos

traffic-light.xml
 <?xml version="1.0" encoding="UTF-8" ?> <Config> <!--   --> <Coil> <address>16</address> <description>Red signal</description> <value>0</value> </Coil> <Coil> <address>17</address> <description>Yellow signal</description> <value>0</value> </Coil> <Coil> <address>18</address> <description>Green signal</description> <value>0</value> </Coil> <!--   --> <DiscreteInput> <address>0</address> <description>Ready</description> <value>1</value> </DiscreteInput> <!--   --> <HoldingRegister> <address>5</address> <description>Signal activity time</description> <value>15</value> </HoldingRegister> <!--   --> <InputRegister> <address>2</address> <description>Signals count</description> <value>3</value> </InputRegister> </Config> 

O último arquivo contém uma descrição de todos os dados disponíveis no dispositivo. Para fazer o download da configuração, é necessário abrir o arquivo * .net no menu do programa QSlave (Arquivo → Abrir configuração). Todos os arquivos de configuração devem estar no mesmo diretório. A configuração de exemplo descreve uma rede de um dispositivo escravo, um semáforo virtual, cujas saídas discretas descrevem os sinais, uma entrada digital indica um pouco do dispositivo pronto para operação (Pronto), o registro de entrada relata o número de sinais de tráfego e o registro de saída define o tempo durante o qual está ligado cada um dos sinais.

imagem

Naturalmente, este simulador não simula a lógica interna do dispositivo. Permite apenas definir os valores das células de memória disponíveis para o mestre. Qualquer um dos valores pode ser definido a seu critério, editando a célula correspondente na tabela.

Por toda a sua simplicidade, este software nos ajuda a trabalhar no software do simulador (que já foi comissionado) sem sair do laboratório.



Mas ninguém diz que você não pode criar um emulador mais avançado que simule a operação de dispositivos de rede virtual. Para criá-lo, você pode usar o código da biblioteca modbus disponível no pacote QSlave.

3. QMaster - emulação do dispositivo principal


Para criar escravos, depure seu firmware, você precisa de uma simulação de assistente. Existem vários emuladores abertos, como, por exemplo, QModbus . Nós o usamos em nosso trabalho, até que decidimos aumentar a taxa de transferência de dados para 250 kBit / s. O QModbus não permite isso. Foi possível reconstruí-lo a partir das fontes do Linux, mas nossos engenheiros eletrônicos estão sentados no Windows e onde a montagem não foi realizada por vários motivos. Acontece que este aplicativo está escrito no Qt 4, usa uma biblioteca libmodbus de terceiros. Eu queria ter uma solução multiplataforma no Qt5, especialmente porque o Qt5 já funciona com o Modbus pronto para uso. Portanto, seu análogo foi escrito usando a pilha da biblioteca Qt Modbus - QMaster . Também está disponível no Github nas mesmas condições.

imagem

Conclusão


Concluindo, direi que trabalho (no trabalho) principalmente em projetos fechados. No entanto, as ferramentas descritas foram desenvolvidas por mim pessoalmente por minha própria iniciativa no meu tempo livre. Além disso, eles, na versão Windows, estão estaticamente vinculados ao código Qt GPL, portanto, devo transmiti-los à comunidade nas mesmas condições que o Qt recebeu. Além disso, essas ferramentas podem ser úteis para o leitor.

Obrigado pela atenção!

Source: https://habr.com/ru/post/pt409111/


All Articles