LORA_GATEWAY

Implementa um gateway de comunicação para o protocolo LORA, permitindo subscrever e publicar tópicos LORA em um broker, com envio automático por critério de tempo ou de alteração de valor; requer um canal Mapeamento de dados associado ao protocolo LORA. É 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

                LORA_GATEWAY
           +---------------------+
  BOOL ----|EN                ENO|---- BOOL
           |                     |
  BOOL ----|START       CONNECTED|---- BOOL
           |                     |
  BOOL ----|EN_SCAN       RT_CODE|---- INT
           |                     |
 USINT ----|LORA_MODE       RT_ID|---- INT
           |                     |
 USINT ----|COMM_SRC       RT_CHG|---- BOOL
           |                     |
 USINT ----|DEC_SEP         RT_EV|---- BOOL
           |                     |
 USINT ----|DMAP_ID       PB_CODE|---- INT
           |                     |
           |                PB_ID|---- INT
           |                     |
           |                PB_EV|---- BOOL
           |                     |
       ----|T_CACHE ------------ |----
           |                     |
STRING ----|APP_KEY ------------ |----
           |                     |
STRING ----|APP_EUI ------------ |----
           |                     |
STRING ----|DEV_EUI ------------ |----
           +---------------------+

Para utilizar este bloco, o usuário deve primeiro criar um canal de mapeamento com o recurso Mapeamento de dados e associá-lo ao protocolo LORA. Em seguida, nesse canal, definir os tópicos a serem subscritos e os a serem publicados. Todos os tópicos criados devem estar associados a variáveis globais exportadas.

A entrada START inicia a operação: ao ser ativada, o bloco estabelece conexão com o broker, subscreve os tópicos a receber e passa a aguardar tópicos do broker ou critérios para publicar. Enquanto START estiver inativa, o bloco permanece desconectado e nenhum tópico é publicado ou mantido em cache. EN_SCAN habilita o ciclo de publicações automáticas (por tempo ou por alteração de valor); com valor padrão TRUE, o processo de publicação fica automaticamente ativo após START.

Os itens a publicar são inseridos na cache T_CACHE — um vetor de INT cujo tamanho é definido pela aplicação — através da função COMM_NOTIFY_ITEM. Cada elemento é o Id (linha do canal de mapeamento) que associa uma variável global a um tópico LORA. Uma vez inserido, o bloco remove o item da cache e o publica no broker assim que possível.

O canal de comunicação em COMM_SRC é indicado por um identificador numérico (namespace HILS):

Identificador

Valor

Meio

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

Importante

O socket usado para acesso ao broker deve ser previamente configurado para operação como cliente TCP-IP (sem conexão automática) com protocolo LORA, e o tamanho da cache de dados do socket deve ser de no mínimo 500 bytes (1460 máx.).

Atenção

Quando o bloco estiver ativado (entrada START), desativar EN durante o processo resulta em comportamento indefinido. Desative EN apenas quando não houver nenhum processo pendente no bloco.

Parâmetros

Nome

Direção

Tipo

Dimensão

Padrão

Faixa / Unidade

Descrição

EN

IN

BOOL

—

TRUE

—

Habilitação do bloco; quando inativa o bloco não é processado.

START

IN

BOOL

—

FALSE

—

Inicia a operação do gateway; ao ser ativada estabelece conexão com o broker.

EN_SCAN

IN

BOOL

—

TRUE

—

Habilita o ciclo de publicações automáticas ao broker (por tempo ou por alteração).

LORA_MODE

IN

USINT

—

0

1 = OTAA · 2 = ABP

Modo de operação LORA.

COMM_SRC

IN

USINT

—

0

ver Canais de comunicação

Canal (socket Ethernet) usado para acesso ao broker.

DEC_SEP

IN

USINT

—

46

código ASCII

Separador decimal na conversão de reais para string (46 = ponto).

DMAP_ID

IN

USINT

—

0

—

Id do mapeamento de dados (DataMap) associado ao bloco.

T_CACHE

IN_OUT

ANY

[*]

—

—

Cache de tópicos a publicar; deve ser um vetor de INT dimensionado pela aplicação.

APP_KEY

IN_OUT

STRING

:32

—

—

Application Key.

APP_EUI

IN_OUT

STRING

:32

—

—

Application ID (EUI).

DEV_EUI

IN_OUT

STRING

:16

—

—

Device ID (EUI).

ENO

OUT

BOOL

—

FALSE

—

Saída de habilitação (encadeamento em LADDER/FBD).

CONNECTED

OUT

BOOL

—

FALSE

—

Indica que a conexão com o broker foi estabelecida.

RT_CODE

OUT

INT

—

0

RET_CODE

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

RT_ID

OUT

INT

—

0

—

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

RT_CHG

OUT

BOOL

—

FALSE

—

Pulso: o tópico recebido difere do valor anterior na base global.

RT_EV

OUT

BOOL

—

FALSE

—

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

PB_CODE

OUT

INT

—

0

RET_CODE

Código de retorno da última publicação no broker (ver Códigos de retorno).

PB_ID

OUT

INT

—

-1

—

Id do item da última publicação no broker.

PB_EV

OUT

BOOL

—

FALSE

—

Pulso: fim do processo de publicação de um tópico no broker.

Códigos de retorno

RT_CODE e PB_CODE reportam o resultado das últimas recepção e publicação de tópico, respectivamente. 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.

68

CO_TRA_BUF_OVL

Overflow no buffer de transmissão.

69

