<< Clique para Mostrar o Sumário >> Template JSON |
JSON (JavaScript Object Notation) é um formato de troca de dados de fácil compreensão para humanos, e também simples para que programas realizem o processamento e extração de informações. O formato JSON é construído sobre uma coleção de pares contendo nome e valor e uma lista ordenada destes pares.
Um Objeto é uma lista não ordenada de pares de nomes e valores. Um objeto é delimitado por chaves, cada nome é definido dentro de aspas duplas seguido por dois pontos e o respectivo valor, e cada par é separado por vírgulas.
Um Array é uma lista ordenada de valores. Um array é delimitado por colchetes e os valores são separados por vírgulas. Valores podem ser números ou textos, que devem ser representados entre aspas duplas. O código a seguir contém um exemplo de uma mensagem no formato JSON.
{"s":1, "t":"2014-07-11T15:26:37Z", "q":192,"c":1, "x":-1.234,"y":0.234, "z":-0.234}
O código a seguir contém um possível Template para extrair o conteúdo da mensagem anterior.
{"s":"DUMMY", "t":"TS_TEXT(%y-%m-%dT%H:%M:%SZ)","q":"QL_OPC", "c":"DUMMY", "x":"E3VAL","y":"E3VAL", "z":"E3VAL"}
Neste caso, deve ser criado um Tag Bloco com três Elementos de Bloco, e cada Elemento de Bloco recebe um dos valores x, y e z, respectivamente.
O código a seguir contém outro exemplo de mensagem no formato JSON.
{
"n_channels":2,
"timestamp":1504198675,
"hash":"1842E0F97392F08BDF996961A8333832AB06D113",
"battery":5.13,
"gmt":-3,
"tag_channels":["Analog1","Analog2"],
"value_channels":[28.100,27.200],
"tag_units":["°C","°C"],
"alarm_low":[0,0],
"alarm_high":[0,0],
"buzzer_state":0
}
O código a seguir contém um possível Template para o exemplo anterior.
{
"n_channels":"DUMMY",
"timestamp":"TS_UNIX",
"hash":"DUMMY",
"battery":"V1",
"gmt":"V2",
"tag_channels":["V3","V4"],
"value_channels":["V5","V6"],
"tag_units":["V7","V8"],
"alarm_low":["V9","V10"],
"alarm_high":["V11","V12"],
"buzzer_state":"V13"
}
OBSERVAÇÃO |
Tanto mensagens quanto Templates devem ser objetos ou arrays, portanto devem começar com um caractere de chaves ({) ou colchetes ([), respectivamente. |
Os arrays podem ser usados para receber um número variável de elementos. Os códigos a seguir mostram exemplos de mensagens.
Mensagem 1 (um):
{
"MessageType": "Teste",
"TagData": [
{
"Temperature": 11,
"Humidity": 50
},
{
"Temperature": 14,
"Humidity": 80
}
]
}
Mensagem 2 (dois):
{
"MessageType": "Teste",
"TagData": [
{
"Temperature": 11,
"Humidity": 12
},
{
"Temperature": 14,
"Humidity": 66
}
{
"Temperature": 70,
"Humidity": 55
}
]
}
Dentro do array é possível ter 1 (um), 2 (dois), 3 (três) ou n conjuntos de temperatura e umidade em uma única mensagem, e seria interessante se um Tag Bloco "Teste" com dois Elementos, Temperature e Humidity, pudesse receber uma leitura a cada conjunto.
Para isto, declare o Template com uma palavra-chave Repeat_E3VAL imediatamente após o colchete que marca o início do array, como no exemplo a seguir.
{"MessageType":"DUMMY","TagData":[Repeat_E3VAL{"Temperature":"E3VAL","Humidity":"E3VAL"}]}
Desta forma, ao receber a mensagem 2 (dois), por exemplo, tem-se uma chamada do evento OnRead do Tag Bloco para cada conjunto, conforme o exemplo a seguir.
Sub [Sensor-001_OnRead]()
Application.Trace Item("Temperatura").Value
Application.Trace Item("Umidade").Value
End Sub
Exemplo de log:
910 2021-08-05 10:06:15.826 0x3FF8 0x3210 APPTRACE 11 14
911 2021-08-05 10:06:15.826 0x3FF8 0x3210 APPTRACE 12 14
912 2021-08-05 10:06:15.826 0x3FF8 0x3210 APPTRACE 14 14
913 2021-08-05 10:06:15.826 0x3FF8 0x3210 APPTRACE 66 14
914 2021-08-05 10:06:15.826 0x3FF8 0x3210 APPTRACE 70 14
915 2021-08-05 10:06:15.826 0x3FF8 0x3210 APPTRACE 55 14
Ao declarar mais valores E3VAL antes da posição de repetição, estes valores são repetidos para cada conjunto. Como exemplo, para um Template declarado conforme o código a seguir:
{"MessageType":"E3VAL","TagData":[Repeat_E3VAL{"Temperature":"E3VAL","Humidity":"E3VAL"}]}
Pode-se ter um Tag Bloco com 3 (três) Elementos, tipo, temperatura e umidade, e seriam recebidos os valores a seguir a cada evento OnRead.
"Teste";11;12 ' => primeiro OnRead
"Teste";14;66 ' => segundo OnRead
"Teste";70;55 ' => terceiro OnRead