0% acharam este documento útil (0 voto)
3 visualizações10 páginas

Capitulo 3 - Python

O capítulo explora a interconexão entre Python e OpenDSS, destacando a Simulação Híbrida que combina a precisão do OpenDSS com a versatilidade do Python. A arquitetura Client-Server permite que o Python controle o OpenDSS, facilitando análises dinâmicas e iterações rápidas através de acesso direto à memória. Um estudo de caso é apresentado, demonstrando a análise de sensibilidade de tensão em um sistema de distribuição, evidenciando a eficiência da integração.

Enviado por

Izaias Viana
Direitos autorais
© All Rights Reserved
Levamos muito a sério os direitos de conteúdo. Se você suspeita que este conteúdo é seu, reivindique-o aqui.
Formatos disponíveis
Baixe no formato DOCX, PDF, TXT ou leia on-line no Scribd
0% acharam este documento útil (0 voto)
3 visualizações10 páginas

Capitulo 3 - Python

O capítulo explora a interconexão entre Python e OpenDSS, destacando a Simulação Híbrida que combina a precisão do OpenDSS com a versatilidade do Python. A arquitetura Client-Server permite que o Python controle o OpenDSS, facilitando análises dinâmicas e iterações rápidas através de acesso direto à memória. Um estudo de caso é apresentado, demonstrando a análise de sensibilidade de tensão em um sistema de distribuição, evidenciando a eficiência da integração.

Enviado por

Izaias Viana
Direitos autorais
© All Rights Reserved
Levamos muito a sério os direitos de conteúdo. Se você suspeita que este conteúdo é seu, reivindique-o aqui.
Formatos disponíveis
Baixe no formato DOCX, PDF, TXT ou leia on-line no Scribd

Capítulo 3

Interconexão Python e OpenDSS

1.1 Introdução à Simulação Híbrida


A engenharia de sistemas de potência moderna exige ferramentas flexíveis. Embora a
interface nativa do OpenDSS seja robusta para modelagem, ela carece de recursos avan-
çados de programação lógica. A solução adotada pela indústria e academia é a Simulação
Híbrida, onde se combinam a precisão de um motor de cálculo elétrico com a
versatilidade de uma linguagem de alto nível.
Neste capítulo, exploraremos a arquitetura que permite ao Python "pilotar"o OpenDSS,
transformando-o de uma calculadora estática em uma ferramenta dinâmica de análise.

1.2 Arquitetura da Interconexão


Para compreender a eficiência da interação Python-OpenDSS, é necessário ultrapassar o
conceito básico de troca de dados e entender a arquitetura de software subjacente,
baseada no modelo Client-Server (Cliente-Servidor) via Biblioteca de Vínculo Dinâmico.

1.2.1 O Modelo de Componentes


O OpenDSS não roda "dentro"do Python, nem o Python roda "dentro"do OpenDSS. Na
realidade, o OpenDSS opera como um Servidor de Automação (COM -
Component Object Model no Windows ou Shared Library no Linux).
Nesta arquitetura:

• O Servidor (OpenDSS Engine): É um bloco de código compilado (escrito


origi- nalmente em Delphi/Pascal), otimizado para realizar cálculos matriciais
complexos em baixo nível de máquina. Ele reside na memória RAM como uma
DLL (Dynamic Link Library).

• O Cliente (Python): Atua como a interface de controle. Ele não realiza os


cálculos elétricos; sua função é gerenciar a lógica de simulação, enviar instruções e
processar os resultados estatísticos.

A Figura 1.1 ilustra essa hierarquia, onde o Python "pilota"o motor do OpenDSS sem
precisar conhecer as equações internas do fluxo de potência.

1
PYTHON
(Script do Usuário)
Chama Funções
Biblioteca
(dss-python / CFFI)
Traduz
Comandos
OpenDSS Resultados
de Texto
Engine (V, I, P, Q)
(.dss)
(Motor de Cálculo)
Figura 1.1: Diagrama de blocos da interação via Memória Compartilhada.

1.2.2 Mecanismo de Troca de Dados


A grande vantagem desta arquitetura em relação à troca de arquivos de texto (CSV) é a
velocidade. Como observado na Figura 1.1, o fluxo de informação ocorre através de
canais distintos:

1. Fluxo de Comando (Downstream - String Injection): O Python envia


strings de texto (ex: "New Load.Carga1...") através da interface de texto. O
interpre- tador interno do OpenDSS processa esses comandos como se um usuário
humano estivesse digitando no console. Isso garante flexibilidade total na definição
da topo- logia.

2. Fluxo de Dados (Upstream - Direct Memory Access): Este é o ponto


