MQTT_MDB_4G_BRIDGE

Executa uma bridge MODBUS?MQTT em que a interface MQTT trafega sobre um modem de rede celular (3G ou NB-IoT) instalado na ITF B do equipamento; é um bloco de função (mantém estado entre scans; requer instância).

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

Bloco de função

                   MQTT_MDB_4G_BRIDGE
           +---------------------------------+
  BOOL ----|START                  MDB_BRT_EV|---- BOOL
           |                                 |
 USINT ----|MQTT_DMAP_ID          MDB_END_CYC|---- BOOL
           |                                 |
 USINT ----|MQTT_DEC_SEP            MDB_RD_EV|---- BOOL
           |                                 |
  BOOL ----|MQTT_HI_GATE           MDB_RD_CHG|---- BOOL
           |                                 |
  UINT ----|MQTT_FLAGS              MDB_RD_ID|---- INT
           |                                 |
  UINT ----|MQTT_KEEP_ALIVE        MDB_RD_CID|---- INT
           |                                 |
  BOOL ----|MDB_EN_SCAN           MDB_RD_CODE|---- INT
           |                                 |
  BOOL ----|MDB_SKIP_RD             MDB_WR_EV|---- BOOL
           |                                 |
 USINT ----|MDB_COMM_SRC            MDB_WR_ID|---- INT
           |                                 |
 USINT ----|MDB_DMAP_ID            MDB_WR_CID|---- INT
           |                                 |
  TIME ----|MDB_POLL_TME          MDB_WR_CODE|---- INT
           |                                 |
  TIME ----|MDB_PACK_TME      MQTT_CEL_RESULT|---- INT
           |                                 |
  BOOL ----|CEL_SYNC_RTC       MQTT_CONNECTED|---- BOOL
           |                                 |
           |                       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|---- INT
           |                                 |
           |                       MQTT_RT_ID|---- INT
           |                                 |
           |                     MQTT_RT_CODE|---- INT
           |                                 |
STRING ----|CEL_PIN ------------------------ |----
           |                                 |
STRING ----|CEL_APN ------------------------ |----
           |                                 |
STRING ----|CEL_USER ----------------------- |----
           |                                 |
STRING ----|CEL_PASSW ---------------------- |----
           |                                 |
STRING ----|CEL_IP ------------------------- |----
           |                                 |
STRING ----|CEL_PORT ----------------------- |----
           |                                 |
STRING ----|MQTT_CLIENT_ID ----------------- |----
           |                                 |
STRING ----|MQTT_W_TOPIC ------------------- |----
           |                                 |
STRING ----|MQTT_W_MSG --------------------- |----
           |                                 |
STRING ----|MQTT_USER ---------------------- |----
           |                                 |
STRING ----|MQTT_PASSW --------------------- |----
           |                                 |
   INT ----|MQTT_CACHE --------------------- |----
           |                                 |
   INT ----|MDB_CACHE ---------------------- |----
           +---------------------------------+

Este bloco faz 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.

Após ser habilitado (START), o bloco aguarda uma transição de subida em START. Quando esta ocorre, o bloco configura o modem e abre a conexão com o broker (via MODEM_RNB_U3G). Estabelecida a conexão, o equipamento entra na rotina padrão de publishing e subscribing das variáveis catalogadas no canal Mapeamento de dados MQTT do projeto. Analogamente, habilita o bloco MDB_GATEWAY para leitura e escrita dos dados referenciados no Mapeamento de dados MODBUS.

Após a configuração do modem celular, o valor da qualidade do sinal de rede é salvo na variável de sistema 930, podendo ser acessado pelo programa de aplicação ou por dispositivos externos via MODBUS.

Por fim, o bloco controla o led vermelho do equipamento, sinalizando os estados:

  • Led Vermelho ACESO: configurando rede celular e abrindo conexão TCP com o broker, ou bloco desabilitado.

  • Led Vermelho PISCANDO: conectado ao broker MQTT e/ou aguardando conexão.

  • Led Vermelho APAGADO: operando, trocando dados com sucesso.

