MQTT_PUBLISH
Publica (PUBLISH) um tópico e sua mensagem em um broker MQTT, através de um
socket configurado como cliente TCP/IP com protocolo MQTT. É um bloco de
função (requer instância) e opera em conjunto com MQTT_CONTROLLER: só deve
ser ativado depois que a saída CONNECTED do controlador estiver ativa. Faz
parte da biblioteca de comunicação MQTT (V1.3.1).
Biblioteca: HI_STD · Namespace: HILS · Tipo: bloco de função
Bloco de função
MQTT_PUBLISH
+------------------+
BOOL ----|START DONE_EV|---- BOOL
| |
USINT ----|COMM_SRC RESULT|---- INT
| |
BOOL ----|RETAIN |
| |
USINT ----|QOS |
| |
STRING ----|TOPIC ----------- |----
| |
STRING ----|MESSAGE --------- |----
+------------------+
Opera em conjunto com MQTT_CONTROLLER e só deve ser ativado após a saída
CONNECTED do controlador estar ativa. Nessa condição, o processo é iniciado
ativando a entrada START, que deve permanecer em TRUE durante toda a publicação.
Parâmetros
Nome |
Direção |
Tipo |
Padrão |
Faixa / Unidade |
Descrição |
|---|---|---|---|---|---|
START |
IN |
BOOL |
FALSE |
— |
Inicia a publicação (transição de subida); mantenha TRUE durante todo o processo. |
COMM_SRC |
IN |
USINT |
0 |
|
Canal de comunicação: identificador do socket do broker ( |
RETAIN |
IN |
BOOL |
FALSE |
— |
Notifica o broker para reter a mensagem publicada (entregue a quem assinar o tópico depois). |
QOS |
IN |
USINT |
0 |
|
Quality of Service da publicação (0, 1 ou 2). |
TOPIC |
IN_OUT |
STRING |
— |
= 80 caracteres |
Nome do tópico a publicar. Nomes com mais de 80 caracteres geram erro |
MESSAGE |
IN_OUT |
STRING |
— |
— |
Mensagem (valor) associada ao tópico publicado. |
DONE_EV |
OUT |
BOOL |
FALSE |
— |
Pulso ao final do processo (conclusão ou falha). |
RESULT |
OUT |
INT |
0 |
RET_CODE |
Código de retorno da publicação (ver Códigos de retorno). |
Códigos de retorno
RESULT é do tipo RET_CODE (use os identificadores com o namespace HILS).
Códigos mais comuns deste bloco:
Código |
Identificador |
Significado |
|---|---|---|
0 |
SUCCESS |
Tópico publicado com sucesso. |
28 |
RE_FIL_OVF |
Nome do tópico excede 80 caracteres (overflow no preenchimento do buffer). |
10 |
GL_CMD_TMO |
Timeout na execução do comando. |
63 |
CO_CONEX_FAIL |
Falha no processo de conexão com o broker. |
67 |
CO_SOCK_ERR |
Erro de socket (não foi possível adquirir/usar o socket). |
Pré-condições
O socket usado (
COMM_SRC) deve estar previamente configurado como cliente TCP/IP sem conexão automática, protocolo MQTT, com cache de dados de no mínimo 500 bytes (máx. 1460).A conexão com o broker deve estar estabelecida: ative
STARTsomente apósMQTT_CONTROLLER.CONNECTED.
Observações
DONE_EVgera um pulso no encerramento do processo; leiaRESULTnesse instante.QOSsuporta 0, 1 e 2 (default 0).RETAINfaz o broker guardar a última mensagem do tópico para novos assinantes.
Ver também
Exemplo
Clique aqui para baixar a tabela de variáveis
Código ST
VAR
BROKER_IP : STRING := '192.168.0.58'; (* IP do Broker *)
BROKER_PORT : UDINT := 1883; (* porta de escuta do broker *)
MQTT_CT : HILS.MQTT_CONTROLLER; (* bloco de controle do protocolo MQTT *)
START : BOOL := 1; (* Habilita protocolo *)
REC_TOPIC : STRING; (* Nome do tópico recebido do broker *)
REC_MSG : STRING; (* Mensagem assocada ao tópico recebido do broker *)
WILL : STRING; (* WILL message de conexão *)
USER : STRING; (* Usuario e senha de conexao *)
MQTT_PUB : HILS.MQTT_PUBLISH; (* bloco de publicação do protocolo MQTT *)
PUB_ITEM : BOOL := FALSE; (* Flag para publicar um item *)
PUB_TOPIC : STRING := 'temp'; (* nome do tópico a ser publicado *)
PUB_MSG : STRING := '123.oC'; (* valor do tópico a ser publicado *)
MQTT_SUB : HILS.MQTT_SUBSCRIBE; (* bloco de assinatura do protocolo MQTT *)
SUB_TOPIC : STRING := 'temp'; (* nome do tópico a ser assinado *)
END_VAR
(* Este código abre conexão com o broker MQTT, assina o tópico 'temp' e, a cada
ativação de PUB_ITEM, publica o tópico 'temp' com valor '123.oC'. Como o tópico
publicado tem o mesmo nome do assinado, após a publicação ele é recebido do broker. *)
(* Abre uma conexão (Clean session com Keep Alive = 5 min) *)
MQTT_CT(
START := START,
COMM_SRC := HILS.SOCK1_PORT_ID,
BROKER_IP := BROKER_IP,
BROKER_PORT := BROKER_PORT,
WILL_P := WILL,
USER_P := USER,
BROKER_TOPIC := REC_TOPIC,
BROKER_MSG := REC_MSG
);
(* Assim que a conexão for realizada, assina um tópico *)
MQTT_SUB(
START := MQTT_CT.CONNECTED,
COMM_SRC := HILS.SOCK1_PORT_ID,
TOPIC := SUB_TOPIC
);
IF MQTT_CT.TOP_EV THEN
(* Tratar aqui o tópico recebido do broker *)
END_IF;
IF PUB_ITEM THEN
MQTT_PUB(
START := PUB_ITEM,
COMM_SRC := HILS.SOCK1_PORT_ID,
RETAIN := FALSE,
QOS := 0,
TOPIC := PUB_TOPIC,
MESSAGE := PUB_MSG
);
IF MQTT_PUB.DONE_EV THEN
PUB_ITEM := FALSE;
END_IF;
END_IF;