Page 1 of 1
Execução Incompleta de Scripts
Posted: Mon May 25, 2020 7:07 pm
by Guilherme_Barretta
Boa tarde pessoal da HI Tecnologia,
Estou com uma dúvida em relação à execução de scripts.
Possuo scripts que executam apenas uma vez (como quando abre uma tela, ou atualiza uma TAG) e vejo situações raras em que o script executa parcialmente, ou mesmo não executa. Os scripts em questão já foram verificados diversas vezes, com depuração e tudo mais ,e não apresentam nenhum tipo de erro.
O que poderia ser feito para evitar esse problema ? tenho situações que dependo da execução desse script para o correto funcionamento das funções do supervisório.
Atenciosamente,
Guilherme Barretta
Re: Execução Incompleta de Scripts
Posted: Tue May 26, 2020 1:55 pm
by ViniciusMoraes
Olá Guilherme,
Você consegue fornecer o código deste script em questão? O script é do Kernel ou do Viewer? Qual é o objeto e o evento que está associado a execução deste script?
Com essas informações, nós tentamos reproduzir e encontrar o erro que está reportando.
Re: Execução Incompleta de Scripts
Posted: Tue May 26, 2020 2:37 pm
by Guilherme_Barretta
Olá Vinícius,
O Script é do Kernel executa com um
TAG CHANGE, e esse é o código-fonte:
Code: Select all
--[[- - - - - - - - - - - - - - - - - - - - - - - - - -
Ambiente: HIscada_Pro
Projeto: KROMA_FARMACEUTICA
Empresa:
Versão:
Responsável:
Data: 17/04/2020
\b Descrição: \brief
... função do script
- - - - - - - - - - - - - - - - - - - - - - - - - - - -]]
-- Captura data e hora do início da execução
local datahora = tostring(DateTime())
-- Captura usuário logado
local UserName = Tags.Get("Kernel.Tags.Local.Relatorios.UserName")
local usuario = UserName.Value
-- Captura tag de início da execução e confirma execução
local inicio_passo = Tags.Get("Kernel.Tags.Opc.Operacao_Automatica_CIP.INICIO_PASSO_CIP")
local confirma_inicio_passo = Tags.Get("Kernel.Tags.Opc.Operacao_Automatica_CIP.CONF_INICIO_PASSO_CIP")
-- Captura as tags do nome da receita, lote e ordem
local nome_receita = Tags.Get("Kernel.Tags.Local.Operacao_Automatica_CIP.Nome_Receita_CIP")
local lote = Tags.Get("Kernel.Tags.Local.Operacao_Automatica_CIP.Lote_CIP")
local ordem = Tags.Get("Kernel.Tags.Local.Operacao_Automatica_CIP.Ordem_CIP")
-- Captura tags de execução da receita
local id_processo = Tags.Get("Kernel.Tags.Opc.Operacao_Automatica_CIP.ID_PROCESSO_CIP")
local passo =Tags.Get("Kernel.Tags.Opc.Operacao_Automatica_CIP.PASSO_CIP")
local tanque = Tags.Get("Kernel.Tags.Opc.Operacao_Automatica_CIP.TANQUE_CIP")
local vel_bomba_cip = Tags.Get("Kernel.Tags.Opc.Operacao_Automatica_CIP.VEL_BB_CIP")
local add_agua = Tags.Get("Kernel.Tags.Opc.Operacao_Automatica_CIP.ADD_AGUA_CIP")
local set_aq = Tags.Get("Kernel.Tags.Opc.Operacao_Automatica_CIP.SET_AQUECIMENTO_CIP")
local add_detergente = Tags.Get("Kernel.Tags.Opc.Operacao_Automatica_CIP.ADD_DETERGENTE_CIP")
local vel_bomba_det = Tags.Get("Kernel.Tags.Opc.Operacao_Automatica_CIP.VEL_BB_DET_CIP")
local set_ph = Tags.Get("Kernel.Tags.Opc.Operacao_Automatica_CIP.SET_PH_CIP")
local tempo_recirc = Tags.Get("Kernel.Tags.Opc.Operacao_Automatica_CIP.TEMPO_RECIRCULA_CIP")
local tanque_origem = Tags.Get("Kernel.Tags.Opc.Operacao_Automatica_CIP.TQ_ORIGEM_CIP")
local av_auto = Tags.Get("Kernel.Tags.Opc.Operacao_Automatica_CIP.AV_AUTOMATICO_CIP")
local caminho = Tags.Get("Kernel.Tags.Opc.Operacao_Automatica_CIP.CAMINHO_CIP")
local tempo_cip = Tags.Get("Kernel.Tags.Opc.Operacao_Automatica_CIP.TEMPO_CIP")
local ciclos_cip = Tags.Get("Kernel.Tags.Opc.Operacao_Automatica_CIP.CICLOS_CIP")
--Captura timer de gravação de valores de processo
--local timer = Timers.Get("Kernel.Timers.Salva_Valores_Processo_CIP")
if (inicio_passo.Value == true) then
if (id_processo.Value == 0 or id_processo.Value == 10) then
inicio_passo.Value = false
inicio_passo:WriteValue()
return
else
--local ret = timer:Enable(5000)
if(av_auto.Value > 0) then
texto_1 = "Avanço automático habilitado."
else
texto_1 = ""
end
end
if (id_processo.Value == 1) then
texto = "Adição de Água: Início de adição de água no tanque TE0"..tanque.Value.." na quantidade "..add_agua.Value.." Lts."
elseif (id_processo.Value == 2) then
texto = "Aquecimento: Início de aquecimento em tanque TE01 na temperatura "..set_aq.Value.." ºC."
elseif (id_processo.Value == 3) then
texto = "Adição de Detergente: Início de adição de detergente no tanque TE0"..tanque.Value.." na quantidade "..add_detergente.Value.." na velocidade de "..vel_bomba_det.Value.." kg/h."
elseif (id_processo.Value == 4) then
texto = "Chamada operador: Início da chamada de operador."
elseif (id_processo.Value == 5) then
texto = "Controle de pH: Início de controle de pH com setpoint em "..set_ph.Value.." com bomba na velocidade de "..vel_bomba_cip.Value.." kg/h."
elseif (id_processo.Value == 6) then
texto = "Recirculação: Início da recirculação no tanque TE0"..tanque.Value.." com bomba na velocidade de "..vel_bomba_cip.Value.." kg/h."
elseif (id_processo.Value == 7) then
texto = "Transferência entre tanques: Início de transferência entre tanques, do tanque TE0"..tanque_origem.Value.." para p tanque TE0"..tanque.Value.." na quantidade de "..add_agua.Value.." Lts."
elseif (id_processo.Value == 8) then
texto = "Transferência CIP: Início da transferência CIP a partir do tanque TE0"..tanque_origem.Value.." seguindo o caminho "..caminho.Value.."."
--elseif (id_processo.Value == 9) then
-- texto = "Inertização: Início da inertização com vacuo em "..set_press.Value.." bar."
end
local texto_principal = texto .. texto_1
local con =Database.Get('Globals.DataBases.DataBase_001')
if (con == nil) then
print(erro)
else
cursor, error = con:Execute ("INSERT INTO trilha_processo_cip(ordem, lote, nome_receita, data, passo, id, texto_principal, usuario) VALUES ('"..ordem.Value.."','"..lote.Value.."','"..nome_receita.Value.."',\
'"..datahora.."','"..passo.Value.."','"..id_processo.Value.."','"..texto_principal.."','"..usuario.."');")
if (error ~= nil) then
print("Erro ao inserir registros no banco de dados.")
inicio_passo.Value = false
inicio_passo:WriteValue()
return
end
inicio_passo.Value = false
confirma_inicio_passo.Value = true
inicio_passo:WriteValue()
confirma_inicio_passo:WriteValue()
end
end
Dependo da execução desse script para dar continuidade da execução de um processo, pois o PLC fica no aguardo da confirmação do início de passo e em algumas situações vejo que o script não executa mesmo cumprindo a condição de TAG CHANGE.
Atenciosamente,
Guilherme Barretta
Re: Execução Incompleta de Scripts
Posted: Wed May 27, 2020 3:32 pm
by ViniciusMoraes
Olá Guilherme,
Analisando o script enviado, o problema que está ocorrendo pode ter relação com a maneira que você projetou a sua aplicação. É algo conceitual.
É muito importante tomar cuidado com scripts que são executados em eventos de
alteração de valor de tag, principalmente quando o script utiliza valores de tags OPCs e conexão com banco de dados.
Erros de comunicação com o servidor OPC e falhas de conexão com o banco de dados podem ocorrer e simplesmente interromper o script.
Em geral, a recomendação é alterar a aplicação para tratar melhor os cenários de erro e, além disso, criar uma máquina de estado (iniciada quando o evento de tag change ocorre e sendo chamado ciclicamente - ex.: timer) para tratar o evento e continuar chamando o script até que os erros não ocorram mais.
Caso você precisar de mais informações para corrigir esta aplicação, por favor, entre em contato com o nosso time de vendas e solicite algumas horas de engenharia.
E-mail de Vendas - HI Tecnologia:
vendas@hitecnologia.com.br
Re: Execução Incompleta de Scripts
Posted: Thu May 28, 2020 6:41 pm
by Guilherme_Barretta
Boa tarde Vinícius,
Tomarei os devidos cuidados daqui pra frente nesse aspecto.
Aproveito o tópico para tirar uma dúvida: Há algum problema ou cuidado a ser tomado do número de scripts rodando simultaneamente ?
Atenciosamente,
Guilherme Barretta
Re: Execução Incompleta de Scripts
Posted: Fri May 29, 2020 5:00 pm
by ViniciusMoraes
Olá Guilherme,
Não existem problemas para executar scripts desta forma como mencionou. Em geral, a recomendação é sempre manter os
códigos bem documentados e fazer uma boa
identificação das funções.
.
Segue a documentação sobre os Scripts LUA que são utilizados no ambiente HIscada Pro.
Para outros usuários que lerem este tópico futuramente, a recomendação é sempre consultar o
Manual Online do HIscada Pro. Lá estão disponibilizadas muitas informações sobre o supervisório em geral.