Para utilizar este bloco, o usuário deve inicialmente, com o recurso Mapeamento de dados, criar um canal de mapeamento e associá-lo ao protocolo MODBUS. Em seguida, definir os itens a serem obtidos e enviados remotamente. Todos os itens criados devem estar associados a variáveis globais exportadas. Na lista das variáveis a serem lidas, agrupe-as por endereço de comunicação: assim, ao ocorrer um erro de comunicação na leitura de uma variável, as subsequentes de mesmo endereço são descartadas no ciclo corrente, evitando atraso causado pelo timeout de falha em cada leitura.

Nota

Este bloco é válido somente quando há um Modem 3G/NB-IoT na ITF B do equipamento. A entrada START deve permanecer em nível alto durante toda a execução do bloco.

Importante

Para a utilização deste bloco, os canais de comunicação usados para acesso aos equipamentos 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 os equipamentos acessados.

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

Parâmetros

Nome

Direção

Tipo

Dimensão

Padrão

Faixa / Unidade

Descrição

START

IN

BOOL

—

FALSE

—

Habilita a operação do bloco (deve permanecer em nível alto).

MQTT_DMAP_ID

IN

USINT

—

0

—

Id do mapeamento de dados MQTT associado ao bloco.

MQTT_DEC_SEP

IN

USINT

—

46

código ASCII

Separador de casas decimais na conversão de 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_FLAGS

IN

UINT

—

8

—

Flags de conexão com o broker.

MQTT_KEEP_ALIVE

IN

UINT

—

300

s

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

MDB_EN_SCAN

IN

BOOL

—

TRUE

—

Habilita o polling de dados do equipamento remoto.

MDB_SKIP_RD

IN

BOOL

—

FALSE

—

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

MDB_COMM_SRC

IN

USINT

—

0

0 .. 23

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

MDB_DMAP_ID

IN

USINT

—

0

—

Id do mapeamento de dados MODBUS associado ao bloco.

MDB_POLL_TME

IN

TIME

—

T#40ms

—

Tempo entre um ciclo de comunicação e outro.

MDB_PACK_TME

IN

TIME

—

T#20ms

—

Tempo entre pacotes de comunicação.

CEL_SYNC_RTC

IN

BOOL

—

FALSE

—

Sincroniza o relógio calendário do controlador pela rede celular.

CEL_PIN

IN_OUT

STRING

:*

—

—

PIN do SIM CARD.

CEL_APN

IN_OUT

STRING

:*

—

—

APN da operadora do chip de rede celular.

CEL_USER

IN_OUT

STRING

:*

—

—

Usuário da operadora de rede celular.

CEL_PASSW

IN_OUT

STRING

:*

—

—

Senha da operadora de rede celular.

CEL_IP

IN_OUT

STRING

:*

—

—

Endereço IP (ou host name) do broker a ser acessado.

CEL_PORT

IN_OUT

STRING

:*

—

—

Porta de escuta do broker.

MQTT_CLIENT_ID

IN_OUT

STRING

:*

—

—

Identificador do cliente MQTT (Client ID).

MQTT_W_TOPIC

IN_OUT

STRING

:*

—

string:80

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

MQTT_W_MSG

IN_OUT

STRING

:*

—

string:140

Mensagem de desconexão (Will Message).

MQTT_USER

IN_OUT

STRING

:*

—

string:36

Nome do usuário/login de autenticação do broker MQTT (opcional).

MQTT_PASSW

IN_OUT

STRING

:*

—

string:36

Senha de acesso do login de autenticação do broker MQTT (opcional).

MQTT_CACHE

IN_OUT

INT

[*]

0

—

Cache de tópicos a serem enviados ao broker (fornecer um vetor de INT).

MDB_CACHE

IN_OUT

INT

[*]

0

—

Cache de itens a serem enviados ao equipamento remoto (fornecer um vetor de INT[50]).

MDB_BRT_EV

OUT

BOOL

—

FALSE

—