crítico de desempenho. Após o cálculo (Solve), os resultados (tensões, correntes,
perdas) já estão calculados na memória RAM alocada pelo OpenDSS.
Através da interface dss-python, o script não precisa pedir para o OpenDSS "sal-
var um arquivo"e depois "ler o arquivo". O Python recebe um ponteiro direto
para o endereço de memória onde os vetores de resultados estão armazenados. Isso
permite a extração de milhões de dados (ex: tensões de 10.000 barras) em ordem
de microssegundos, viabilizando simulações de Monte Carlo e otimizações iterativas
que seriam impossíveis via troca de arquivos.

Nota Técnica: A biblioteca dss-python utiliza internamente o CFFI (C


Foreign Function Interface) para realizar essa ponte entre o Python e o có-
digo compilado do OpenDSS, garantindo compatibilidade tanto em ambientes
Windows quanto Linux (Google Colab).

1.3 O Ciclo de Automação


A principal vantagem da integração Python-OpenDSS reside na transição de uma análise
estática para uma análise dinâmica e iterativa. Diferente da execução nativa de scripts
.dss, que processam o código linearmente do início ao fim, o ambiente Python permite a
implementação de estruturas de controle de fluxo ("Laços de Simulação").
Essa arquitetura é fundamental para dois tipos principais de estudos modernos:

2
1. Séries Temporais (QSTS - Quasi-Static Time Series): Onde a
variável de iteração é o tempo (ex: 24 horas com passos de 15 minutos), essencial
para analisar o impacto da intermitência de renováveis.

2. Análises de Sensibilidade ou Monte Carlo: Onde a variável de iteração


é um parâmetro físico (carga, impedância ou geração) que é alterado determinística ou
aleatoriamente para testar a robustez da rede.

A lógica operacional, que separa a definição do sistema da execução do cálculo, pode


ser visualizada no fluxograma da Figura 1.2.

3
Início

Definir
Circuito
Base
(Topologia)

Alterar
Variável
(Carga/GD)

Comando
.Solve()

Não Registrar
Convergiu?
Erro

Sim
Coletar
Dados
(Monitores/Memória)

Fim do
Loop?

Sim

Gerar
Gráficos

Fim

Figura 1.2: Fluxograma lógico de um script de automação.

4
1.3.1 Detalhamento das Etapas do Processo
O fluxograma da Figura 1.2 não é meramente ilustrativo; ele representa a eficiência com-
putacional do método. Abaixo, detalha-se a função técnica de cada bloco:

1. Inicialização (Definir Topologia)


Esta etapa ocorre fora do laço de repetição. Ao executar comandos como New Line ou
New Transformer, o OpenDSS constrói a Matriz de Admitância Nodal (Ybus) do sistema.

• Fundamentação: A construção da Ybus é computacionalmente custosa. Ao


mantê- la fora do loop, garantimos que a estrutura da rede seja processada apenas
uma vez, alterando-se apenas as injeções de corrente (I) durante as iterações.

2. Perturbação (Alterar Variável)


Dentro do loop, o Python atua modificando parâmetros específicos. No estudo deste
capítulo, alteramos o LoadMult. O OpenDSS é otimizado para que alterações de carga
ou tap de transformadores não exijam a reconstrução completa da matriz, tornando a
simulação extremamente veloz.

3. Solução Numérica (Solve)


O comando .Solve() dispara o método iterativo de Newton-Raphson (padrão do OpenDSS).
O motor tenta encontrar a solução para as tensões nodais (V ) que satisfaçam as equações
de potência (P, Q) para o novo cenário definido na etapa anterior.

4. Verificação de Convergência
Um ponto crítico frequentemente ignorado em scripts básicos, mas vital para a engenharia.

• Decisão: O algoritmo verifica se o método de Newton-Raphson convergiu


dentro do erro tolerável. Se o sistema não convergir (ex: colapso de tensão), os
dados resultantes são matematicamente inválidos e devem ser descartados ou
registrados como erro, evitando a contaminação das estatísticas finais.

5. Coleta de Dados via Memória


Diferente da abordagem tradicional que salva relatórios em disco (.csv) para leitura pos-
terior, a integração via DLL permite que o Python leia os resultados (tensões, correntes,
perdas) diretamente da memória RAM. Isso reduz drasticamente o tempo de I/O (In-
put/Output), viabilizando simulações de Monte Carlo e otimizações iterativas que seriam
impossíveis via troca de arquivos.

1.4 Estudo de Caso: Análise de Sensibilidade de Tensão


Para consolidar a integração Python-OpenDSS, revisitamos o sistema radial apresentado
no Exemplo 2.3 do Capítulo 2. No entanto, expandiremos a análise estática
original para um estudo dinâmico de sensibilidade, explorando os limites operacionais da
rede.

5
1.4.1 Caracterização do Sistema Base
O sistema é composto por uma fonte de tensão equivalente (Barra Infinita), um alimen-
tador de distribuição de média tensão (13.8 kV), um transformador de distribuição e uma
carga na baixa tensão (220 V).
A topologia e os parâmetros elétricos, modelados nativamente no OpenDSS, são de-
talhados nas tabelas a seguir. O objetivo é simular fielmente a impedância longitudinal
que causa a queda de tensão.

