|
<< Clique para Mostrar o Sumário >>
Sintaxe de um Modelo JSON |
Para extrair ou montar o conteúdo de uma mensagem é necessário declarar um modelo, ou template, que permite informar o formato desta mensagem e quais partes devem ser transformadas em dados. Cada template deve utilizar palavras-chave colocadas no lugar dos valores a serem extraídos. As palavras-chave disponíveis estão descritas na tabela a seguir.
Palavras-chave disponíveis para templates
Palavra-chave |
Descrição |
|---|---|
TS_TEXT(format) |
Estampa de tempo, no formato Texto, que é usada como estampa de tempo de um Tag Bloco ou Tag de Comunicação. O significado de cada campo está descrito na tabela Opções disponíveis para a palavra-chave TS_TEXT |
TS_UNIX |
Estampa de tempo, no formato de segundos desde 1970, ou formato UNIX. Este valor pode ser um número ou um texto, e é usado como estampa de tempo de um Tag Bloco ou Tag de Comunicação, como por exemplo 1504198675 ou "1504198675" |
QL_OPC |
Qualidade, no padrão OPC DA, utilizando 1 (um) byte. Este valor é usado diretamente como valor de qualidade em um Tag Bloco ou Tag de Comunicação, sem transformações. Para mais informações, consulte a tabela Padrão OPC DA |
QL_BOOL |
Qualidade, no padrão Booleano. Se este valor é maior que 0 (zero) ou a expressão "true" ou "TRUE", a qualidade é boa. Se o valor é igual a 0 (zero) ou a expressão "false" ou "FALSE", a qualidade é ruim |
E3VAL |
Especifica um valor que é extraído na sequência que ocorre para um Tag Bloco, cada valor em um Elemento de Bloco. Se há apenas um valor E3VAL em uma mensagem, o template também pode ser usado com um Tag de Comunicação. Valores recebidos como texto podem ser convertidos em número, conforme a seção Conversão de Valores Recebidos como Texto. Esta palavra-chave dentro de um array declara um campo do tipo Lista, conforme a seção Campos do Tipo Lista |
DUMMY |
Campo variável, mas cujo valor não deve ser enviado para Tags de Comunicação |
Repeat_E3VAL |
Palavra-chave que só pode ser usada dentro de um array no formato JSON para indicar que os elementos repetidos dentro deste array devem ser processados de forma independente por este Driver, retornando uma leitura para cada conjunto. Um template pode ter esta palavra-chave apenas uma vez |
Opções disponíveis para a palavra-chave TS_TEXT
Opção |
Descrição |
|---|---|
%a |
Dia da semana abreviado, em inglês |
%A |
Dia da semana completo, em inglês |
%b |
Mês abreviado, em inglês |
%B |
Mês completo, em inglês |
%C |
Século |
%d |
Dia do mês, começando com 0 (zero) |
%e |
Dia do mês, começando com um espaço |
%f |
Milissegundos, de 0 (zero) a 999 |
%h |
Hora, no formato de 12 horas |
%H |
Hora, no formato de 24 horas |
%m |
Mês |
%M |
Minuto |
%p |
AM ou PM |
%S |
Segundos |
%y |
Ano com dois dígitos |
%Y |
Ano com quatro dígitos |
%Z |
Nome do fuso horário, um código internacional que transforma o horário para o formato GMT (Greenwich Mean Time) |
%+ |
Deslocamento ou offset do horário GMT no formato ±HH:MM |
O código a seguir contém exemplos de estampas de tempo formatados pela palavra-chave TS_TEXT.
"2014-07-11T15:26:37Z" -> "TS_TEXT(%y-%m-%dT%H:%M:%SZ)"
"Mon Jul 10 11:04:47 BRT 2017" -> "TS_TEXT(%a %b %d %H:%M:%S %Z %Y)"
"2018-05-02T10:29:28.622-02:00" -> "TS_TEXT(%Y-%m-%dT%H:%M:%S.%f%+)"
Bit |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
Descrição |
Q |
Q |
S |
S |
S |
S |
L |
L |
Opções disponíveis para o padrão OPC DA
Opção |
Descrição |
|---|---|
Dois bits de qualidade |
|
SSSS |
Quatro bits de sub-status |
LL |
Dois bits de limite |
Os valores possíveis são 0: BAD, 1: UNCERTAIN ou 3: GOOD |
|
SSSS |
Os valores possíveis são 0: BAD_NONSPECIFIC, 1: BAD_CONFIGERROR, 2: BAD_NOTCONNECTED, 3: BAD_DEVICEFAILURE ou 4: BAD_SENSORFAILURE |
SSSS |
Os valores possíveis são 0: UNCERT_NONSPECIFIC, 1: UNCERT_LASTUSABLEVALUE ou 4: UNCERT_SENSORNOTACCURATE |
SSSS |
Os valores possíveis são 0: GOOD_NONSPECIFIC, 1: GOOD_LOCALOVERRIDE ou 6: GOOD_NONSPECIFICLOCALTIMESTAMP |
LL |
Os valores possíveis são 0: FREE, 1: LOW, 2: HIGH ou 3: CONST |
Um arquivo no formato JSON contendo um array com múltiplos conjuntos de dados deve incluir a palavra-chave Repeat_E3VAL no template imediatamente após o colchete que inicia este array, conforme o exemplo a seguir.
{
"MessageType":"DUMMY",
"TagData": [
Repeat_E3VAL {
"Temperature": "E3VAL",
"Humidity": "E3VAL"
}
],
"MessageDesc": "DUMMY"
}
Neste caso, ao receber uma mensagem com 2 (dois) conjuntos de dados, por exemplo, o evento OnRead de um Tag Bloco é disparado para cada conjunto, como mostrado no código a seguir.
Sub [Sensor-001_OnRead]()
Application.Trace Item("Temperature").Value
Application.Trace Item("Humidity").Value
End Sub
Se outros valores do tipo E3VAL são declarados antes ou depois de um valor do tipo Repeat_E3VAL, estes são replicados para cada conjunto, com o valor do tipo Repeat_E3VAL sempre como o último valor no Tag Bloco de recebimento, como no exemplo a seguir.
{
"MessageType": "E3VAL",
"TagData": [
Repeat_E3VAL {
"Temperature": "E3VAL",
"Humidity": "E3VAL"
}
],
"MessageDesc": "E3VAL"
}
Um Tag Bloco com os Elementos de Bloco Tipo, Descrição, Temperatura e Umidade pode gerar, a cada evento OnRead, valores como no código a seguir.
"Teste";"Descrição";11;12 => Primeiro evento OnRead
"Teste";"Descrição";14;66 => Segundo evento OnRead
"Teste";"Descrição";70;55 => Terceiro evento OnRead
Se não há necessidade de disparar um evento OnRead para cada conjunto, um template pode ser declarado sem um valor do tipo Repeat_E3VAL, usando apenas uma palavra-chave do tipo E3VAL para capturar o array, conforme o exemplo a seguir.
{
"MessageType": "DUMMY",
"TagData": "E3VAL",
"MessageDesc":"DUMMY"
}
Nesse caso, o array recebido é expandido com base na quantidade de elementos, resultando em uma única leitura no evento OnRead, no formato do exemplo a seguir.
array(11, 12); array(14, 66); array(70, 55) => Evento OnRead único
Se um template contém mais de uma palavra-chave do tipo E3VAL, ou seja, não DUMMY, este array não é expandido, conforme o exemplo a seguir.
{
"MessageType": "E3VAL",
"TagData": "E3VAL",
"MessageDesc": "E3VAL"
}
Esta leitura é realizada em um único evento OnRead, no formato do exemplo a seguir.
"Teste"; array(array(11, 12), array(14, 66), array(70, 55)); "Descrição"=> Evento OnRead único
NOTA |
O corpo de uma requisição é montado no formato UTF-8, como o formato JSON exige, e a resposta também é interpretada no formato UTF-8. Valores com acentos podem ser usados normalmente nos Elementos de Bloco. |
Um campo do corpo de uma requisição pode ser declarado como uma lista, utilizando a palavra-chave E3VAL dentro de um array, conforme o exemplo a seguir.
{
"canais": ["E3VAL"],
"id": "E3VAL"
}
Este modelo tem dois Elementos de Bloco, o primeiro corresponde ao campo canais e o segundo ao campo id. Um campo declarado como lista consome um único Elemento de Bloco, e o valor escrito neste Elemento define o conteúdo desta lista, conforme a tabela a seguir.
Exemplos de preenchimento de um campo do tipo Lista
Valor escrito em um Elemento de Bloco |
Campo enviado em uma requisição |
|---|---|
"1/1" |
"canais": ["1/1"] |
array("1/1", "2/2") |
"canais": ["1/1", "2/2"] |
NOTA |
Não utilize mais de uma palavra-chave dentro de um mesmo array, como por exemplo ["E3VAL", "E3VAL"], porque todas as posições correspondem ao mesmo campo e o último valor escrito substitui os anteriores. Para enviar uma lista de objetos, utilize a palavra-chave Repeat_E3VAL. |
Quando o valor extraído por uma palavra-chave E3VAL chega como texto, ou seja, entre aspas no formato JSON, este Driver converte este valor para um número somente se o texto inteiro é um número, ou seja, apenas dígitos, opcionalmente um sinal negativo no início e no máximo um separador decimal, que pode ser ponto ou vírgula. Qualquer outro texto, mesmo formado só por dígitos, pontos ou hifens, como por exemplo um endereço IP ou uma data, é entregue a um Tag exatamente como foi recebido. Esta regra também vale para os valores dentro de arrays e objetos, e também para os Tags de Caminho JSON.
Exemplos de conversão de valores recebidos como texto
Valor Recebido |
Valor Entregue a um Tag |
|---|---|
"123" |
Número 123 |
"-1,5" |
Número -1,5 (a vírgula é aceita como separador decimal) |
"192.168" |
Número 192,168 |
"007" |
Número 7 (sete) |
"192.168.17.30" |
Texto 192.168.17.30 (endereço IP com mais de um separador) |
"2025-12-22" |
Texto 2025-12-22 (data com sinal fora do início) |
"10-20" |
Texto 10-20 |