CO_REC_BUF_OVR

Overrun no buffer de recepção.

70

CO_COM_ERR

Erro genérico de comunicação.

87

CO_COM_BRO

Comunicação interrompida.

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

Pré-condições

  • Um canal Mapeamento de dados associado ao protocolo LORA, com os tópicos a subscrever e a publicar definidos e associados a variáveis globais exportadas.

  • Socket configurado como cliente TCP-IP (sem conexão automática) com protocolo LORA e cache de dados de no mínimo 500 bytes (1460 máx.).

  • T_CACHE deve ser um vetor de INT dimensionado pela aplicação.

Observações

  • As saídas RT_EV, PB_EV e RT_CHG geram um pulso (permanecem ativas por um ciclo de scan) e sincronizam os respectivos *_ID e *_CODE.

  • Desativar EN com processo pendente leva a comportamento indefinido.

Ver também

COMM_NOTIFY_ITEM, LORA_MDB_BRIDGE, MDB_GATEWAY

Exemplo

Clique aqui para baixar a tabela de variáveis

Código ST

VAR
    START       : BOOL := FALSE;                (* Ativa operação do gateway *)
    SCAN        : BOOL;                         (* Habilita publicação automatica de tópicos *)
    SUBS        : BOOL;                         (* Habilita subscrição de tópicos *)
    NOTIFY      : BOOL := FALSE;                (* Publica um tópico no broker (exemplo) *)
    BROKER_IP   : STRING[15] := '192.168.0.58'; (* IP do broker *)
    BROKER_PORT : UDINT := 1883;                (* Porta do broker *)
    WILL_T      : STRING[80] := 'W_TOPIC';      (* Topico de desconexão *)
    WILL_M      : STRING[140] := 'W_MSG';       (* Mensagem de desconexão *)
    USER        : STRING[20] := 'JOAO';         (* Usuário *)
    PASSW       : STRING[16] := '123';          (* Senha *)
    T_CACHE     : ARRAY [0..99] OF INT := 0;    (* Cache para publicação de tópicos *)
    CONNECTED   : BOOL := FALSE;                (* Broker conectado *)
    SUBSCRIBED  : BOOL := FALSE;                (* Tópicos subscritos *)
    PB_COUNT    : INT := 0;                     (* Contador de topicos publicados *)
    SB_COUNT    : INT := 0;                     (* Contador de topicos subscritos *)
    RT_COUNT    : INT := 0;                     (* Contador de topicos recebidos *)
    GTW_LORA    : HILS.LORA_GATEWAY;            (* Instancia do gateway *)
END_VAR

// Este código, após a ativação da entrada START, publica ciclicamente os
// tópicos definidos no canal de mapeamento 2.
// Ao ser ativada a variavel NOTIFY a variavel de escrita com ID 1 do canal de mapeamento será
// publicada no broker. Todas os tópicos subscritos são automaticamente atualizados nas
// variveis associadas quando recebidos do broker.

// Gateway LORA

GTW_LORA(  // LORA_GATEWAY
  //EN          := ,          // [BOOL] Habilitação do bloco
  START       := START,       // [BOOL] Inicia operação do gateway
  //EN_SUBS     := ,          // [BOOL] Habilita subscricao de topicos
  //EN_SCAN     := ,          // [BOOL] Habilita o polling de dados do equipamento remoto
  DMAP_ID     := 2,           // [USINT] Id do mapeamento de dados associado ao bloco
  COMM_SRC    := HILS.SOCK2_PORT_ID,  // [USINT] Canal de comunicação utilizado para acesso equipamento Modbus  (ex: COM1_PORT_ID)
  FLAGS       := HILS.CLIENT_ID + HILS.CLEAN_SECTION,  // [USINT] Flags de conexão com o broker
  //DEC_SEP     := ,          // [USINT] Separador de casas decimais no processo de conversao dos valores reais para string (default = ponto)
  //KEEP_ALIVE  := ,          // [UINT] Tempo em segundos para o broker validadar a conexão
  BROKER_PORT := BROKER_PORT, // [UINT] Porta de escuta do broker
  BROKER_IP   := BROKER_IP,   // [STRING] Endereço IP do broker a ser acessado (string:15)
  W_TOPIC     := WILL_T,      // [STRING] Nome do tópico associado a mensagem de desconexão (string:80)
  W_MSG       := WILL_M,      // [STRING] Mensagem de desconexão (string:140)
  USER        := USER,        // [STRING] Nome do usuário (string:20)
  PASSW       := PASSW,       // [STRING] Senha de acesso (string:16)
  T_CACHE     := T_CACHE      // [ANY] Cache de tópicos a serem enviados para o broker
  );

CONNECTED := GTW_LORA.CONNECTED;
SUBSCRIBED := GTW_LORA.SUBSCRIBED;

// Mantem um contador de tópicos subscritos no broker
IF GTW_LORA.SB_EV THEN
  SB_COUNT := SB_COUNT + 1;
END_IF;

// Mantem um contador de tópicos publicados no broker
IF GTW_LORA.PB_EV THEN
  PB_COUNT := PB_COUNT + 1;
END_IF;

// Mantem um contador de tópicos recebidos do broker
IF GTW_LORA.RT_EV THEN
  RT_COUNT := RT_COUNT + 1;
END_IF;

// Publica a variavel associada ao ID = 1 no broker
IF NOTIFY THEN
  HILS.COMM_NOTIFY_ITEM(1, T_CACHE);
  NOTIFY := FALSE;
END_IF;