MQTT_MDB_CEL_BRIDGE

Executa uma bridge MODBUS-MQTT em que a interface MQTT opera sobre um modem de rede celular (3G ou NB-IoT); válido somente em equipamentos com modem 3G/NB-IoT instalado na ITF B. É um bloco de função (mantém estado entre scans; requer instância).

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.

Bloco de função

                   MQTT_MDB_CEL_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_SIMSTK         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 ---------------------- |----
           +---------------------------------+

Após o bloco ser habilitado pela entrada EN, ele aguarda uma transição de subida em START. Ao ocorrer, o bloco configura o modem e abre a conexão com o broker (utilizando o bloco MODEM_RNB_U3G). Estabelecida a conexão, o equipamento se conecta ao broker e entra em sua rotina padrão de publishing e subscribing das variáveis catalogadas no canal de 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, acessível pelo programa ou por dispositivos externos MODBUS.

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

  • Led Vermelho ACESO: equipamento configurando a rede celular e em processo de abertura de conexão TCP com o broker, ou bloco desabilitado.

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

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

A entrada START deve permanecer em nível alto durante toda a execução do bloco.

Nota

Este bloco é válido somente quando há um modem 3G/NB-IoT na ITF B do equipamento.

Para utilização deste bloco, o usuário deverá inicialmente, utilizando o recurso de Mapeamento de dados, criar um canal de mapeamento e associá-lo ao protocolo MODBUS. Em seguida, no canal criado, definir os itens a serem obtidos remotamente e os itens a serem enviados. Todos os itens 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, quando ocorrer erro de comunicação na leitura de uma variável, as subsequentes de mesmo endereço serão descartadas no ciclo de aquisição corrente, evitando demora causada pelo timeout de cada leitura.

Importante

Para a utilização deste bloco, os canais de comunicação utilizados 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 as configurações dos equipamentos acessados.

Dica

Assista ao vídeo tutorial utilizando o bloco de função para aplicações envolvendo os protocolos MQTT, MODBUS e modem celular 3G: Tutorial MQTT_MDB_CEL_BRIDGE

As entradas CEL_* são associadas ao bloco MODEM_RNB_U3G (PIN, APN, usuário, senha, IP e porta do broker) e as entradas/saídas MQTT_* e MDB_* espelham os parâmetros dos blocos MQTT_GATEWAY e MDB_GATEWAY, respectivamente.

Parâmetros

Nome

Direção

Tipo

Dimensão

Padrão

Faixa / Unidade

Descrição

START

IN

BOOL

—

FALSE

—