Tabela 1.1: Parâmetros da Linha de Distribuição (Matriz de Sequência Positiva)


Parâmetro Valor / Configuração
Comprimento 1.0 km
Resistência (R1) 0.086
Ω/km Reatância Indutiva (X1) 0.204
Ω/km Capacitância (C1) 2.85 nF/km
Configuração Trifásica a 3 fios

Tab ela 1.2: Especificações do Transformador de Distribuição


Parâmetro Valor
Potência Nominal 50 kVA
Relação de Tensão 13.8 kV / 0.22 kV
Conexão Delta-Estrela (Dyn1)
Reatância de Dispersão (XHL) 6%
Perdas em Carga 0.5%

1.4.2 Estratégia de Simulação e Ajuste de Carga


No exemplo original do Capítulo 2, a carga conectada era de apenas 10 kW. Para um
transformador de 50 kVA, essa carga representa apenas 20% da capacidade nominal,
resultando em uma queda de tensão desprezível e pouco didática para análises de
qualidade de energia.
Para este estudo de caso em Python, adotaremos uma abordagem de Teste de Estresse.

1. Ajuste do Ponto Base: Redefiniremos a carga nominal para P = 45 kW e Q


= 20 kVAr. Isso eleva o carregamento base para aproximadamente 98% da
capacidade do transformador (S ≈ 49.2 kVA).
2. Varredura de Carga: O algoritmo Python aplicará multiplicadores de carga
(LoadMult) variando de 0.5 (Carga Leve) a 1.5 (Sobrecarga Crítica).

Essa estratégia força o sistema a operar na região não-linear da curva de regulação,


permitindo visualizar claramente o fenômeno de afundamento de tensão e a violação dos
limites normativos.

6
1.4.3 Implementação em Python
O código a seguir implementa a modelagem descrita. Note que o Python não apenas
executa o fluxo, mas reconstrói o circuito com os novos parâmetros de estresse antes de
iniciar o laço de repetição.
1 # Importacao das bibliotecas
2 import dss
3 import matplotlib . pyplot as plt

5 # --- 1. CONFIGURACAO INICIAL ---


6 # Cria o alias para compatibilidade e define interfaces
7 DSS = dss

8 Text = DSS. Text


9 Circuit = DSS. Active Circuit

10 Solution = Circuit. Solution

11

12# --- 2. MODELAGEM DO SISTEMA ( CAMADA DE TEXTO) ---


13 Text. Command = " Clear"
14 # Definicao da Barra Infinita ( Thevenin Equivalent)

15 Text. Command = " New circuit. thevenin phases =3 basekv =13.8 bus1 = barra100
mvasc3 =2000 mvasc1 =2500 "
16

17 # Definicao do LineCode ( Matrizes de Impedancia )


18 Text. Command = (
19 " New linecode . ARRANJO_ 1 nphases =3 Base Freq =60 units=km "
20 " rmatrix =[0.086 | 0 0.088 | 0 0 0.087] "
21 " xmatrix =[0.204 | 0.095 0.19 | 0.072 0.080 0.20] "
22 " cmatrix =[2.85 | -0.92 3.00 | -0.35 -0.58 2.71]"
23 )

24

25 # Topologia : Linha de 1 km e Transformador de 50 kVA


26 Text. Command = " New line . LINHA_1 Phases =3 Bus1 = barra100 Bus2 = barra200
linecode = ARRANJO_ 1 length =1 units=km"
27 Text. Command = " New transformer. trafo A xhl=6 % loadloss =0.5 % noloadloss
=0.2 % imag =0.5 "
28 Text. Command = " ~ wdg =1 bus= barra200 conn =wye kV =13.8 kVA =50 "

29 Text. Command = " ~ wdg =2 bus= barra300 conn =wye kV =0.22 kVA =50 "

30

31 # --- DEFINICAO DA CARGA DE ESTRESSE ---


32 # Carga ajustada para 45 kW ( aprox 90% do Trafo) para evidenciar a queda
de tensao
33 Text. Command = " New load . cargal phases =3 model =1 bus1 = barra300 kv
=0.22 kw =45 kvar =20 conn = wye"
34

35 Text. Command = " Set Voltagebases =[13.8 , 0.22]"


36 Text. Command = " CalcVoltage Bases "
37

38# --- 3. LOOP DE SIMULACAO ( CICLO DE AUTOMACAO ) ---


39 # Varredura de 50% ate 150% da carga nominal
40 multiplicadores = [0.5 , 0.75 , 0.9 , 1.0 , 1.1 , 1.25 , 1.5]

41 tensoes_fase A = []

