MQTT_MDB_BRIDGE

Implementa uma bridge de comunicação entre os protocolos MODBUS e MQTT, permitindo subscrever e publicar tópicos MQTT em um broker e sincronizar seus valores com equipamentos MODBUS remotos; exige canais de mapeamento (DataMap) previamente configurados e associados a variáveis globais exportadas. É um bloco de função (mantém estado entre scans; requer instância). Tópicos podem ser publicados automaticamente por critério de tempo ou de alteração de valor.

Biblioteca: HI_STD · Namespace: HILS · Tipo: bloco de função

Este bloco é parte da biblioteca de comunicação do protocolo MQTT V1.3.1. Para mais informações sobre o protocolo e os blocos disponíveis no HIstudio consulte o protocolo MQTT.

Dica

Assista ao vídeo tutorial utilizando o bloco de função para aplicações envolvendo os protocolos MQTT e MODBUS: Tutorial MQTT_MDB_BRIDGE

Bloco de função

                    MQTT_MDB_BRIDGE
           +--------------------------------+
  BOOL ----|START                 MDB_BRT_EV|---- BOOL
           |                                |
 USINT ----|MDB_MAP_ID           MDB_END_CYC|---- BOOL
           |                                |
  BOOL ----|MDB_EN_SCAN            MDB_RD_EV|---- BOOL
           |                                |
  BOOL ----|MDB_SKIP_RD           MDB_RD_CHG|---- BOOL
           |                                |
 USINT ----|MDB_COMM_SRC           MDB_RD_ID|---- INT
           |                                |
  TIME ----|MDB_POLL_TME          MDB_RD_CID|---- INT
           |                                |
  TIME ----|MDB_PACK_TME         MDB_RD_CODE|---- INT
           |                                |
 USINT ----|MQTT_MAP_ID            MDB_WR_EV|---- BOOL
           |                                |
 USINT ----|MQTT_COMM_SRC          MDB_WR_ID|---- INT
           |                                |
  UINT ----|MQTT_FLAGS            MDB_WR_CID|---- INT
           |                                |
 USINT ----|MQTT_DEC_SEP         MDB_WR_CODE|---- INT
           |                                |
  BOOL ----|MQTT_HI_GATE          MDB_CHG_EV|---- INT
           |                                |
  UINT ----|MQTT_KEEP_ALIVE      MDB_ITEM_ID|---- INT
           |                                |
  UINT ----|MQTT_BROKER_PORT      MQTT_SB_EV|---- BOOL
           |                                |
           |                      MQTT_SB_ID|---- INT
           |                                |
           |                    MQTT_SB_CODE|---- INT
           |                                |
           |                      MQTT_PB_EV|---- BOOL
           |                                |
           |                      MQTT_PB_ID|---- INT
           |                                |
           |                    MQTT_PB_CODE|---- INT
           |                                |
           |                      MQTT_RT_EV|---- BOOL
           |                                |
           |                     MQTT_RT_CHG|---- BOOL
           |                                |
           |                      MQTT_RT_ID|---- INT
           |                                |
           |                    MQTT_RT_CODE|---- INT
           |                                |
           |                     MQTT_CHG_EV|---- BOOL
           |                                |
           |                       MQTT_CONN|---- BOOL
           |                                |
           |                   MQTT_TOPIC_ID|---- INT
           |                                |
STRING ----|MQTT_BROKER_IP ---------------- |----
           |                                |
STRING ----|MQTT_CLIENT_ID ---------------- |----
           |                                |
STRING ----|MQTT_W_TOPIC ------------------ |----
           |                                |
STRING ----|MQTT_W_MSG -------------------- |----
           |                                |
STRING ----|MQTT_USER --------------------- |----
           |                                |
STRING ----|MQTT_PASSW -------------------- |----
           |                                |
   INT ----|MDB_CACHE --------------------- |----
           |                                |
   INT ----|MQTT_CACHE -------------------- |----
           +--------------------------------+

Para utilização deste bloco, o usuário deverá, usando o recurso de Mapeamento de dados, criar um canal de mapeamento associado ao protocolo MQTT (definindo os tópicos a subscrever e a publicar) e um canal de mapeamento associado ao protocolo MODBUS (definindo os itens a ler e a escrever remotamente). Todos os tópicos e itens criados devem estar associados a variáveis globais exportadas.

Importante

Para a utilização desse bloco, o socket utilizado para acesso ao broker MQTT deve ser previamente configurado para operação como cliente TCP/IP (sem conexão automática) com protocolo MQTT, e o tamanho da cache de dados do socket deve ser de no mínimo 500 bytes (1460 máx.).

Caso possua dúvidas sobre como configurar o socket assista ao tutorial: Configurando recursos de conectividade do equipamento

Importante