Habilita a operação do bloco.

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 (default = 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 habilitada imediatamente após um evento MDB_BRT_EV, cancela a transação de leitura corrente.

MDB_COMM_SRC

IN

USINT

—

0

ver canais COMM

Canal de comunicação utilizado 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 ciclos de comunicação.

MDB_PACK_TME

IN

TIME

—

T#20ms

—

Tempo entre pacotes de comunicação.

CEL_SIMSTK

IN

BOOL

—

FALSE

—

Chip multioperadora: habilita SIM ToolKit (default: FALSE).

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. Ex.: '54.227.237.88'.

CEL_PORT

IN_OUT

STRING

:*

—

—

Porta de escuta do broker. Ex.: '1883'.

MQTT_CLIENT_ID

IN_OUT

STRING

:*

—

—

Identificador do cliente MQTT.

MQTT_W_TOPIC

IN_OUT

STRING

:*

—

—

Nome do tópico associado à mensagem de desconexão (will); string até 80 caracteres.

MQTT_W_MSG

IN_OUT

STRING

:*

—

—

Mensagem de desconexão (will); string até 140 caracteres.

MQTT_USER

IN_OUT

STRING

:*

—

—

Usuário/login de autenticação do broker MQTT; string até 36 caracteres (opcional).

MQTT_PASSW

IN_OUT

STRING

:*

—

—

Senha de autenticação do broker MQTT; string até 36 caracteres (opcional).

MQTT_CACHE

IN_OUT

INT

[*]

0

—

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

MDB_CACHE

IN_OUT

INT

[*]

0

—

Cache de itens a serem enviados ao equipamento remoto (deve ser fornecido um vetor de INT).

MDB_BRT_EV

OUT

BOOL

—

FALSE

—

Quando ativo, indica que uma nova transação de leitura será iniciada; pode ser bloqueada por MDB_SKIP_RD.

MDB_END_CYC

OUT

BOOL

—

FALSE

—

Quando ativo, indica o fim 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 no 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 configuração e 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 remota (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 da escrita de um item no equipamento remoto (MQTT).

MQTT_PB_ID

OUT

INT

—

0

—

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

MQTT_PB_CODE

OUT

INT

—

0

RET_CODE

Código de retorno da última escrita no equipamento remoto (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).

Canais COMM (MDB_COMM_SRC), namespace HILS:

Identificador

Valor

Interface

COM1_PORT_ID .. COM8_PORT_ID

0 .. 7

Seriais

SOCK0_PORT_ID .. SOCK7_PORT_ID

8 .. 15

Ethernet 1

ETH2_SOCK0_PORT_ID .. ETH2_SOCK7_PORT_ID

16 .. 23

Ethernet 2

Códigos de retorno

As saídas *_CODE e MQTT_CEL_RESULT reportam o resultado de cada transação. Use os identificadores com o namespace HILS (ex.: HILS.MB_SUCCESS). Subconjunto relevante:

Código

Identificador

Significado

0

SUCCESS

Processo executado com sucesso.

63

CO_CONEX_FAIL

Falha no processo de conexão.

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.

103

MB_ILLEGAL_DATA_VALUE

Valor do dado inválido.

104

MB_SLAVE_DEVICE_FAILURE

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

106

MB_SLAVE_DEVICE_BUSY

Equipamento remoto ocupado.

180

CN_PIN_ERR

Erro de PIN (PIN inválido ou bloqueado).

181

CN_SIM_CARD_ERR

Erro de SIM Card (inválido ou não encontrado).

182

CN_NO_NET

Rede celular não detectada.

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: RET_CODE - Códigos de retorno do firmware G5.

Os códigos de erro do processo de configuração e conexão do modem celular (reportados em MQTT_CEL_RESULT) também são descritos nos blocos MODEM_CONN, U3G_CFG e RNB_CFG.

Pré-condições

  • Equipamento com modem 3G/NB-IoT instalado na ITF B.

  • Canal de comunicação MODBUS configurado (MODBUS-TCP/RTU) conforme a seção Bloco de função.

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

  • MQTT_CACHE e MDB_CACHE fornecidos como vetores de INT.

Observações

  • A entrada START deve permanecer em nível alto durante toda a execução.

  • A qualidade do sinal de rede é publicada na variável de sistema 930 após a configuração do modem.

  • O led vermelho sinaliza os estados de configuração, conexão e operação descritos na seção Bloco de função.

Ver também

MODEM_RNB_U3G, MDB_GATEWAY, MQTT_GATEWAY, MODEM_CONN, U3G_CFG, RNB_CFG, protocolo MQTT

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;                     (* Forca 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;                         (* Ultimo codigo associado ao ultimo ciclo de leitura *)
    MQTT_COUNT     : INT := 0;                          (* Contador de ciclos de escrita no broker MQTT *)
    WR_ID          : INT := -1;                         (* Ultimo codigo associado ao ultimo 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';             (* Usuario da rede celular *)
    CEL_PASS       : STRING[10] := 'claro';             (* Senha da rede celular *)
    MQTT_MSG       : STRING[14] := '';                  (* Mensagem de desconexão (WILL Message) *)
    MQTT_TOPIC     : STRING[80];                        (* Nome do tópico associado a 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 variaveis modbus *)
    MQTT_CACHE     : ARRAY [0..49] OF INT := 0;         (* Cache de tópicos a serem enviados ao broker *)
    BRIDGE         : HILS.MQTT_MDB_CEL_BRIDGE;          (* Instancia do bloco BRIDGE MQTT-MDB *)
END_VAR
VAR_EXTERNAL
    BIT_MDB        : BOOL := FALSE;                     (* Variavel BOOL para escrita no device MODBUS *)
    BIT_MQTT       : BOOL := FALSE;                     (* Variavel BOOL para escrita no broker MQTT *)
END_VAR

//------------------------------------------------------------------------------
// Instancia do bloco MQTT_MDB_CEL_BRIDGE
//
// Uma vez carregada a aplicação, ative a variavel START para habilitar a
// operação da bridge MQTT-MDB-CEL.
//------------------------------------------------------------------------------

BRIDGE(  // MQTT_MDB_CEL_BRIDGE
  //EN              := ,                // [BOOL] Entrada habilitadora
  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 no processo de conversao dos valores reais para string (default = ponto)
  //MQTT_FLAGS      := ,                // [USINT] Flags de conexão com o broker
  MQTT_KEEP_ALIVE := 300,               // [UINT] Tempo em segundos para o broker validadar a conexão
  //MDB_EN_SCAN     :=,                 // [BOOL] Habilita o polling de dados do equipamento remoto
  //MDB_SKIP_RD     :=,                 // [BOOL] Quando habilitada imediatamente após um evento BRT_EV cancela a transação  de leitura corrente
  MDB_COMM_SRC    := HILS.COM2_PORT_ID, // [USINT] Canal de comunicação utilizado para acesso equipamento Modbus  (ex: COM1_PORT_ID)
  MDB_DMAP_ID     := 2,                 // [USINT] Id do mapeamento de dados associado ao bloco MQTT
  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 items a serem enviados ao equipamento remoto (deve ser fornecido um vetor de tipos INT[50])
  MQTT_CACHE      := MQTT_CACHE,        // [INT] Cache de tópicos a serem enviados ao broker (deve ser fornecido um vetor de tipos INT)
  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_SIMSTK      := ,                // [BOOL] Chip Multioperadora: habilita SIM ToolKit  (default: false)
  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] Nome do usuário/login de autenticação do broker mqtt  (opcional)
  MQTT_PASSW      := MQTT_PASS,         // [STRING] Senha de acesso do login de autenticação do broker mqtt  (opcional)
  MQTT_W_TOPIC    := MQTT_TOPIC,        // [STRING] Nome do tópico associado a 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 piblicados 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 topico 1 (bit) no broker mqtt
  HILS.COMM_NOTIFY_ITEM(
        1,           // ID [INT] = ID do ITEM associado ao canal de mapeameto 1
        MQTT_CACHE   // CACHE [] = Cache do canal de mapeamento MQTT
        );

  // escreve variavel modbus 1 (coil 5) no device modbus
  HILS.COMM_NOTIFY_ITEM(
        1,           // ID [INT] = ID do ITEM associado ao canal de mapeameto 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;