Quando ativo, indica que uma nova transação de leitura será iniciada (bloqueável por MDB_SKIP_RD).

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 da aquisição de um item no equipamento remoto (MODBUS).

MDB_RD_CHG

OUT

BOOL

—

FALSE

—

Indica que a variável adquirida difere do valor anterior na base global (MODBUS).

MDB_RD_ID

OUT

INT

—

-1

—

Id do item da última aquisição do equipamento remoto (MODBUS).

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 (MODBUS).

MDB_WR_EV

OUT

BOOL

—

FALSE

—

Indica o fim da escrita de um item no equipamento remoto (MODBUS).

MDB_WR_ID

OUT

INT

—

-1

—

Id do item da última escrita no equipamento remoto (MODBUS).

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 (MODBUS).

MQTT_CEL_RESULT

OUT

INT

—

0

RET_CODE

Resultado do processo de conexão MQTT via rede celular.

MQTT_CONNECTED

OUT

BOOL

—

FALSE

—

Indica que o equipamento está conectado ao broker.

MQTT_SB_EV

OUT

BOOL

—

FALSE

—

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

MQTT_SB_ID

OUT

INT

—

0

—

Id do item da última recepção/subscribe (MQTT).

MQTT_SB_CODE

OUT

INT

—

0

RET_CODE

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

MQTT_PB_EV

OUT

BOOL

—

FALSE

—

Indica o fim do processo de publish de um item (MQTT).

MQTT_PB_ID

OUT

INT

—

0

—

Id do item da última escrita/publish (MQTT).

MQTT_PB_CODE

OUT

INT

—

0

RET_CODE

Código de retorno da última escrita (MQTT).

MQTT_RT_EV

OUT

BOOL

—

FALSE

—

Indica o fim da recepção de um tópico do broker (MQTT).

MQTT_RT_CHG

OUT

INT

—

0

—

Indica que o tópico recebido difere do valor anterior na base global (MQTT).

MQTT_RT_ID

OUT

INT

—

0

—

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

MQTT_RT_CODE

OUT

INT

—

0

RET_CODE

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

Códigos de retorno

As saídas de código (MQTT_CEL_RESULT, MDB_RD_CODE, MDB_WR_CODE, MQTT_SB_CODE, MQTT_PB_CODE, MQTT_RT_CODE) reportam o resultado das transações. Use os identificadores com o namespace HILS (ex.: HILS.CN_NO_NET). 0 (SUCCESS) indica sucesso; valores ? 0 indicam falha. Códigos mais comuns deste bloco:

Código

Identificador

Significado

0

SUCCESS

Processo executado com sucesso.

5

GL_INV_PAR

Parâmetro(s) inválido(s).

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.

80

CO_EQP_TMO

Timeout na resposta de equipamento externo (Modem).

100

MB_SUCCESS

Comando MODBUS executado com sucesso.

101

MB_ILLEGAL_FUNCTION

Função MODBUS ilegal.

102

MB_ILLEGAL_DATA_ADDRESS

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

104

MB_SLAVE_DEVICE_FAILURE

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

180

CN_PIN_ERR

PIN inválido ou bloqueado.

181

CN_SIM_CARD_ERR

SIM CARD inválido ou não encontrado.

182

CN_NO_NET

Não detectou rede celular.

183

CN_REGISTER_DENIED

Registro na rede celular negado.

184

CN_INV_AUTH_DATA

Dados de autenticação da rede celular inválidos (APN, USER ou PASSW).

185

CN_AUTH_DENIED

Autenticação na rede celular negada.

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

Pré-condições

  • Modem 3G/NB-IoT presente na ITF B do equipamento.

  • Canal MODBUS configurado como MODBUS-TCP ou MODBUS-RTU (socket cliente TCP/IP com auto conexão desativada, ou serial compatível com o equipamento remoto).

  • Canais de Mapeamento de dados MQTT e Mapeamento de dados MODBUS criados via Mapeamento de dados, com itens associados a variáveis globais exportadas.

  • START mantido em nível alto durante toda a execução do bloco.

