Para quem precisa entender como os dados são gravados fisicamente no ScadaBR, existe um banco de dados que pode ser o Derby (por padrão) ou MySQL instalado e configurado após a instalação
do ScadaBR 1.2 ou anteriores…
Conheça a Estrutura dos Bancos de Dados
Segue abaixo a estrutura de tabelas do banco de dados do ScadaBR:
Aviso: Após a imagem, existe algumas considerações…
Você pode obter por exemplo toda a cadeia, DataSource/DataPoint e valor usando uma das Queryes SQL abaixo:
SELECT ds.name as DataSource_Name, ds.xid as DataSource_Xid,
dp.xid as DataPoint_Xid, pv.pointValue as PointValue
from pointValues pv, dataPoints dp, dataSources ds
where pv.dataPointId = dp.id and dp.dataSourceId = ds.id
and pv.id = 1
ou
dp.xid as DataPoint_Xid, pv.pointValue as PointValue,
pva.textPointValueShort as PointValue_Text
from pointValueAnnotations pva, pointValues pv,
dataPoints dp, dataSources ds
where pva.pointValueId=pv.id and pv.dataPointId = dp.id
and dp.dataSourceId = ds.id and pva.pointValueId=1;
Fonte dos items:
Sobre o campo ts
Como podem notar, os valores dos datapoints ficam na tabela pointValues; o campo ts presente é a data/hora que o dado foi salvo. ele é um inteiroLongo que representa o número de miliSegundos desde 1/1/1970
Para transformar em Dia hora, basta pegar o valor de ts e dividir por 1000 para remover os miliSegundos e então temos um TimeStamp conhecido como UnixTime. (Número de segundos desde 1/jan/1970).
no Mysql é possível dividir ts /1000 e fazer a conversão para Dia e hora usando a função
FROM_UNIXTIME(ts/1000)
Contudo, se voce utiliza o derby, não há função direta para converter UnixTime para hora por exemplo:
Neste caso, se baseie nessa Query:
select id, datapointid, pointvalue,ts,
date(((ts/1000)/86400)+1) as Data,
1970+((ts/1000)/31536000) as ano,
((ts/1000)/86400) as dias_Desde_1_Jan_1970,
{ fn TIMESTAMPADD(SQL_TSI_FRAC_SECOND, mod(ts, 1000) * 1000000,
{ fn TIMESTAMPADD(SQL_TSI_SECOND, ts / 1000,
TIMESTAMP('1970-01-01-00.00.00.000000'))
})
}
from pointvalues fetch first 1 rows only
Para obter um dado e seu tempo com Mysql basta se basear nesse exemplo basico:
SELECT dp.pointvalue as valor, dt.xid,
FROM_UNIXTIME(ts/1000),
dp.dataPointId as zid,
dt.id as did
FROM pointValues dp, dataPoints dt
WHERE dt.id=dp.dataPointId and xid='DP_12345'
ORDER by ts DESC limit 1