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_COMM_SRC |
IN |
USINT |
— |
0 |
ver canais COMM |
Canal de comunicação utilizado 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 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.: |
CEL_PORT |
IN_OUT |
STRING |
:* |
— |
— |
Porta de escuta do broker. Ex.: |
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_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 |
|---|---|---|
|
0 .. 7 |
Seriais |
|
8 .. 15 |
Ethernet 1 |
|
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_CACHEeMDB_CACHEfornecidos como vetores deINT.
Observações
A entrada
STARTdeve 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;