Observações

  • A qualidade do sinal celular fica disponível na variável de sistema 930, acessível pela aplicação e via MODBUS.

  • Os parâmetros de entrada replicam os parâmetros dos blocos MODEM_QC1, MQTT_GATEWAY e MDB_GATEWAY; os erros de configuração/conexão do modem são detalhados em MODEM_CONN, U3G_CFG e RNB_CFG.

  • Identificadores de canal de comunicação (MDB_COMM_SRC):

    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

MQTT_MDB_CEL_BRIDGE, MODEM_RNB_U3G, MDB_GATEWAY, MQTT_GATEWAY, MODEM_QC1, MODEM_CONN, U3G_CFG, RNB_CFG

Exemplo

Clique aqui para baixar a tabela de variáveis

Código ST

VAR
    START          : BOOL := FALSE;                     (* Inicia operação do bloco principal *)
    PUB_BIT_NOW    : BOOL := FALSE;                     (* Força publicação do BIT_WR instantaneamente *)
    MQTT_CONNECTED : BOOL := FALSE;                     (* Sinaliza que equipamento conectado ao broker *)
    BRIDGE_RESULT  : UINT := 0;                         (* Resultado da conexão com broker MQTT *)
    SIG_QLTY       : USINT := 0;                        (* Qualidade do sinal da rede 3G *)
    MDB_COUNT      : INT := 0;                          (* Contador de ciclos de escrita no device modbus *)
    RD_ID          : INT := -1;                         (* Último código associado ao último ciclo de leitura *)
    MQTT_COUNT     : INT := 0;                          (* Contador de ciclos de escrita no broker MQTT *)
    WR_ID          : INT := -1;                         (* Último código associado ao último ciclo de escrita *)
    CEL_PIN        : STRING[4] := '';                   (* PIN do SIM Card da rede celular *)
    CEL_APN        : STRING[31] := 'java.claro.com.br'; (* APN da rede celular *)
    CEL_USER       : STRING[15] := 'claro';             (* Usuário da rede celular *)
    CEL_PASS       : STRING[10] := 'claro';             (* Senha da rede celular *)
    MQTT_MSG       : STRING[140];                       (* Mensagem de desconexão (WILL Message) *)
    MQTT_TOPIC     : STRING[80];                        (* Nome do tópico associado à mensagem de desconexão (WILL Message) *)
    MQTT_USER      : STRING[20] := 'ze';                (* Nome do usuário para login no Broker MQTT *)
    MQTT_PASS      : STRING[16] := 'oi';                (* Senha de acesso para login no Broker MQTT *)
    BRK_IP         : STRING[40] := '50.16.187.132';     (* Endereço IP do Broker *)
    BRK_PORT       : STRING[6] := '1883';               (* Porta de escuta do broker *)
    MDB_CACHE      : ARRAY [0..49] OF INT := 0;         (* Cache para escrita de variáveis modbus *)
    MQTT_CACHE     : ARRAY [0..49] OF INT := 0;         (* Cache de tópicos a serem enviados ao broker *)
    BRIDGE         : HILS.MQTT_MDB_4G_BRIDGE;           (* Instância do bloco BRIDGE MQTT-MDB *)
END_VAR
VAR_EXTERNAL
    BIT_MDB        : BOOL := FALSE;                     (* Variável BOOL para escrita no device MODBUS *)
    BIT_MQTT       : BOOL := FALSE;                     (* Variável BOOL para escrita no broker MQTT *)
END_VAR

//------------------------------------------------------------------------------
// Instância do bloco MQTT_MDB_4G_BRIDGE
//
// Uma vez carregada a aplicação, ative a variável START para habilitar a
// operação da bridge MQTT-MDB-CEL.
//------------------------------------------------------------------------------