Os canais de comunicação utilizados para acesso aos equipamentos MODBUS devem possuir as seguintes configurações:

  • O protocolo de aplicação deve estar configurado como MODBUS-TCP ou MODBUS-RTU, em função do equipamento remoto a ser acessado.

  • Se o canal for ethernet, o socket associado deve estar configurado como cliente TCP/IP e com auto conexão desativada.

  • Se o canal for serial, os parâmetros de baudrate, data bits, stop bits e paridade devem ser compatíveis com as configurações dos equipamentos a serem acessados.

Parâmetros

Nome

Direção

Tipo

Dimensão

Padrão

Faixa / Unidade

Descrição

START

IN

BOOL

—

FALSE

—

Inicia a operação do gateway. Quando inativa, o bloco permanece desconectado do broker e os tópicos não são publicados nem mantidos em cache.

MDB_MAP_ID

IN

USINT

—

0

—

Id do mapeamento de dados (DataMap) associado ao protocolo MODBUS.

MDB_EN_SCAN

IN

BOOL

—

TRUE

—

Habilita o polling de dados dos equipamentos MODBUS remotos.

MDB_SKIP_RD

IN

BOOL

—

FALSE

—

Quando habilitada imediatamente após um evento MDB_BRT_EV, cancela a transação de leitura corrente.

MDB_COMM_SRC

IN

USINT

—

0

canal COMM

Canal de comunicação utilizado para acesso ao equipamento MODBUS (ex.: COM1_PORT_ID).

MDB_POLL_TME

IN

TIME

—

T#20ms

—

Tempo entre um ciclo de comunicação.

MDB_PACK_TME

IN

TIME

—

T#10ms

—

Tempo entre pacotes de comunicação.

MQTT_MAP_ID

IN

USINT

—

0

—

Id do mapeamento de dados (DataMap) associado ao protocolo MQTT.

MQTT_COMM_SRC

IN

USINT

—

0

canal COMM

Canal de comunicação utilizado para acesso ao broker (ex.: SOCK1_PORT_ID).

MQTT_FLAGS

IN

UINT

—

8

—

Flags de conexão com o broker.

MQTT_DEC_SEP

IN

USINT

—

46

cód. ASCII

Separador de casas decimais na conversão de valores reais para string (46 = ponto .).

MQTT_HI_GATE

IN

BOOL

—

FALSE

—

Se TRUE e conectado ao Portal da HI Tecnologia, notifica que é um equipamento HI e sincroniza o relógio automaticamente.

MQTT_KEEP_ALIVE

IN

UINT

—

300

s

Tempo, em segundos, para o broker validar a conexão.

MQTT_BROKER_PORT

IN

UINT

—

1883

porta TCP

Porta de escuta do broker.

MQTT_BROKER_IP

IN_OUT

STRING

:*

—

—

Endereço IP do broker a ser acessado.

MQTT_CLIENT_ID

IN_OUT

STRING

:*

—

—

Identificador do cliente (Client ID) MQTT.

MQTT_W_TOPIC

IN_OUT

STRING

:*

—

—

Nome do tópico associado à mensagem de desconexão (opcional).

MQTT_W_MSG

IN_OUT

STRING

:*

—

—

Mensagem de desconexão (opcional).

MQTT_USER

IN_OUT

STRING

:*

—

—

Nome do usuário (opcional).

MQTT_PASSW

IN_OUT

STRING

:*

—

—

Senha de acesso (opcional).

MDB_CACHE

IN_OUT

INT

[*]

0

—

Cache de tópicos a serem enviados para o equipamento MODBUS.

MQTT_CACHE

IN_OUT

INT

[*]

0

—

Cache de tópicos a serem enviados para o broker.

MDB_BRT_EV

OUT

BOOL

—

FALSE

—

Quando ativo, indica que uma nova transação de leitura será iniciada; via MDB_SKIP_RD o usuário pode bloqueá-la.

MDB_END_CYC

OUT

BOOL

—

FALSE

—

Quando ativo, indica o término de um ciclo de aquisição de itens nos equipamentos remotos.

MDB_RD_EV

OUT

BOOL

—

FALSE

—

Indica o fim do processo de aquisição de um item no equipamento remoto.

MDB_RD_CHG

OUT

BOOL

—

FALSE

—

Indica que a variável adquirida é diferente do valor anterior presente na base global.

MDB_RD_ID

OUT

INT

—

-1

—

Id do item da última aquisição no equipamento remoto.

MDB_RD_CID

OUT

INT

—

-1

—

Id de comunicação da última leitura no equipamento remoto.

MDB_RD_CODE

OUT

INT

—

0

RET_CODE

Código de retorno da última recepção remota (ver Códigos de retorno).

MDB_WR_EV

OUT

BOOL

—

FALSE

—

