Hugo Salvador – 15/09/20121/24
Automatização com Python de Listas
de Pontos para Subestações do Setor
Elétrico
Hugo Salvador – 15/09/20122/24
Contextualização
Programa LP Scripts
Como o Python facilitou minha vida
Hugo Salvador – 15/09/20123/24
Sistema Elétrico
Subestação
Linha de Transmissão
Usina de Geração
Linha de Distribuição
Hugo Salvador – 15/09/20124/24
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).
IED
Rede Ethernet
Supervisório
Computador Controlador
Equipamentos de Alta Tensão
Hugo Salvador – 15/09/20125/24
SupervisórioSAGE – Tela de Diagrama Unifilar
Hugo Salvador – 15/09/20126/24
SupervisórioSAGE – Tela de Alarmes e Comandos
Hugo Salvador – 15/09/20127/24
SupervisórioSAGE – Tela de Lista de Alarmes
Hugo Salvador – 15/09/20128/24
Programa LP Scripts
Hugo Salvador – 15/09/20129/24
LP Scripts
NSIS
Bibliotecas LP Scripts
Módulosxlrd e xlwt
Python 2.7
Hugo Salvador – 15/09/201210/24
LP Padrão(xls)
LP_Config(xls)
LP Scripts.pywc
Gerar_LP .pyc Checar_LP .pyc
LP .pyc
Entrada de Dados
Inicia Função Inicia Função
Usa FunçãoRetorna Array
Usa FunçãoRetorna Array
gerarPlanilha .pyc
Usa Função
LP_gerada(xls)
func.pyc
Relatório(xls)
Hugo Salvador – 15/09/201211/24
Vamos à prática
Hugo Salvador – 15/09/201212/24
Como o Python facilitou
minha vida
Hugo Salvador – 15/09/201213/24
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/
Hugo Salvador – 15/09/201214/24
Tkinter
class Janela:
...
# FRAME "Arquivo LP Padrao"-------------------------------------self.frm11 = LabelFrame(self.frmE, text=u'Arquivo LP Padrão', \
height = frmaltura, width = frmLargura) self.frm11.grid(row=1, column=1, padx=3, pady=3) self.nomeArquivo = Label(self.frm11, \
text=self.caminhoArquivoLP_Padrao) self.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, column=1, sticky=N+E+S+W, pady=2, padx=10)
...
frmE frmD
frm11
frm21
frm31
frm41
frm12
Hugo Salvador – 15/09/201215/24
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()
Hugo Salvador – 15/09/201216/24
tkMessageBoxtry: from xlrd import open_workbookexcept: tkMessageBox.showerror('Erro',u'Modulo xlrd não instalado')
try: from lp_lib.Gerar_LP import gerarexcept: tkMessageBox.showerror('Erro',u'Módulo Gerar não instalado')
...
tkMessageBox.showinfo('Aviso',\u'Arquivo \"'+nome+'\" gerado em'+os.getcwd())
Hugo Salvador – 15/09/201217/24
Array e xlrdfrom xlrd import open_workbookarq_conf = open_workbook('LP_config.xls')sheet = arq_conf.sheet_by_index(0)
conf_LT_array=[] #Configuração de LT index_linha=18while 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:...
Hugo Salvador – 15/09/201218/24
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()
Hugo Salvador – 15/09/201219/24
Array e xlwt
from xlwt import Workbook
arq_Relatorio = Workbook()
planilha_problema= arq_Relatorio.add_sheet('Problema')
array_titulo=['ID (SAGE)‘,'OCR (SAGE)‘, u'DESCRIÇÃO‘,'TIPO', 'COMANDO‘, u'MEDIÇÃO‘, 'ANUNCIADOR', 'LISTA DE ALARMES‘, 'SOE']
coluna=0for 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)
Hugo Salvador – 15/09/201220/24
String
PRS:04L1:F1:RAUTZZZ:0YYY:[F1/F2]: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])
Hugo Salvador – 15/09/201221/24
Stringarq_LP = gerarPlanilha()
nome_arq='./LP_gerada.xls’seq_arq=0while 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 int(parametros_LT[1][0])>3:... [‘04L1’,’4UA2A’,’Sim’,’Tripolar’,...]
parametros_LT
if (descricao.find('87L')>=0:... ‘Trip Relé Diferencial 87L Fase A’
descricao
Hugo Salvador – 15/09/201222/24
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:...
Hugo Salvador – 15/09/201223/24
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 facilidade
Hugo Salvador – 15/09/201224/24
Obrigado!Hugo Everaldo Salvador Bezerra
[email protected]+55 81 3229 3221
Coordenador do ProjetoHugo Everaldo Salvador BezerraChesf/DEEC
Co autoresFábio André da SilvaChesf/DEEC
Jose Geraldo da Silva JúniorChesf/DOMO