BRIDGE(  // MQTT_MDB_4G_BRIDGE
  START           := START,             // [BOOL] Habilita operação do bloco
  MQTT_DMAP_ID    := 1,                 // [USINT] Id do mapeamento de dados associado ao bloco
  //MQTT_DEC_SEP    := ,                // [USINT] Separador de casas decimais (default = ponto)
  //MQTT_FLAGS      := ,                // [UINT] Flags de conexão com o broker
  MQTT_KEEP_ALIVE := 300,               // [UINT] Tempo em segundos para o broker validar a conexão
  //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 um BRT_EV
  MDB_COMM_SRC    := HILS.COM2_PORT_ID, // [USINT] Canal de comunicação para acesso ao equipamento Modbus
  MDB_DMAP_ID     := 2,                 // [USINT] Id do mapeamento de dados MODBUS
  MDB_POLL_TME    := T#2s,              // [TIME] Tempo entre um ciclo de comunicação
  MDB_PACK_TME    := T#500ms,           // [TIME] Tempo entre pacotes de comunicação
  MDB_CACHE       := MDB_CACHE,         // [INT] Cache de itens a serem enviados ao equipamento remoto (INT[50])
  MQTT_CACHE      := MQTT_CACHE,        // [INT] Cache de tópicos a serem enviados ao broker
  CEL_PIN         := CEL_PIN,           // [STRING] PIN do SIM CARD
  CEL_APN         := CEL_APN,           // [STRING] APN da operadora do chip de rede celular
  CEL_USER        := CEL_USER,          // [STRING] Usuário da operadora de rede celular
  CEL_PASSW       := CEL_PASS,          // [STRING] Senha da operadora de rede celular
  CEL_IP          := BRK_IP,            // [STRING] Endereço IP do broker a ser acessado
  CEL_PORT        := BRK_PORT,          // [STRING] Porta de escuta do broker
  MQTT_USER       := MQTT_USER,         // [STRING] Login de autenticação do broker mqtt (opcional)
  MQTT_PASSW      := MQTT_PASS,         // [STRING] Senha de autenticação do broker mqtt (opcional)
  MQTT_W_TOPIC    := MQTT_TOPIC,        // [STRING] Nome do tópico da mensagem de desconexão (string:80)
  MQTT_W_MSG      := MQTT_MSG           // [STRING] Mensagem de desconexão (string:140)
  );

// Lê a qualidade do sinal da Rede Celular 3G (0..100%)
SIG_QLTY := HILS.GET_SYSVAR(930);

// Status de conexão do equipamento ao broker
BRIDGE_RESULT := BRIDGE.MQTT_CEL_RESULT;
IF ((BRIDGE_RESULT = 0) AND (START = TRUE)) THEN
  MQTT_CONNECTED := TRUE;
ELSE
  MQTT_CONNECTED := FALSE;
END_IF;

// Contabiliza ciclos de escritas no device modbus
IF BRIDGE.MDB_WR_EV THEN
  IF (BRIDGE.MDB_WR_CODE = 0) THEN
    MDB_COUNT := MDB_COUNT + 1;   // contador
  END_IF;
END_IF;

// Contabiliza ciclos de dados publicados no broker MQTT
IF BRIDGE.MQTT_PB_EV THEN
  IF (BRIDGE.MQTT_PB_CODE = 0) THEN
    MQTT_COUNT := MQTT_COUNT + 1;   // contador
  END_IF;
END_IF;

// Força a publicação do BIT_MQTT e BIT_MDB quando PUB_BIT_NOW = TRUE
IF (PUB_BIT_NOW) THEN
  // publica tópico 1 (bit) no broker mqtt
  HILS.COMM_NOTIFY_ITEM(
        1,          // ID [INT] = ID do ITEM associado ao canal de mapeamento 1
        MQTT_CACHE  // CACHE [] = Cache do canal de mapeamento MQTT
        );

  // escreve variável modbus 1 (coil 5) no device modbus
  HILS.COMM_NOTIFY_ITEM(
        1,          // ID [INT] = ID do ITEM associado ao canal de mapeamento 1
        MDB_CACHE   // CACHE [] = Cache do canal de mapeamento MODBUS
        );

  PUB_BIT_NOW := FALSE;

  BIT_MDB  := NOT BIT_MDB;  // toggle bit
  BIT_MQTT := NOT BIT_MQTT; // toggle bit
END_IF;