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()