Acesso ao banco de dados interno
Tabelas Customizadas pelo Usuário
A partir da versão 0.3.09 do HIscada Pro é permitido ao usuário criar tabelas no banco de dados local. A manipulação destas tabelas é feita diretamente através de SQL na sintaxe suportada pelo SQLite. As tabelas customizadas são armazenadas em um arquivo isolado (user.db) do banco local, assim não há risco de corrupção das tabelas gerenciadas pelo sistema, histórico de eventos, alarmes e variáveis retentivas.
Criação de Tabelas Customizada
No banco local, scripts LUA podem criar tabelas customizadas. O exemplo abaixo cria uma tabela chamada teste, com 3 campos.
-- Cria uma nova tabela no banco local
local project_path = ProjectsFolder
local project_name = ProjectName
LocalDB.Open(project_path, project_name)
err, msg = LocalDB.Execute("CREATE TABLE teste ( id INTEGER PRIMARY KEY, msg VARCHAR, valor FLOAT );")
if (err ~= 0) then
print("Falha na criação de tabela: " .. msg)
end
LocalDB.Close()
Inserção de Dados em Tabela Customizada
-- Abre conexão com banco
local project_path = ProjectsFolder
local project_name = ProjectName
LocalDB.Open(project_path, project_name)
-- Insere dados na tabela recém-criada
-- existe erro de sintaxe no comando SQL
err,msg = LocalDB.Execute("INSERT INTO teste VALUES ( NULL, 'Mensagem 1', 1.1);")
if err ~= 0 then
print("Comando SQL falhou: " .. msg)
end
-- Insere dados na tabela recém-criada
-- Comando SQL correto
err,msg = LocalDB.Execute("INSERT INTO teste VALUES ( NULL, 'Mensagem 2', 2.22);")
if err ~= 0 then
print("Comando SQL falhou: " .. msg)
end
-- Código que despreza os valores de retorno (inseguro)
LocalDB.Execute("INSERT INTO teste VALUES ( NULL, 'Mensagem 3', 3.333);")
-- Encerra utilização do Banco Local
LocalDB.Close()
Consulta em Tabela Customizada
local project_path = ProjectsFolder
local project_name = ProjectName
LocalDB.Open(project_path, project_name)
t, err = LocalDB.Select("SELECT * FROM teste;")
if (err ~= 0) then
print("Falha na criação de tabela: " .. msg)
end
-- Loop nos registros
for i,v in ipairs(t) do
print ("Registro " .. i)
-- Loop nos campos de um registro
for field,value in pairs(v) do
print("\t" .. field .. "->".. value)
end
end
LocalDB.Close()
Histórico de Alarmes e Eventos
Diferentemente das tabelas customizadas pelo usuário, a tabela de histórico de eventos e alarmes é criada pelo sistema. Por isso, existem funções especiais para manipulá-la.
Inserção de Eventos
Inserção de evento na tabela de histórico de eventos e alarmes:
-- Insere um evento
local project_path = ProjectsFolder
local project_name = ProjectName
LocalDB.Open(project_path, project_name)
LocalDB.InsertHistoryAE("EventName","Some User Message")
LocalDB.Close()
Consulta
Consulta paginada aos registros da tabela de histórico de eventos e alarmes:
-- Função auxiliar para imprimir no console um registro
function dumpRecord(pos, record)
print("Registro " .. pos .. "\n")
for col,value in pairs(record) do
print("\t" .. col .. ": " .. value .. "\n")
end
end
-- começa a ler registros do início da tabela
position = 0
-- lê os registros em conjuntos("páginas") de 100 em 100
step = 100
-- Recupera todos os registros, sem aplicar nenhum filtro restritivo
filtro = ""
local project_path = ProjectsFolder
local project_name = ProjectName
-- Abre o banco
LocalDB.Open(project_path, project_name)
-- Loop de leitura de páginas
repeat
-- consulta uma página do banco de tamanho "step"
tuplas, erro = LocalDB.SelectHistoryAE(filtro,step,position)
-- Loop de navegação nos registros recuperados em uma página
for i, record in ipairs(tuplas) do
-- imprime o registro
dumpRecord(position+i, record)
end
-- move "ponteiro" para a próxima página
position = position + step
until tables == nil or #tables == 0
-- Fecha o banco de dados
LocalDB.Close()
Exemplo de saída do código anterior:
Registro 209
alarm_transition: Alarma se igual a 0
session_id: 0
origin: Kernel
alarm_group: Area 1
event_name: Poço_parado
tag_name: AlarmGroup.TagC
trigger_value: 0
message: Poço parado
priority: Crítica
logged_user: Kernel
model: (null)
tag_value: 0
timestamp: 2011-06-21 09:34:15
event_type: 1
area:
Modelo de Dados
Um registro é uma tabela Lua, desta forma o acesso aos campos pode ser feito como um dicionário ou como atributos de um objeto.
Os campos de um registro da tabela de Histórico de Alarmes e Eventos são:
Título da Tabela |
|
|---|---|
alarm_transition |
Mensagem que descreve o tipo de transição de alarme |
session_id |
Identificador interno utilizado para agrupar um ciclo de entrada-saída da condição de alarme |
origin |
“Kernel” ou string que identifica grupo.instância |
alarm_group |
Identificador do grupo de alarmes |
event_name |
Nome do alarme ou evento |
tag_name |
Nome do Tag associado ao alarme |
trigger_value |
Valor do limite que é usado para entrada em condição de alarme |
message |
Texto da mensagem associada ao evento ou alarme |
priority |
Prioridade do Alarme |
logged_user |
“Kernel” ou nome do usuário que disparou evento |
model |
“(null)” ou nome do modelo em que o alarme foi definido. |
tag_value |
Valor do Tag que dispara o alarme |
timestamp |
Texto no formato ISO YYYY-MM-DD HH:MM:SS |
event_type |
EVENTO=0, ALARM_IN=1, ALARM_OUT=2, USR_ACK=3, USR_SILENCE=4, USR_RESET=5 |
area |
Área de processo associada a definição do Tag |
Consulta de um registro específico e acesso ao registro como objeto:
function dumpRecord(record)
print("Transição: " .. record.alarm_transition)
print("Sessão: " .. record.session_id)
print("Origem do Tag: " .. record.origin)
print("Grupo do Alarme: " .. record.alarm_group)
print("Evento: " .. record.event_name)
print("Tag: " .. record.tag_name)
print("Gatillho: " .. record.trigger_value)
print("Mensagem: " .. record.message)
print("Prioridade: " .. record.priority)
print("Usuário: " .. record.logged_user)
print("Modelo: " .. record.model)
print("Valor do Tag: " .. record.tag_value)
print("Data/Hora: " .. record.timestamp)
print("Tipo do Evento: " .. record.event_type)
print("Área do Processo: " .. record.area)
end
local project_path = ProjectsFolder
local project_name = ProjectName
LocalDB.Open(project_path, project_name)
-- registro na posição 200
tuplas, erro = LocalDB.SelectHistoryAE("",1,200)
if tuplas ~= nil then
-- result_set de nome tuplas só tem um resultado
print("No de Resultados: " .. #tuplas)
record = tuplas[1]
dumpRecord(record)
end
LocalDB.Close()