Indica o fim do processo de escrita de um item no equipamento remoto.

MDB_WR_ID

OUT

INT

—

-1

—

Id do item da última escrita no equipamento remoto.

MDB_WR_CID

OUT

INT

—

-1

—

Id de comunicação da última escrita no equipamento remoto.

MDB_WR_CODE

OUT

INT

—

0

RET_CODE

Código de retorno da última escrita no equipamento remoto (ver Códigos de retorno).

MDB_CHG_EV

OUT

INT

—

0

—

Pulso que notifica que uma variável lida via MODBUS foi alterada e inserida na cache de publicação do broker.

MDB_ITEM_ID

OUT

INT

—

-1

—

Id do tópico a ser publicado no broker por alteração; válido na ocorrência de MDB_CHG_EV.

MQTT_SB_EV

OUT

BOOL

—

FALSE

—

Indica o fim do processo de subscribe de um tópico.

MQTT_SB_ID

OUT

INT

—

0

—

Id do item do último subscribe.

MQTT_SB_CODE

OUT

INT

—

0

RET_CODE

Código de retorno do último subscribe (ver Códigos de retorno).

MQTT_PB_EV

OUT

BOOL

—

FALSE

—

Indica o fim do processo de publish de um tópico.

MQTT_PB_ID

OUT

INT

—

0

—

Id do item do último publish.

MQTT_PB_CODE

OUT

INT

—

0

RET_CODE

Código de retorno do último publish (ver Códigos de retorno).

MQTT_RT_EV

OUT

BOOL

—

FALSE

—

Indica o fim do processo de recepção de um tópico do broker.

MQTT_RT_CHG

OUT

BOOL

—

FALSE

—

Indica que o tópico recebido é diferente do valor anterior presente na base global.

MQTT_RT_ID

OUT

INT

—

0

—

Id do item da última recepção de tópico do broker.

MQTT_RT_CODE

OUT

INT

—

0

RET_CODE

Código de retorno da última recepção de tópico do broker (ver Códigos de retorno).

MQTT_CHG_EV

OUT

BOOL

—

FALSE

—

Pulso que notifica que uma variável recebida via broker MQTT foi alterada e inserida na cache de publicação do gateway MODBUS.

MQTT_CONN

OUT

BOOL

—

FALSE

—

Indica que o equipamento está conectado ao broker.

MQTT_TOPIC_ID

OUT

INT

—

-1

—

Id da variável a ser enviada via MODBUS por alteração; válido na ocorrência de MQTT_CHG_EV.

Códigos de retorno

As saídas de código (MDB_RD_CODE, MDB_WR_CODE, MQTT_SB_CODE, MQTT_PB_CODE e MQTT_RT_CODE) reportam o resultado da última transação correspondente. O valor 0 (SUCCESS / MB_SUCCESS) indica sucesso; valores diferentes de zero indicam falha. Use os identificadores com o namespace HILS (ex.: HILS.CO_SOCK_ERR). Códigos mais comuns:

Código

Identificador

Significado

0

SUCCESS

Processo executado com sucesso.

10

GL_CMD_TMO

Timeout na execução do comando.

63

CO_CONEX_FAIL

Falha no processo de conexão.

67

CO_SOCK_ERR

Erro de socket.

79

CO_REC_TMO

Timeout na recepção de frame.

100

MB_SUCCESS

Comando MODBUS executado com sucesso.

101

MB_ILLEGAL_FUNCTION

Comando (função) MODBUS ilegal.

102

MB_ILLEGAL_DATA_ADDRESS

Endereço do dado no comando MODBUS inválido.

104

MB_SLAVE_DEVICE_FAILURE

Falha na execução do comando pelo equipamento remoto.

106

MB_SLAVE_DEVICE_BUSY

Equipamento remoto ocupado.

Lista completa dos códigos de retorno: RET_CODE - Códigos de retorno do firmware G5.

Pré-condições

  • Canais de mapeamento (Mapeamento de dados) criados e associados aos protocolos MQTT e MODBUS, com tópicos/itens associados a variáveis globais exportadas.

  • Socket do broker configurado como cliente TCP/IP (sem auto conexão) com protocolo MQTT e cache de dados de no mínimo 500 bytes (1460 máx.).

  • Canais MODBUS configurados como MODBUS-TCP ou MODBUS-RTU, conforme o equipamento remoto.

Observações

  • As entradas/saídas deste bloco correspondem aos parâmetros dos blocos MQTT_GATEWAY e MDB_GATEWAY, que a bridge integra internamente.

  • MDB_CHG_EV e MQTT_CHG_EV são pulsos com duração de um ciclo de scan que sinalizam a propagação de um valor alterado de um protocolo para o outro.

  • Os canais de comunicação (MDB_COMM_SRC / MQTT_COMM_SRC) usam os identificadores de porta:

    Identificador

    Valor

    COM1_PORT_ID .. COM8_PORT_ID

    0 .. 7

    SOCK0_PORT_ID .. SOCK7_PORT_ID

    8 .. 15

    ETH2_SOCK0_PORT_ID .. ETH2_SOCK7_PORT_ID

    16 .. 23

