Este artigo apresenta um exemplo para suporte a repetição de objetos dentro de arrays em um Driver MQTT.
Descrição:
Normalmente os controladores enviam mensagens em um tópico específico, conforme exemplo abaixo:
{"MessageType":"TagValues","WagoProtocol":"1.5.0","CollectionId":0,"TagData":[{"Time":"2021-08-02T13:35:03.442-3:00","Values":{"OEE":0.11999999731779099,"Disponibilidade":3.4100000858306885,"Performace":3.4100000858306885,"Qualidade":99.680000305175781,"Produtos Produzidos":929,"Produtos Rejeitados":3}}]}
Porém, alguns controladores possuem uma espécie de buffer, e ao perder conexão com a base, acumulam mensagens localmente. Neste exemplo, na primeira mensagem pós reconexão, será enviado no mesmo tópico a seguinte mensagem:
{"MessageType":"TagValues","WagoProtocol":"1.5.0","CollectionId":0,"TagData":[{"Time":"2021-08-02T13:35:08.442-3:00","Values":{"OEE":0.11999999731779099,"Disponibilidade":3.4300000667572021,"Performace":3.4300000667572021,"Qualidade":99.680000305175781,"Produtos Produzidos":934,"Produtos Rejeitados":3}},{"Time":"2021-08-02T13:35:13.442-3:00","Values":{"OEE":0.11999999731779099,"Disponibilidade":3.4500000476837158,"Performace":3.4500000476837158,"Qualidade":99.680000305175781,"Produtos Produzidos":939,"Produtos Rejeitados":3}},{"Time":"2021-08-02T13:35:18.443-3:00","Values":{"OEE":0.11999999731779099,"Disponibilidade":3.4700000286102295,"Performace":3.4700000286102295,"Qualidade":99.680000305175781,"Produtos Produzidos":944,"Produtos Rejeitados":3}}]}
No exemplo acima, três mensagens foram acumuladas.
Solução:
A partir da versão 1.0.25 do Driver Elipse MQTT, na declaração do template, é possível inserir uma palavra chave Repeat_E3VAL logo após o colchete que representa o array, no qual um objeto poderá se repetir. Assim, é possível a repetição de objetos em um driver MQTT.
A inserção dessa palavra torna o JSON inválido, mas o driver remove essa keyword e “marca” onde ela foi posicionada; aí sim ele passa a usar o template.
{"MessageType":"DUMMY","WagoProtocol":"1.5.0","CollectionId":"DUMMY","TagData":[Repeat_E3VAL{"Time":"TS_TEXT(%Y-%m-%dT%H:%M:%S.%f%+)","Values":{"OEE":"E3VAL","Disponibilidade":"E3VAL","Performace":"E3VAL","Qualidade":"E3VAL","Produtos Produzidos":"E3VAL","Produtos Rejeitados":"E3VAL"}}]}
Sendo assim, após o driver ter processado cada elemento de um array cujos elementos podem se repetir, o driver:
- faz uma cópia dos valores que ele possui até ali,
- insere como um elemento de outro conjunto de valores,
- e continua a processar o próximo elemento que vai copiar “por cima” dos valores do primeiro item, o que houver no segundo.
Se o template declarar um ou mais E3VAL antes do ponto de repetição, cada conjunto vai repetir esses valores até ali.
Desta forma, se houverem 10 conjuntos dentro do array, o resultado será um conjunto de valores com 10 valores dentro, isso é repassado para o bloco/tag no E3, e o evento OnRead será chamado 10 vezes, um para cada conjunto.