Execução Incompleta de Scripts

Guilherme_Barretta
Mensagens: 7
Registrado em: Sex Abr 26, 2019 4:31 pm

Execução Incompleta de Scripts

Mensagem por Guilherme_Barretta » Seg Mai 25, 2020 7:07 pm

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

Avatar do usuário
ViniciusMoraes
Moderadores
Mensagens: 19
Registrado em: Sáb Out 22, 2016 1:48 am
Contato:

Re: Execução Incompleta de Scripts

Mensagem por ViniciusMoraes » Ter Mai 26, 2020 1:55 pm

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.
Vinícius de Moraes
Customer Service | Atendimento ao Cliente

E-mail de contato: suporte@hitecnologia.com.br
Telefone: (19)2139-1700 - (Opção 2 - Suporte Técnico).

Guilherme_Barretta
Mensagens: 7
Registrado em: Sex Abr 26, 2019 4:31 pm

Re: Execução Incompleta de Scripts

Mensagem por Guilherme_Barretta » Ter Mai 26, 2020 2:37 pm

Olá Vinícius,

O Script é do Kernel executa com um TAG CHANGE, e esse é o código-fonte:

Código: Selecionar todos

--[[- - - - - - - - - - - - - - - - - - - - - - - - - - 

    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

Avatar do usuário
ViniciusMoraes
Moderadores
Mensagens: 19
Registrado em: Sáb Out 22, 2016 1:48 am
Contato:

Re: Execução Incompleta de Scripts

Mensagem por ViniciusMoraes » Qua Mai 27, 2020 3:32 pm

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
Vinícius de Moraes
Customer Service | Atendimento ao Cliente

E-mail de contato: suporte@hitecnologia.com.br
Telefone: (19)2139-1700 - (Opção 2 - Suporte Técnico).

Guilherme_Barretta
Mensagens: 7
Registrado em: Sex Abr 26, 2019 4:31 pm

Re: Execução Incompleta de Scripts

Mensagem por Guilherme_Barretta » Qui Mai 28, 2020 6:41 pm

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

Avatar do usuário
ViniciusMoraes
Moderadores
Mensagens: 19
Registrado em: Sáb Out 22, 2016 1:48 am
Contato:

Re: Execução Incompleta de Scripts

Mensagem por ViniciusMoraes » Sex Mai 29, 2020 5:00 pm

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.
Vinícius de Moraes
Customer Service | Atendimento ao Cliente

E-mail de contato: suporte@hitecnologia.com.br
Telefone: (19)2139-1700 - (Opção 2 - Suporte Técnico).

Responder