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

8 .. 15 (socket)

Canal de comunicação: identificador do socket do broker (HILS.SOCK0_PORT_ID .. SOCK7_PORT_ID = 8..15).

RETAIN

IN

BOOL

FALSE

—

Notifica o broker para reter a mensagem publicada (entregue a quem assinar o tópico depois).

QOS

IN

USINT

0

0 .. 2

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 RE_FIL_OVF (28).

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 START somente após MQTT_CONTROLLER.CONNECTED.

Observações

  • DONE_EV gera um pulso no encerramento do processo; leia RESULT nesse instante.

  • QOS suporta 0, 1 e 2 (default 0). RETAIN faz o broker guardar a última mensagem do tópico para novos assinantes.

Ver também

MQTT_CONTROLLER, MQTT_SUBSCRIBE

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;