Suporte para repetição de objetos dentro de arrays em Driver MQTT.

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:

  1. {
  2. "MessageType": "TagValues",
  3. "WagoProtocol": "1.5.0",
  4. "CollectionId": 0,
  5. "TagData": [
  6. {
  7. "Time": "2021-08-02T13:35:03.442-3:00",
  8. "Values": {
  9. "OEE": 0.11999999731779099,
  10. "Disponibilidade": 3.4100000858306885,
  11. "Performace": 3.4100000858306885,
  12. "Qualidade": 99.680000305175781,
  13. "Produtos Produzidos": 929,
  14. "Produtos Rejeitados": 3
  15. }
  16. }
  17. ]
  18. }
{
  "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:

  1. {
  2. "MessageType": "TagValues",
  3. "WagoProtocol": "1.5.0",
  4. "CollectionId": 0,
  5. "TagData": [
  6. {
  7. "Time": "2021-08-02T13:35:08.442-3:00",
  8. "Values": {
  9. "OEE": 0.11999999731779099,
  10. "Disponibilidade": 3.4300000667572021,
  11. "Performace": 3.4300000667572021,
  12. "Qualidade": 99.680000305175781,
  13. "Produtos Produzidos": 934,
  14. "Produtos Rejeitados": 3
  15. }
  16. },
  17. {
  18. "Time": "2021-08-02T13:35:13.442-3:00",
  19. "Values": {
  20. "OEE": 0.11999999731779099,
  21. "Disponibilidade": 3.4500000476837158,
  22. "Performace": 3.4500000476837158,
  23. "Qualidade": 99.680000305175781,
  24. "Produtos Produzidos": 939,
  25. "Produtos Rejeitados": 3
  26. }
  27. },
  28. {
  29. "Time": "2021-08-02T13:35:18.443-3:00",
  30. "Values": {
  31. "OEE": 0.11999999731779099,
  32. "Disponibilidade": 3.4700000286102295,
  33. "Performace": 3.4700000286102295,
  34. "Qualidade": 99.680000305175781,
  35. "Produtos Produzidos": 944,
  36. "Produtos Rejeitados": 3
  37. }
  38. }
  39. ]
  40. }
{
  "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.

  1. {
  2. "MessageType": "DUMMY",
  3. "WagoProtocol": "1.5.0",
  4. "CollectionId": "DUMMY",
  5. "TagData": [
  6. Repeat_E3VAL{
  7. "Time": "TS_TEXT(%Y-%m-%dT%H:%M:%S.%f%+)",
  8. "Values": {
  9. "OEE": "E3VAL",
  10. "Disponibilidade": "E3VAL",
  11. "Performace": "E3VAL",
  12. "Qualidade": "E3VAL",
  13. "Produtos Produzidos": "E3VAL",
  14. "Produtos Rejeitados": "E3VAL"
  15. }
  16. }
  17. ]
  18. }
{
  "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:

  1. faz uma cópia dos valores que ele possui até ali,
  2. insere como um elemento de outro conjunto de valores,
  3. 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.

 

Artigos Relacionados:


Print Friendly, PDF & Email

Este artigo foi útil? Was this helpful?

Classificação média - Average rating 0 / 5. Count: 0

Leave a Reply

Your email address will not be published.Required fields are marked *