Trocar dados com outros equipamentos por Modbus
Quando o controlador precisa ler valores de outro equipamento (um inversor, um medidor, outro
CLP) ou enviar valores a ele, você não precisa programar cada mensagem Modbus. Basta montar uma
tabela dizendo qual variável do controlador corresponde a qual endereço do equipamento remoto
(o canal de mapeamento) e colocar no programa um bloco que percorre essa tabela sozinho. Esta
página mostra o caminho com o bloco MDB_GATEWAY_EX da biblioteca HI_STD. O funcionamento
completo, incluindo MQTT e LoRa, está em Recurso de mapeamento de dados.
Antes de começar
Saiba, para cada dado remoto, o ID Modbus do equipamento, o endereço Modbus do dado e, em rede ethernet, o IP e a porta do equipamento (em geral 502).
Decida por qual interface do controlador sai a comunicação: um socket ethernet ou uma porta serial.
Configure essa interface no controlador (ver Alterar o endereço IP e a comunicação do equipamento):
ethernet: o socket usado como cliente TCP/IP (Modo de Roteamento CLIENT) e com a autoconexão desabilitada;
serial: a porta com o protocolo Modbus em modo MESTRE e a mesma velocidade, paridade e bits do equipamento remoto.
1. Criar as variáveis que recebem e enviam os dados
Cada dado trocado precisa de uma variável global com endereço de exportação no controlador.
Em Variáveis Globais, crie uma variável para cada dado (por exemplo
Vazao_Medidor : REAL).Em Endereço, use Sugerir endereço e Aplicar endereço sugerido.
2. Criar o canal de mapeamento
Na árvore do projeto, clique com o botão direito em Mapeamento de Dados e escolha Adicionar Canal.
Escolha o Tipo de Canal MODBUS, informe o ID do Canal (por exemplo
1) e uma Descrição.Clique no canal na árvore para abrir a aba dele.
Em rede ethernet, abra a aba Acesso Ethernet e use Adicionar acesso para cada equipamento remoto (IP e porta). O botão Procurar dispositivos na rede preenche o endereço de equipamentos da HI Tecnologia encontrados na rede.
Anote o ID do Canal: o programa vai usá-lo.
3. Mapear os dados
Na aba Dados recebidos, adicione uma linha para cada dado a ler do equipamento remoto: a Variável Exportada que recebe o valor, o ID de Comun. (ID Modbus do remoto), o Endereço remoto e, em ethernet, o Acesso TCP/IP.
Na aba Dados enviados, faça o mesmo para os dados a escrever no remoto e escolha quando enviar: Publ. ao Iniciar, Publ. em Intervalos (com o Tempo) ou, nas bridges, Publ. ao Alterar.
Agrupe na lista os dados de um mesmo equipamento: se ele não responder, o bloco pula os dados seguintes do mesmo endereço naquele ciclo, em vez de esperar o tempo limite de cada um.
O OnStudio confere o canal ao salvar e recusa endereços inválidos ou repetidos, com os detalhes na aba SAÍDA.
4. Colocar o gateway no programa
No programa que vai cuidar da comunicação, declare uma instância de HILS.MDB_GATEWAY_EX e
chame-a a cada ciclo:
VAR
gateway : HILS.MDB_GATEWAY_EX;
envios : ARRAY[0..9] OF INT; (* fila dos itens a enviar *)
END_VAR
gateway(START := TRUE,
DMAP_ID := 1, (* ID do Canal criado no passo 2 *)
COMM_SRC := HILS.SOCK0_PORT_ID, (* socket 0; HILS.COM1_PORT_ID para a COM1 *)
POLL_TME := T#500ms, (* pausa entre uma volta na lista e a próxima *)
PACK_TME := T#10ms, (* pausa entre duas transações *)
WR_CACHE := envios);
Com START em TRUE o bloco percorre a lista de Dados recebidos sem parar, esperando
POLL_TME entre uma volta e outra. Os demais parâmetros e as saídas de evento e de erro
estão em MDB_GATEWAY_EX.
5. Compilar, implantar e conferir
Compile e implante (ver Compilar e implantar a aplicação).
Abra a depuração e adicione as variáveis mapeadas (ver Monitorar e alterar variáveis com o equipamento rodando). Os valores lidos do equipamento remoto passam a aparecer nelas.
Acompanhe as saídas
TR_CODEePOLL_FAILdo bloco para saber se alguma transação falhou.
Se algo der errado
Nenhum dado chega: confira se o socket está como CLIENT e se o equipamento remoto responde no IP, porta e ID informados.
Outros equipamentos deixaram de acessar o controlador pela porta 502: o socket usado pelo gateway estava como servidor na porta padrão. Use um socket como cliente.
Ao excluir uma linha do meio da tabela, o OnStudio avisa que os IDs das linhas seguintes mudam. Se o código usa esses IDs (por exemplo com
HILS.COMM_NOTIFY_ITEM), revise-o antes de confirmar.