Ver também

COMM_NOTIFY_ITEM, MQTT_GATEWAY, MDB_GATEWAY

Exemplo

Clique aqui para baixar a tabela de variáveis

Código ST

VAR
    START         : BOOL := FALSE;            (* Flag para habilitar a bridge *)
    BROKER_IP     : STRING := '192.168.0.80'; (* IP de escuta do broker *)
    BROKER_PORT   : UINT := 1883;             (* Porta de escuta do broker *)
    WILL_T        : STRING := 'W_TOPIC';      (* Nome do tópico de WILL *)
    WILL_M        : STRING := 'W_MSG';        (* Mensagem de WILL *)
    USER          : STRING := 'JOAO';         (* Usuário de autenticação no broker *)
    PASSW         : STRING := '123';          (* Senha de autenticação no broker *)
    NEW_FROM_MDB  : INT := 0;                 (* Dado alterado pelo broker *)
    NEW_FROM_MQTT : INT := 0;                 (* Dado alterado pelo equipamento remoto *)
    CONNECTED     : BOOL := FALSE;            (* Broker conectado *)
    MDB_CACHE     : INT := 0;                 (* Cache para escrita de variaveis modbus *)
    MQTT_CACHE    : INT := 0;                 (* Cache para publicação de tópicos *)
    BRIDGE        : HILS.MQTT_MDB_BRIDGE;     (* Bridge MQTT MODBUS *)
END_VAR
VAR_EXTERNAL
    GV_ALARME     : BOOL := FALSE;            (* Alarme de temperatura alta *)
    GV_SETPOINT   : REAL := 20.00;            (* Setpoint para alarme *)
    GV_TEMP       : REAL := 25.00;            (* Temperatura do processo *)
END_VAR

// Este código, após a ativação da entrada START, publica no broker ciclicamente os
// tópicos definidos no canal de mapeamento 2 e le ciclicamente os endereços MODBUS
// definidos no canal de mapeamento 1, enviando as variáveis via o canal MODBUS.

// Bridge MQTT MODBUS

BRIDGE(  // MQTT_MDB_BRIDGE
  START         := START,                               // [BOOL]  Inicia operação do gateway
  //MDB_EN_SCAN :=                                      // [BOOL]  Habilita o polling de dados do equipamento remoto
  //MDB_SKIP_RD :=                                      // [BOOL]  Cancela a transação de leitura corrente após MDB_BRT_EV
  MDB_MAP_ID    := 1,                                   // [USINT] Id do mapeamento de dados associado ao protocolo MODBUS
  MDB_COMM_SRC  := HILS.COM1_PORT_ID,                   // [USINT] Canal de comunicação para acesso ao equipamento Modbus
  //MDB_POLL_TME := ,                                   // [TIME]  Tempo entre um ciclo de comunicação
  //MDB_PACK_TME := ,                                   // [TIME]  Tempo entre pacotes de comunicação
  MDB_CACHE     := MDB_CACHE,                           // [INT]   Cache de tópicos a serem enviados para o equipamento MODBUS
  MQTT_MAP_ID   := 2,                                   // [USINT] Id do mapeamento de dados associado ao protocolo MQTT
  MQTT_COMM_SRC := HILS.SOCK2_PORT_ID,                  // [USINT] Canal de comunicação para acesso ao broker
  MQTT_FLAGS    := HILS.CLIENT_ID + HILS.CLEAN_SECTION, // [UINT]  Flags de conexão com o broker
  //MQTT_DEC_SEP := ,                                   // [USINT] Separador de casas decimais na conversão de reais para string
  //MQTT_KEEP_ALIVE := ,                                // [UINT]  Tempo em segundos para o broker validar a conexão
  MQTT_BROKER_PORT := BROKER_PORT,                      // [UINT]   Porta de escuta do broker
  MQTT_BROKER_IP   := BROKER_IP,                        // [STRING] Endereço IP do broker a ser acessado
  MQTT_W_TOPIC     := WILL_T,                           // [STRING] Nome do tópico associado à mensagem de desconexão
  MQTT_W_MSG       := WILL_M,                           // [STRING] Mensagem de desconexão
  MQTT_USER        := USER,                             // [STRING] Nome do usuário
  MQTT_PASSW       := PASSW,                            // [STRING] Senha de acesso
  MQTT_CACHE       := MQTT_CACHE                        // [INT]    Cache de tópicos a serem enviados para o broker
  );