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_COMM_SRC |
IN |
USINT |
— |
0 |
0 .. 23 |
Canal de comunicação usado para acesso ao equipamento MODBUS (ex.: |
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_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.
STARTmantido 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_ID0 .. 7
SOCK0_PORT_ID..SOCK7_PORT_ID8 .. 15
ETH2_SOCK0_PORT_ID..ETH2_SOCK7_PORT_ID16 .. 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;