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.

