Trabalhando o JSON no TIA PORTAL

(PT) Inscreva-se nesta categoria para obter dicas e truques da plataforma WEGnology.

Como realizar o tratamento de dado recebido via payload Wegnology no TIA PORTAL ?

Exemplo de payload recebido:

‘{“data”:{“LigaMotor”:“1”},“time”:1686010215693}’

Obrigado.

Boa tarde, Thiago!

Percebemos que você já conseguiu enviar dados via “comando”.
É realmente bastante fácil do lado da Plataforma.
Por exemplo, no próprio bloco padrão “Input Controls” você configura o que vai ser enviado:

Em relação ao Tia Portal, não encontrei informação relativa a algum comando próprio estilo “JSON parse”. Mas acredito que, para fazer este "parse" do JSON, no seu plc ,pode ser usada a linguagem estruturada (STL), utilizando as instruções de string:

Segue um exemplo de função utilizando o FIND para identificar os pares JSON.
E depois utiliza o SPLIT para separar a variável do valor.
Verifique se o código rodar bem, ou retorne aqui caso tenha um código com melhorias.

FUNCTION_BLOCK ParseJson
VAR_INPUT
data : STRING;
END_VAR
VAR_OUTPUT
nomesAtributos : ARRAY[1…n] OF STRING;
valoresAtributos : ARRAY[1…n] OF STRING;
END_VAR
VAR
i : INT := 1;
startIndex : INT := 0;
endIndex : INT := 0;
attributeString : STRING;
attributePairs : ARRAY[1…n] OF STRING;
attributeCount : INT := 0;
END_VAR
startIndex := FIND(data, ‘{“data”:{’) + LENGTH(’{“data”:{’);
endIndex := FIND(data, ‘}}’, startIndex) - 1;
attributeString := SUBSTR(data, startIndex, endIndex - startIndex + 1);
attributePairs := SPLIT(attributeString, ‘,’);
FOR i := 1 TO LENGTH(attributePairs) DO
IF i = LENGTH(attributePairs) THEN
endIndex := LENGTH(attributePairs[i]);
ELSE
endIndex := LENGTH(attributePairs[i]) - 1;
END_IF
nomesAtributos[i] := SUBSTR(attributePairs[i], 2, FIND(attributePairs[i], ‘":"’) - 3);
valoresAtributos[i] := SUBSTR(attributePairs[i], FIND(attributePairs[i], ‘":"’) + 3, endIndex);
END_FOR
END_FUNCTION_BLOCK

1 Curtida

Prezado Alexandre, boa tarde.

Obrigado pelo breve retorno.

Tentei realizar a utilização do código, mas sem sucesso. Aparentemente, na versão que estou utilizando não tem todas as funções, como a função SUBSTR, por exemplo. Tive pouco tempo para testar também. Vou tentar mais um pouco e volto a comentar por aqui. (uso TIA PORTAL V17)

Abraços.

Atualizando:

Realizei algumas buscas sobre as funções e suas substituições.
*a função “SPLIT” ainda não consegui configurar corretamente.

código:
#i := 1;
#startIndex := 0;
#endIndex := 0;
#attributeCount := 0;
#rec := ‘,’;
#end := ‘},“time"’;

#startIndex := FIND(IN1 := #data, IN2 := ‘{“data”:{"’) + LEN(’{“data”:{"’);
#endIndex := FIND(IN1 := #data, IN2 := ‘},“time”’)- 1;

#attributeString := MID(IN := #data, P := #startIndex, L := #endIndex - #startIndex + 1);
#ret_Val := SPLIT(Mode := 6, RecSeparator := #rec, EndSeparator := #end,SrcArray := #attributeString, Count => #countPairsTest, DstStruct := #attributePairs, Position := #posSplit);

FOR #i := 1 TO (#countPairsTest) DO
IF #i = #countPairsTest THEN
#endIndex := LEN(#attributePairs[#i]);
ELSE
#endIndex := LEN(#attributePairs[#i]) - 1;
END_IF;

#nomesAtributos[#i] := MID(IN := #attributePairs[#i], L := 2, P := FIND(IN1 := #attributePairs[#i], IN2 := '":"') - 3);
#valoresAtributos[#i] := MID(IN := #attributePairs[#i], L := FIND(IN1 := #attributePairs[#i], IN2 := '":"') + 3, P := #endIndex);

END_FOR;

Podemos criar uma função para substituir este SPLIT.

Segue um exemplo onde ser realiza um Parse

  • Pega-se uma string: #str2Parse
  • Gera um array de 5 elementos: ParsedData.Element[#elementNum]
  • Utilizando o delimitador definido por “;” . Veja na linha: #delimiterPos := FIND(IN1:=#strTemp, IN2:=’;’)
    Tentei inserir o máximo de comentários.

// -----------------------------------------------------------------------------------------------------------

// Reseta para uma string vazia todos os 5 elementos do array de 5 string no DB ParseDataB

FOR #elementNum := 1 TO 5 DO
“ParsedData”.Element[#elementNum] := ‘’;
END_FOR;

// str2Parse é o parâmetro de entrada da função
// Todas as outras variáveis temporárias são Int exceto strTemp que é string

#strLen := LEN(#str2Parse); // Carrega o tamanho da String a ser convertida
#strTemp := #str2Parse; // Carrega a String total para a String temporária
#elementNum := 0; // inicializa apontador

WHILE #strLen > 0 AND #elementNum < 5 DO // Enquanto tiver string e elemento menor que 5
#elementNum := #elementNum + 1; // Incrementa contador
#delimiterPos := FIND(IN1:=#strTemp, IN2:=’;’); // posição do próximo delimitador (ponto e vírgula)
IF #delimiterPos > 0 THEN // se encontrou delimitador, existe elemento para ser extraído
#elementLen := #delimiterPos - 1; // Ajusta tamanho do elemento a ser extraído
“ParsedData”.Element[#elementNum] := LEFT(IN:=#strTemp, L:=#elementLen); // extrai o elemento
#restLen := #strLen - #delimiterPos; // contabiliza quantos caracteres retam na string total
#strTemp := RIGHT(IN:=#strTemp, L:=#restLen); // elimina os caracteres da string total
ELSE
“ParsedData”.Element[#elementNum] := #strTemp; // não tem delimitador, o elemento é a string
#strTemp := ‘’; // Preenche com delimitador, é util, caso número de elementos < 5
END_IF;
#strLen := LEN(#strTemp); // Atualiza o tamanho da String a ser processada
END_WHILE;