42

43 print(" Iniciando varredura de sensibilidade ...")


44

45 for fator in multiplicadores :


46 # 1. Alterar Variavel: Aplica o fator escalar a carga definida
47 Solution . Load Mult = fator

7
48

49 # 2. Resolver Fluxo de Potencia ( Snapshot)


50 Solution . Solve ()
51

52 # 3. Coletar Dados ( Leitura direta da Memoria RAM)


53 Circuit. SetActive Bus(" barra300 ")
54 v_complex = Circuit. Active Bus. pu Vmag Angle
55

56 if len ( v_complex) > 0:


57 tensoes_fase A . append ( v_complex [0]) # Magnitude Fase A ( p. u.)
58 else :
59 tensoes_fase A . append (0)
60

61 # --- 4. ANALISE GRAFICA ---


62 plt. figure ( figsize =(10 , 6))
63 plt. plot( multiplicadores , tensoes_fase A , marker=’o’, linestyle = ’ - ’,
color=’#005 b96 ’, label=’ Tensao Medida ’)
64 plt. title (’ Impacto da Variacao de Carga na Tensao ( Barra 300) ’)
65 plt. xlabel(’ Fator de Carga (1.0 = 45 kW Nominais)’)
66 plt. ylabel(’ Tensao ( pu)’)

67 plt. grid ( True , linestyle = ’ - - ’, alpha =0.6)

68

69 # Linha de referencia normativa ( PRODIST )


70 plt. axhline ( y=0.95 , color=’ red ’, linestyle = ’ - - ’, label=’ Limite Minimo
(0.95 pu)’)
71 plt. legend ()

72 plt. show ()

Listing 1.1: Script de Análise de Sensibilidade com Carga Ajustada

1.5 Análise Detalhada dos Resultados


A execução do algoritmo gera a curva de sensibilidade apresentada na Figura 1.3. Dife-
rente de uma simulação estática, este gráfico revela a "assinatura de rigidez"do alimenta-
dor, demonstrando como a impedância série dos componentes (Linha + Transformador)
afeta a qualidade da energia sob diferentes regimes de operação.

8
Figura 1.3: Perfil de tensão na Barra 300 sob variação de carga.

A análise dos pontos da curva permite dividir o comportamento do sistema em três


regiões distintas de operação:

1.5.1 1. Região de Operação Leve (Fator < 1.0)


Na parte esquerda do gráfico (Fatores 0.5 a 0.9), observamos tensões elevadas, partindo
de aproximadamente 0.985 p.u..

• Interpretação Física: Com cargas leves (abaixo da potência nominal do


transfor- mador), a corrente que circula pela linha e enrolamentos é baixa.
Consequentemente, a queda de tensão longitudinal (∆V = R · I cos ϕ + X · I sin
ϕ) é pequena.
• Status: O sistema opera com folga técnica e alta eficiência.

1.5.2 2. Região Nominal (Fator ≈ 1.0)


Ao atingirmos o fator de carga 1.0 (equivalente aos 45 kW definidos no script), a tensão
estabiliza-se em torno de 0.969 p.u..

• Validação do Modelo: Este ponto é crucial pois valida o dimensionamento


do sistema. Mesmo operando próximo à capacidade máxima do transformador (50
kVA), a tensão permanece acima de 0.95 p.u., demonstrando que, em condições
nominais de projeto, o alimentador atende aos critérios de Tensão Adequada.

1.5.3 3. Região Crítica e Violação (Fator > 1.25)


À medida que avançamos para a direita do gráfico, simulando uma sobrecarga, a inclinação
da curva se acentua. O ponto de inflexão ocorre entre os fatores 1.25 e 1.5.

9
• O Fenômeno: No fator 1.5 (150% de carga), a tensão atinge 0.951 p.u.,
tocando perigosamente o limite estabelecido pela linha vermelha tracejada.

• Análise Normativa: Segundo o PRODIST (Módulo 8), valores abaixo de 0.95


p.u. (referência de Baixa Tensão) classificam-se como Tensão Precária.

• Causa Raiz: O transformador saturado e a alta corrente na linha aumentam dras-


ticamente a perda de tensão. Além disso, como a carga foi modelada como Potência
Constante (Model=1), o OpenDSS captura o efeito "bola de neve": conforme a ten-
são cai, a carga drena ainda mais corrente para manter a potência (P = V · I), o
que derruba a tensão ainda mais.

Conclusão do Experimento: O gráfico comprova que o sistema é robusto


para a carga nominal projetada, mas possui baixa resiliência a sobrecargas. Um aumento
de 50% na demanda (algo comum em dias de calor extremo com uso de ar-condicionado)
levaria a tensão da Barra 300 para fora dos padrões de conformidade, exigindo
intervenção (ex: regulação de tap ou instalação de banco de capacitores).

10

Você também pode gostar