<< 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 duas estruturas, 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. 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}
Para extrair o conteúdo da mensagem anterior, um possível Template seria o seguinte:
{"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
}
Um possível Template para o exemplo anterior seria o seguinte:
{
"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 a mensagem como os templates devem ser objetos ou arrays, portanto devem começar com um { ou [.
Repetição de Valores
Os arrays podem ser usados para receber um número variável de elementos. Vamos tomar como exemplo as mensagens abaixo:
Mensagem 1:
{
"MessageType": "Teste",
"TagData": [
{
"Temperature": 11,
"Humidity": 50
},
{
"Temperature": 14,
"Humidity": 80
}
]
}
Mensagem 2:
{
"MessageType": "Teste",
"TagData": [
{
"Temperature": 11,
"Humidity": 12
},
{
"Temperature": 14,
"Humidity": 66
}
{
"Temperature": 70,
"Humidity": 55
}
]
}
Vejam que dentro do array, é possível que tenhamos 1, 2, 3 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, devemos declarar o template com uma keyword Repeat_E3VAL imediatamente após o colchete que marca o ínicio do array. Exemplo:
{"MessageType":"DUMMY","TagData":[Repeat_E3VAL{"Temperature":"E3VAL","Humidity":"E3VAL"}]}
Desta forma, ao recebermos a mensagem 2, por exemplo, teremos uma chamada do evento OnRead do bloco para cada conjunto. Exemplo:
Sub [Sensor-001_OnRead]()
Application.Trace Item("Temperatura").Value
Application.Trace Item("Umidade").Value
End Sub
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
Caso tivessem sido declarados mais valores E3VAL antes da posição de repetição, esses valores seriam repetidos para cada conjunto. Como exemplo, se tivéssemos declarado o template como
{"MessageType":"E3VAL","TagData":[Repeat_E3VAL{"Temperature":"E3VAL","Humidity":"E3VAL"}]}
poderíamos ter o bloco com 3 elementos (Type, Temperatura e Umidade), sendo que receberiamos os seguintes valores a cada evento OnRead:
"Teste";11;12 '=> primeiro OnRead
"Teste";14;66 ' => segundo OnRead
"Teste";70;55 '=> terceiro OnRead