Como gravar dados no Histórico (DB.Hist) evitando registros redundantes com CompressedTable.

Ao utilizar o objeto Hist para gravar dados em um banco de dados relacional, é comum que uma nova linha seja registrada a cada ciclo de ScanTime, mesmo quando o valor monitorado permanece inalterado. Esse comportamento pode gerar um volume elevado de registros, especialmente em cenários de contingência, buffer de comunicação ou armazenamento contínuo.

Este artigo mostra como utilizar a propriedade CompressedTable para gravar apenas alterações significativas do valor, reduzindo a quantidade de registros sem a necessidade de scripts ou chamadas manuais ao método WriteRecord().

Problema

Por padrão, o objeto Hist grava um novo registro a cada intervalo definido em ScanTime.

Em aplicações onde os valores permanecem constantes durante longos períodos, isso resulta em:

  • crescimento desnecessário da tabela SQL;
  • aumento do espaço utilizado em disco;
  • consultas mais lentas;
  • maior carga de processamento durante gravações.

Esse cenário é comum em aplicações onde o objetivo é registrar apenas mudanças relevantes.

Solução

O objeto Hist possui a propriedade CompressedTable, que altera a forma como os registros são gravados.

Quando essa propriedade está habilitada, o Hist deixa de gravar uma linha a cada ciclo de scan e passa a registrar um novo valor somente quando a variação ultrapassar o DeadBand configurado.

Esse funcionamento é semelhante ao mecanismo de compressão utilizado pelo Storage (DB.Historian – baseado em DeadBand), porém aplicado diretamente em uma tabela comum (relacional)

Como funciona a propriedade CompressedTable

Por padrão:

CompressedTable = False

Nesse modo, uma nova linha é gravada em todos os ciclos de ScanTime.

Ao configurar:

CompressedTable = True

o Hist passa a comparar o valor atual com o último valor gravado.

Somente quando a diferença ultrapassar o valor definido em DeadBand, um novo registro será inserido na tabela.

Na prática:

  • valor permanece igual → nenhum novo registro;
  • valor varia acima do DeadBand → novo registro;
  • valor varia abaixo do DeadBand → nenhuma gravação.

Esse mecanismo reduz significativamente o volume de dados armazenados.

Configurando o DeadBand

A propriedade DeadBand define a variação mínima, em percentual (%), necessária para que o Hist grave um novo registro quando CompressedTable estiver habilitado.

Exemplo:

CompressedTable = True
DeadBand = 1

Nesse exemplo, um novo registro será gravado somente quando a variação do valor monitorado for superior a 1% em relação ao último valor armazenado.
Quando DeadBand = 0, qualquer alteração no valor monitorado resulta na gravação de um novo registro, desde que ocorra entre duas leituras consecutivas do Hist.
Se o valor gravado não é numérico, sua modificação força todos os valores a serem gravados.

É importante destacar que o DeadBand do objeto Hist é independente do utilizado pelo Storage (DB.Historian/DB.IStorageField). Embora tenham a mesma finalidade, evitar gravações desnecessárias, são propriedades distintas e pertencem a objetos diferentes.

Além disso, a propriedade DeadBand somente tem efeito quando:

CompressedTable = True

Caso contrário, o Hist continuará gravando registros conforme o intervalo definido em ScanTime.

Eliminando a necessidade de scripts

Sem utilizar o modo comprimido, é comum implementar eventos de usuário chamando manualmente:

WriteRecord()

para registrar apenas alterações.

Ao utilizar:

CompressedTable = True

o próprio Hist passa a decidir quando um novo registro deve ser gravado.

Isso simplifica o projeto, reduz a quantidade de scripts e torna o comportamento nativo da ferramenta.

Recomendação para o ScanTime

Mesmo utilizando CompressedTable, o valor da propriedade ScanTime continua sendo importante.

A recomendação é utilizar um intervalo menor que o período de atualização do CLP.

Por exemplo:

  • atualização do CLP: 2 segundos;
  • ScanTime recomendado: 1000 ms.

Dessa forma, alterações recebidas por buffer ou contingência possuem menor chance de ocorrer entre dois ciclos consecutivos de leitura, reduzindo o risco de perda de eventos.

Comparação entre os modos de gravação

CompressedTable = False CompressedTable = True
Grava uma linha a cada ScanTime Grava somente quando ocorre variação acima do DeadBand
Maior volume de dados Menor volume de dados
Histórico completo de todos os scans Histórico somente das alterações relevantes
Não utiliza DeadBand Utiliza DeadBand

Conclusão

A propriedade CompressedTable é a forma recomendada de evitar registros redundantes utilizando o objeto Hist.

Ajustando a  propriedade DeadBand, é possível reduzir significativamente o volume de dados armazenados, simplificar o projeto e eliminar a necessidade de scripts para controle das gravações.

Além disso, configurar corretamente o ScanTime ajuda a preservar eventos em cenários de buffer ou contingência, garantindo um histórico mais eficiente e com menor consumo de armazenamento.

 

 

Print Friendly, PDF & Email

Este artigo foi útil? Was this helpful?

Classificação média - Average rating 0 / 5. Count: 0

Deixe seu Comentário

Seu endereço de e-mail não será publicado. Campos marcados com asterisco são obrigatórios *