MQTT_MDB_BRIDGE
Implementa uma bridge de comunicação entre os protocolos MODBUS e MQTT, permitindo subscrever e publicar tópicos MQTT em um broker e sincronizar seus valores com equipamentos MODBUS remotos; exige canais de mapeamento (DataMap) previamente configurados e associados a variáveis globais exportadas. É um bloco de função (mantém estado entre scans; requer instância). Tópicos podem ser publicados automaticamente por critério de tempo ou de alteração de valor.
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.
Dica
Assista ao vídeo tutorial utilizando o bloco de função para aplicações envolvendo os protocolos MQTT e MODBUS: Tutorial MQTT_MDB_BRIDGE
Bloco de função
MQTT_MDB_BRIDGE
+--------------------------------+
BOOL ----|START MDB_BRT_EV|---- BOOL
| |
USINT ----|MDB_MAP_ID MDB_END_CYC|---- BOOL
| |
BOOL ----|MDB_EN_SCAN MDB_RD_EV|---- BOOL
| |
BOOL ----|MDB_SKIP_RD MDB_RD_CHG|---- BOOL
| |
USINT ----|MDB_COMM_SRC MDB_RD_ID|---- INT
| |
TIME ----|MDB_POLL_TME MDB_RD_CID|---- INT
| |
TIME ----|MDB_PACK_TME MDB_RD_CODE|---- INT
| |
USINT ----|MQTT_MAP_ID MDB_WR_EV|---- BOOL
| |
USINT ----|MQTT_COMM_SRC MDB_WR_ID|---- INT
| |
UINT ----|MQTT_FLAGS MDB_WR_CID|---- INT
| |
USINT ----|MQTT_DEC_SEP MDB_WR_CODE|---- INT
| |
BOOL ----|MQTT_HI_GATE MDB_CHG_EV|---- INT
| |
UINT ----|MQTT_KEEP_ALIVE MDB_ITEM_ID|---- INT
| |
UINT ----|MQTT_BROKER_PORT 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|---- BOOL
| |
| MQTT_RT_ID|---- INT
| |
| MQTT_RT_CODE|---- INT
| |
| MQTT_CHG_EV|---- BOOL
| |
| MQTT_CONN|---- BOOL
| |
| MQTT_TOPIC_ID|---- INT
| |
STRING ----|MQTT_BROKER_IP ---------------- |----
| |
STRING ----|MQTT_CLIENT_ID ---------------- |----
| |
STRING ----|MQTT_W_TOPIC ------------------ |----
| |
STRING ----|MQTT_W_MSG -------------------- |----
| |
STRING ----|MQTT_USER --------------------- |----
| |
STRING ----|MQTT_PASSW -------------------- |----
| |
INT ----|MDB_CACHE --------------------- |----
| |
INT ----|MQTT_CACHE -------------------- |----
+--------------------------------+
Para utilização deste bloco, o usuário deverá, usando o recurso de Mapeamento de dados, criar um canal de mapeamento associado ao protocolo MQTT (definindo os tópicos a subscrever e a publicar) e um canal de mapeamento associado ao protocolo MODBUS (definindo os itens a ler e a escrever remotamente). Todos os tópicos e itens criados devem estar associados a variáveis globais exportadas.
Importante
Para a utilização desse bloco, o socket utilizado para acesso ao broker MQTT deve ser previamente configurado para operação como cliente TCP/IP (sem conexão automática) com protocolo MQTT, e o tamanho da cache de dados do socket deve ser de no mínimo 500 bytes (1460 máx.).
Caso possua dúvidas sobre como configurar o socket assista ao tutorial: Configurando recursos de conectividade do equipamento
Importante
Os canais de comunicação utilizados para acesso aos equipamentos MODBUS 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 a serem acessados.
Parâmetros
Nome |
Direção |
Tipo |
Dimensão |
Padrão |
Faixa / Unidade |
Descrição |
|---|---|---|---|---|---|---|
START |
IN |
BOOL |
— |
FALSE |
— |
Inicia a operação do gateway. Quando inativa, o bloco permanece desconectado do broker e os tópicos não são publicados nem mantidos em cache. |
MDB_MAP_ID |
IN |
USINT |
— |
0 |
— |
Id do mapeamento de dados (DataMap) associado ao protocolo MODBUS. |
MDB_EN_SCAN |
IN |
BOOL |
— |
TRUE |
— |
Habilita o polling de dados dos equipamentos MODBUS remotos. |
MDB_SKIP_RD |
IN |
BOOL |
— |
FALSE |
— |
Quando habilitada imediatamente após um evento |
MDB_COMM_SRC |
IN |
USINT |
— |
0 |
canal COMM |
Canal de comunicação utilizado para acesso ao equipamento MODBUS (ex.: |
MDB_POLL_TME |
IN |
TIME |
— |
T#20ms |
— |
Tempo entre um ciclo de comunicação. |
MDB_PACK_TME |
IN |
TIME |
— |
T#10ms |
— |
Tempo entre pacotes de comunicação. |
MQTT_MAP_ID |
IN |
USINT |
— |
0 |
— |
Id do mapeamento de dados (DataMap) associado ao protocolo MQTT. |
MQTT_COMM_SRC |
IN |
USINT |
— |
0 |
canal COMM |
Canal de comunicação utilizado para acesso ao broker (ex.: |
MQTT_FLAGS |
IN |
UINT |
— |
8 |
— |
Flags de conexão com o broker. |
MQTT_DEC_SEP |
IN |
USINT |
— |
46 |
cód. ASCII |
Separador de casas decimais na conversão de valores 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_KEEP_ALIVE |
IN |
UINT |
— |
300 |
s |
Tempo, em segundos, para o broker validar a conexão. |
MQTT_BROKER_PORT |
IN |
UINT |
— |
1883 |
porta TCP |
Porta de escuta do broker. |
MQTT_BROKER_IP |
IN_OUT |
STRING |
:* |
— |
— |
Endereço IP do broker a ser acessado. |
MQTT_CLIENT_ID |
IN_OUT |
STRING |
:* |
— |
— |
Identificador do cliente (Client ID) MQTT. |
MQTT_W_TOPIC |
IN_OUT |
STRING |
:* |
— |
— |
Nome do tópico associado à mensagem de desconexão (opcional). |
MQTT_W_MSG |
IN_OUT |
STRING |
:* |
— |
— |
Mensagem de desconexão (opcional). |
MQTT_USER |
IN_OUT |
STRING |
:* |
— |
— |
Nome do usuário (opcional). |
MQTT_PASSW |
IN_OUT |
STRING |
:* |
— |
— |
Senha de acesso (opcional). |
MDB_CACHE |
IN_OUT |
INT |
[*] |
0 |
— |
Cache de tópicos a serem enviados para o equipamento MODBUS. |
MQTT_CACHE |
IN_OUT |
INT |
[*] |
0 |
— |
Cache de tópicos a serem enviados para o broker. |
MDB_BRT_EV |
OUT |
BOOL |
— |
FALSE |
— |
Quando ativo, indica que uma nova transação de leitura será iniciada; via |
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 do processo de aquisição de um item no equipamento remoto. |
MDB_RD_CHG |
OUT |
BOOL |
— |
FALSE |
— |
Indica que a variável adquirida é diferente do valor anterior presente na base global. |
MDB_RD_ID |
OUT |
INT |
— |
-1 |
— |
Id do item da última aquisição no equipamento remoto. |
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 (ver Códigos de retorno). |
MDB_WR_EV |
OUT |
BOOL |
— |
FALSE |
— |
Indica o fim do processo de escrita de um item no equipamento remoto. |
MDB_WR_ID |
OUT |
INT |
— |
-1 |
— |
Id do item da última escrita no equipamento remoto. |
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 (ver Códigos de retorno). |
MDB_CHG_EV |
OUT |
INT |
— |
0 |
— |
Pulso que notifica que uma variável lida via MODBUS foi alterada e inserida na cache de publicação do broker. |
MDB_ITEM_ID |
OUT |
INT |
— |
-1 |
— |
Id do tópico a ser publicado no broker por alteração; válido na ocorrência de |
MQTT_SB_EV |
OUT |
BOOL |
— |
FALSE |
— |
Indica o fim do processo de subscribe de um tópico. |
MQTT_SB_ID |
OUT |
INT |
— |
0 |
— |
Id do item do último subscribe. |
MQTT_SB_CODE |
OUT |
INT |
— |
0 |
RET_CODE |
Código de retorno do último subscribe (ver Códigos de retorno). |
MQTT_PB_EV |
OUT |
BOOL |
— |
FALSE |
— |
Indica o fim do processo de publish de um tópico. |
MQTT_PB_ID |
OUT |
INT |
— |
0 |
— |
Id do item do último publish. |
MQTT_PB_CODE |
OUT |
INT |
— |
0 |
RET_CODE |
Código de retorno do último publish (ver Códigos de retorno). |
MQTT_RT_EV |
OUT |
BOOL |
— |
FALSE |
— |
Indica o fim do processo de recepção de um tópico do broker. |
MQTT_RT_CHG |
OUT |
BOOL |
— |
FALSE |
— |
Indica que o tópico recebido é diferente do valor anterior presente na base global. |
MQTT_RT_ID |
OUT |
INT |
— |
0 |
— |
Id do item da última recepção de tópico do broker. |
MQTT_RT_CODE |
OUT |
INT |
— |
0 |
RET_CODE |
Código de retorno da última recepção de tópico do broker (ver Códigos de retorno). |
MQTT_CHG_EV |
OUT |
BOOL |
— |
FALSE |
— |
Pulso que notifica que uma variável recebida via broker MQTT foi alterada e inserida na cache de publicação do gateway MODBUS. |
MQTT_CONN |
OUT |
BOOL |
— |
FALSE |
— |
Indica que o equipamento está conectado ao broker. |
MQTT_TOPIC_ID |
OUT |
INT |
— |
-1 |
— |
Id da variável a ser enviada via MODBUS por alteração; válido na ocorrência de |
Códigos de retorno
As saídas de código (MDB_RD_CODE, MDB_WR_CODE, MQTT_SB_CODE,
MQTT_PB_CODE e MQTT_RT_CODE) reportam o resultado da última transação
correspondente. O valor 0 (SUCCESS / MB_SUCCESS) indica sucesso;
valores diferentes de zero indicam falha. 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. |
79 |
CO_REC_TMO |
Timeout na recepção de frame. |
100 |
MB_SUCCESS |
Comando MODBUS executado com sucesso. |
101 |
MB_ILLEGAL_FUNCTION |
Comando (função) MODBUS ilegal. |
102 |
MB_ILLEGAL_DATA_ADDRESS |
Endereço do dado no comando MODBUS inválido. |
104 |
MB_SLAVE_DEVICE_FAILURE |
Falha na execução do comando pelo equipamento remoto. |
106 |
MB_SLAVE_DEVICE_BUSY |
Equipamento remoto ocupado. |
Lista completa dos códigos de retorno: RET_CODE - Códigos de retorno do firmware G5.
Pré-condições
Canais de mapeamento (Mapeamento de dados) criados e associados aos protocolos MQTT e MODBUS, com tópicos/itens associados a variáveis globais exportadas.
Socket do broker configurado como cliente TCP/IP (sem auto conexão) com protocolo MQTT e cache de dados de no mínimo 500 bytes (1460 máx.).
Canais MODBUS configurados como MODBUS-TCP ou MODBUS-RTU, conforme o equipamento remoto.
Observações
As entradas/saídas deste bloco correspondem aos parâmetros dos blocos MQTT_GATEWAY e MDB_GATEWAY, que a bridge integra internamente.
MDB_CHG_EVeMQTT_CHG_EVsão pulsos com duração de um ciclo de scan que sinalizam a propagação de um valor alterado de um protocolo para o outro.Os canais de comunicação (
MDB_COMM_SRC/MQTT_COMM_SRC) usam os identificadores de porta: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
Exemplo
Clique aqui para baixar a tabela de variáveis
Código ST
VAR
START : BOOL := FALSE; (* Flag para habilitar a bridge *)
BROKER_IP : STRING := '192.168.0.80'; (* IP de escuta do broker *)
BROKER_PORT : UINT := 1883; (* Porta de escuta do broker *)
WILL_T : STRING := 'W_TOPIC'; (* Nome do tópico de WILL *)
WILL_M : STRING := 'W_MSG'; (* Mensagem de WILL *)
USER : STRING := 'JOAO'; (* Usuário de autenticação no broker *)
PASSW : STRING := '123'; (* Senha de autenticação no broker *)
NEW_FROM_MDB : INT := 0; (* Dado alterado pelo broker *)
NEW_FROM_MQTT : INT := 0; (* Dado alterado pelo equipamento remoto *)
CONNECTED : BOOL := FALSE; (* Broker conectado *)
MDB_CACHE : INT := 0; (* Cache para escrita de variaveis modbus *)
MQTT_CACHE : INT := 0; (* Cache para publicação de tópicos *)
BRIDGE : HILS.MQTT_MDB_BRIDGE; (* Bridge MQTT MODBUS *)
END_VAR
VAR_EXTERNAL
GV_ALARME : BOOL := FALSE; (* Alarme de temperatura alta *)
GV_SETPOINT : REAL := 20.00; (* Setpoint para alarme *)
GV_TEMP : REAL := 25.00; (* Temperatura do processo *)
END_VAR
// Este código, após a ativação da entrada START, publica no broker ciclicamente os
// tópicos definidos no canal de mapeamento 2 e le ciclicamente os endereços MODBUS
// definidos no canal de mapeamento 1, enviando as variáveis via o canal MODBUS.
// Bridge MQTT MODBUS
BRIDGE( // MQTT_MDB_BRIDGE
START := START, // [BOOL] Inicia operação do gateway
//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 MDB_BRT_EV
MDB_MAP_ID := 1, // [USINT] Id do mapeamento de dados associado ao protocolo MODBUS
MDB_COMM_SRC := HILS.COM1_PORT_ID, // [USINT] Canal de comunicação para acesso ao equipamento Modbus
//MDB_POLL_TME := , // [TIME] Tempo entre um ciclo de comunicação
//MDB_PACK_TME := , // [TIME] Tempo entre pacotes de comunicação
MDB_CACHE := MDB_CACHE, // [INT] Cache de tópicos a serem enviados para o equipamento MODBUS
MQTT_MAP_ID := 2, // [USINT] Id do mapeamento de dados associado ao protocolo MQTT
MQTT_COMM_SRC := HILS.SOCK2_PORT_ID, // [USINT] Canal de comunicação para acesso ao broker
MQTT_FLAGS := HILS.CLIENT_ID + HILS.CLEAN_SECTION, // [UINT] Flags de conexão com o broker
//MQTT_DEC_SEP := , // [USINT] Separador de casas decimais na conversão de reais para string
//MQTT_KEEP_ALIVE := , // [UINT] Tempo em segundos para o broker validar a conexão
MQTT_BROKER_PORT := BROKER_PORT, // [UINT] Porta de escuta do broker
MQTT_BROKER_IP := BROKER_IP, // [STRING] Endereço IP do broker a ser acessado
MQTT_W_TOPIC := WILL_T, // [STRING] Nome do tópico associado à mensagem de desconexão
MQTT_W_MSG := WILL_M, // [STRING] Mensagem de desconexão
MQTT_USER := USER, // [STRING] Nome do usuário
MQTT_PASSW := PASSW, // [STRING] Senha de acesso
MQTT_CACHE := MQTT_CACHE // [INT] Cache de tópicos a serem enviados para o broker
);