Sintaxe de um Modelo JSON

<< 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%+)"

 

Padrão OPC DA

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

QQ

Dois bits de qualidade

SSSS

Quatro bits de sub-status

LL

Dois bits de limite

QQ

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

 

Exemplos de Configuração de Modelos no Formato JSON

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

 

Caso sem Repetição de Leitura por Conjunto

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.

 

Campos do Tipo Lista

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.

 

Conversão de Valores Recebidos como Texto

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

Esta página foi útil?