O documento descreve como o Python foi utilizado para automatizar a geração de listas de pontos para subestações do setor elétrico. O autor desenvolveu um script em Python que lê dados de configuração de uma planilha Excel e gera automaticamente uma nova planilha contendo a lista de pontos para cada subestação. O script facilitou o trabalho ao eliminar tarefas manuais repetitivas e reduzir erros.
Introdução ao processamento paralelo com o Grand Central Dispatch
Lp script pug-pe
1. Automatização com Python de Listas de
Pontos para Subestações do Setor Elétrico
1/24 Hugo Salvador – 15/09/2012
2. Contextualização
Programa LP Scripts
Como o Python facilitou minha vida
2/24 Hugo Salvador – 15/09/2012
3. Sistema Elétrico
Usina de Geração
Linha de Distribuição
Linha de
Transmissão
Subestação
3/24 Hugo Salvador – 15/09/2012
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ão
4/24 Hugo Salvador – 15/09/2012
5. Supervisório
SAGE – Tela de Diagrama Unifilar
5/24 Hugo Salvador – 15/09/2012
6. Supervisório
SAGE – Tela de Alarmes e Comandos
6/24 Hugo Salvador – 15/09/2012
7. Supervisório
SAGE – Tela de Lista de Alarmes
7/24 Hugo Salvador – 15/09/2012
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 janela
try:
app.iconbitmap(default='chesf.ico‘) # Ícone utilizado pela janela
except:
pass
app.resizable(0,0)
Janela(app)
app.mainloop()
15/24 Hugo Salvador – 15/09/2012
16. tkMessageBox
try:
from xlrd import open_workbook
except:
tkMessageBox.showerror('Erro',u'Modulo xlrd não instalado')
try:
from lp_lib.Gerar_LP import gerar
except:
tkMessageBox.showerror('Erro',u'Módulo Gerar não instalado')
...
tkMessageBox.showinfo('Aviso',
u'Arquivo "'+nome+'" gerado em'+os.getcwd())
16/24 Hugo Salvador – 15/09/2012
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. 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. 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=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. 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. 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. 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. 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
23/24 Hugo Salvador – 15/09/2012
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/DOMO
24/24 Hugo Salvador – 15/09/2012