Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Lp script pug-pe

2,186 views

Published on

Apresentação no XX encontro do PUG-PE sobre Automatização com python de listra de pontos para subestação do setor elétrico

  • Be the first to comment

  • Be the first to like this

Lp script pug-pe

  1. 1. Automatização com Python de Listas de Pontos para Subestações do Setor Elétrico1/24 Hugo Salvador – 15/09/2012
  2. 2. Contextualização Programa LP Scripts Como o Python facilitou minha vida2/24 Hugo Salvador – 15/09/2012
  3. 3. Sistema Elétrico Usina de Geração Linha de Distribuição Linha de Transmissão Subestação3/24 Hugo Salvador – 15/09/2012
  4. 4. Lista de Pontos Planilha Excel com lista dos ponto de supervisão e comando que trafegam entre IEDs (Intelligent Electronic Device) e o Sistema Supervisório (SCADA - Supervisory Control and Data Acquisition). Supervisório Rede Ethernet IED Computador Controlador Equipamentos de Alta Tensão4/24 Hugo Salvador – 15/09/2012
  5. 5. Supervisório SAGE – Tela de Diagrama Unifilar5/24 Hugo Salvador – 15/09/2012
  6. 6. Supervisório SAGE – Tela de Alarmes e Comandos6/24 Hugo Salvador – 15/09/2012
  7. 7. Supervisório SAGE – Tela de Lista de Alarmes7/24 Hugo Salvador – 15/09/2012
  8. 8. Programa LP Scripts8/24 Hugo Salvador – 15/09/2012
  9. 9. LP Scripts LP NSIS Scripts Bibliotecas LP Scripts Módulos xlrd e xlwt Python 2.79/24 Hugo Salvador – 15/09/2012
  10. 10. LP_Config Entrada de Dados LP Padrão (xls) (xls) LP Scripts.pywc gerarPlanilha .pyc Inicia Função Inicia Função Usa Função Gerar_LP .pyc Checar_LP .pyc LP .pyc Usa Função Usa Função Retorna Array Retorna Array func.pyc LP_gerada Relatório (xls) (xls)10/24 Hugo Salvador – 15/09/2012
  11. 11. Vamos à prática11/24 Hugo Salvador – 15/09/2012
  12. 12. Como o Python facilitou minha vida12/24 Hugo Salvador – 15/09/2012
  13. 13. Pacotes Python Utilizados  Tkinter (Janela Principal e Janela Sobre)  tkMessageBox (Mensagens de informação)  tkFileDialog (Indicar arquivo)  os (verificação de arquivos)  String (replace, split e find)  Array (ichi!!!)  xlrd (Leitura de arquivo Excel)  xlwt (Geração de arquivo Excel) http://www.python-excel.org/13/24 Hugo Salvador – 15/09/2012
  14. 14. Tkinter frmE frmDclass Janela: frm11 frm12 ...# FRAME "Arquivo LP Padrao"-------------------------------------self.frm11 = LabelFrame(self.frmE, text=uArquivo LP Padrão, height = frmaltura, width = frmLargura) frm21self.frm11.grid(row=1, column=1, padx=3, pady=3)self.nomeArquivo = Label(self.frm11, text=self.caminhoArquivoLP_Padrao) frm31self.nomeArquivo.grid(row=1, column=1)self.btEscolheArq = Button(self.frm11, text=Selecionar, bg=#E0E0E0, width=frmLargura/8, command=self.btEscolheArqClick)self.btEscolheArq.grid(row=2,frm41 column=1, sticky=N+E+S+W, pady=2, padx=10) ...14/24 Hugo Salvador – 15/09/2012
  15. 15. Tkinter e tkFileDialog ... def btEscolheArqClick (self): temp=askopenfilename(filetypes=[(Arquivo do Excel,xls)]) if (temp!=): self.caminhoArquivoLP_Padrao = temp self.nomeArquivo[text] = path.basename(temp) ...app=Tk() # Instância do Tk (janela principal)app.title(‘LP Script’) # Título da janelatry: app.iconbitmap(default=chesf.ico‘) # Ícone utilizado pela janelaexcept: passapp.resizable(0,0)Janela(app)app.mainloop()15/24 Hugo Salvador – 15/09/2012
  16. 16. tkMessageBoxtry: from xlrd import open_workbookexcept: tkMessageBox.showerror(Erro,uModulo xlrd não instalado)try: from lp_lib.Gerar_LP import gerarexcept: tkMessageBox.showerror(Erro,uMódulo Gerar não instalado) ...tkMessageBox.showinfo(Aviso, uArquivo "+nome+" gerado em+os.getcwd())16/24 Hugo Salvador – 15/09/2012
  17. 17. Array e xlrd from xlrd import open_workbook arq_conf = open_workbook(LP_config.xls) sheet = arq_conf.sheet_by_index(0) conf_LT_array=[] #Configuração de LT index_linha=18 while sheet.cell(index_linha,0).value: # 0 - Código operacional LT Ex. 04V1 conf_LT_array.append([sheet.cell(index_linha,0).value.upper(), # 1 - Nome do painel Ex. 4UA2A sheet.cell(index_linha,1).value.upper(), # 2 - Tem 87L (Sim ou Não) sheet.cell(index_linha,2).value, # 3 - Religamento sheet.cell(index_linha,3).value, # 4 - Código LT Remota Ex. NTT sheet.cell(index_linha,4).value.upper(), # 5 - Arranjo sheet.cell(index_linha,5).value]) . . . for parametros_LT in conf_LT_array: . . .17/24 Hugo Salvador – 15/09/2012
  18. 18. Array • array_validar_ID=[col[0] for col in array_validar] • array_checar=[tag[-11:] for tag in array_ID] #Separar as últimas 11 posições (Painel e código de ponto) • pos11dupl=[dupl11 for dupl11 in set(array_checar) if array_checar.count(dupl11)>1 and dupl11[:3]==2UA’] • if endereco not in endduplicado_array: • parametros = conf_LT_array + conf_Trafo_array + conf_BT_array + conf_Reator_array + conf_TT_array + conf_BCap_array # Soma de Array • saida_array.sort()18/24 Hugo Salvador – 15/09/2012
  19. 19. Array e xlwt from xlwt import Workbook arq_Relatorio = Workbook() planilha_problema= arq_Relatorio.add_sheet(Problema) array_titulo=[ID (SAGE)‘,OCR (SAGE)‘, uDESCRIÇÃO‘,TIPO, COMANDO‘, uMEDIÇÃO‘, ANUNCIADOR, LISTA DE ALARMES‘, SOE] coluna=0 for titulo in array_titulo: planilha_problema.write(0,coluna,titulo) coluna+=1 for titulo in array_titulo: planilha_problema.write (0,array_titulo.index(titulo),titulo)19/24 Hugo Salvador – 15/09/2012
  20. 20. String ZZZ:0YYY:[F1/F2]:RAUT PRS:04L1:F1:RAUT tratar=string.replace(tratar_array[0],ZZZ,Codigo_SE) tratar_1=string.replace(tratar,0YYY,parametros_LT[0]) tratar_IdSage=tratar_array[0].split(/) ied0=unicode(tratar_IdSage[0][-2:]) ied1=unicode(tratar_IdSage[1][:2])20/24 Hugo Salvador – 15/09/2012
  21. 21. String arq_LP = gerarPlanilha() nome_arq=./LP_gerada.xls’ seq_arq=0 while os.path.exists(nome_arq): seq_arq+=1 nome_arq=nome_arq[0:11]+_+str(seq_arq)+’.xls’ arq_LP.save(nome_arq_saida[2:]) if (descricao.find(87L)>=0: descricao . . . ‘Trip Relé Diferencial 87L Fase A’ if int(parametros_LT[1][0])>3: parametros_LT . . . [‘04L1’,’4UA2A’,’Sim’,’Tripolar’,...]21/24 Hugo Salvador – 15/09/2012
  22. 22. Equação Booleana cd1 = tratar.find(F3)<0 or (tratar.find(F3)>-1 and (parametros_Trafo[6]==PU/PG)) cd2 = ... cd3 = ... cd4 = ... cd5 = ... cd6 = ... cd7 = ... if (cd1+cd2)*cd3*cd4*cd5*cd6*cd7: . . .22/24 Hugo Salvador – 15/09/2012
  23. 23. Mais coisas legais • Vários IDEs disponíveis (Coisas simples uso Idle, se complicar uso Eclipse + PyDev) • Linguagem Interpretada, mas compilada! (Distribuição do software com arquivos compilados) • Interpretador dinâmico (faça test-drive antes de usar a função, programar com Idle aberto) • Vasto material de referência e códigos na Internet (programar com browser aberto) • Pode-se programar em Python para Desktop, Web ou Celular (LP Scripts pode passar do Desktop para Intranet) • Estrutura fácil, muito material de consulta disponível... Se consegue desenvolver programa de forma prazerosa e com facilidade23/24 Hugo Salvador – 15/09/2012
  24. 24. Coordenador do Projeto Hugo Everaldo Salvador Bezerra Chesf/DEEC Obrigado! Co autores Fábio André da Silva Hugo Everaldo Salvador Bezerra Chesf/DEEC hugos@chesf.gov.br Jose Geraldo da Silva Júnior +55 81 3229 3221 Chesf/DOMO24/24 Hugo Salvador – 15/09/2012

×