# Powerdistancer
https://github.com/rpp396/Powerdistancer/
###### tags: `Entregable 9`
---
- [x] Crear estructura de proyecto para dividir trabajos entre DGM y RPP
- [x] Definir estructura de datos Sistema_trifasico.
- [ ] Ver estructura de [StructuralDynamicsODESolvers.jl](https://github.com/ONSAS/StructuralDynamicsODESolvers.jl) y usar esa forma para aplicar los diferentes algoritmos.
- [ ] Definir interfase IO para aplicar los distintos aglritmos como Solvers
---
Estructura del proyecto:
* PowerDistancer
* /scr
* Powerdistancer.jl (es el Module)
* estructurasDatos.jl (para contener las structs a usar)
* /Algoritmos
* AlgoritmosDistancia.jl
* AlgoritmosFrecuencia.jl
* AlgoritmosFasores.jl
* AlgoritmosTiempoDeFalta.jl
* AlgoritmosLazoDeFalta.jl
## Daniel (DGM)
### Funciones
* #### Desarrollos comunes
* ##### Documenter
Estuve seteando el Documenter para empezar a organizar la futura documentación. También busqué y configuré un paquete (DocumenterCitations) para trabajar mejor las referencias a los articulos o papers utilizados.
* ##### Test
Revisión de la estructura de test y separación por bloques según desarrollador.
* ##### Interface
Diseño de intercafes del módulo .
* #### obtenerFrecuencia
* estimate_frequency
Implementacion de algoritmo Hybrid Estimation Frecuency (FE_HFE) para la estimacion de la frecuencia.
* #### obtenerTiempoDeFalta
* #### rms_calculation
* Implementación de un método de cálculo del valor RMS de la señal teniendo en cuenta relación entre frecuencia de la onda y la frecuencia de muestreo.
* #### AlgoritmosLazoDeFalta.jl
* #### distanciaM1
* #### distanciaM2
### Dudas
---
## Rodrigo (RPP)
### Funciones
### generarSeno
La funcion generar seno sirve para evaluar diferentes algorimos usando una entrada conocida.
#### obtenerCanales.jl
Voy a probar Pluto para generar la interacción con el usuario.
Sería la unica función que precisa la interacción del usuario
Pretendo que la función tome los siguientes parametros:
1. el path de los archivos comtrade
2. en que orden están los canales (podria llegar a aplicarse alguna inteligencia para detectarlos automáticamente.)
3. la impedancia por km de linea en valores primarios o secundarios.
#### obtenerFasores
#### distanciaM3
#### distanciaM4
### Dudas
### Notas
Literate.jl #herramienta para generar ejemplos y Test
DocStringExtensions.jl #para automatizar la firma de la función en la documentación
Plots recipes #Para hacer recetas de ploteo
https://github.com/JuliaTesting/Aqua.jl
---
## Reunion con Daniel del 4/11/2022
#### Canales
Dado
```julia
struct Canal
nombre::String #nombre del canal: vr,vs,vt,ir,is,it
valores_instantaneos::Any #vector de reales (valores instantáneos)
unidad::String #Volt, Amper, Hz, etc...
end
```
En `valor_instantaneos` pareceria que `Vector{Float64}` es suficiente, en ese caso es mejor que poner `Any`:
```julia
struct Canal
nombre::String #nombre del canal: vr,vs,vt,ir,is,it
valores_instantaneos::Vector{Float64} #vector de reales (valores instantáneos)
unidad::String #Volt, Amper, Hz, etc...
end
```
En un tercera iteracion, podrian poner
```julia
using Unitful
struct Canal{T}
nombre::String #nombre del canal: vr,vs,vt,ir,is,it
valores_instantaneos::Vector{T}
end
```
Por ejemplo:
```julia
julia> [1u"Hz", 2u"Hz"]
2-element Vector{Quantity{Int64, 𝐓^-1, Unitful.FreeUnits{(Hz,), 𝐓^-1, nothing}}}:
1 Hz
2 Hz
```
es un vector en Herzios.
Otro ejemplo con distancias:
```julia
julia> x = [1u"m", 2u"m"]
2-element Vector{Quantity{Int64, 𝐋, Unitful.FreeUnits{(m,), 𝐋, nothing}}}:
1 m
2 m
julia> y = u"cm".(x)
2-element Vector{Quantity{Int64, 𝐋, Unitful.FreeUnits{(cm,), 𝐋, nothing}}}:
100 cm
200 cm
```
```julia
julia> y[1] + x[1]
2//1 m
```
```julia
julia> 1u"cm" + 1u"s"
ERROR: DimensionError: 1 cm and 1 s are not dimensionally compatible.
Stacktrace:
[1] +(x::Quantity{Int64, 𝐋, Unitful.FreeUnits{(cm,), 𝐋, nothing}}, y::Quantity{Int64, 𝐓, Unitful.FreeUnits{(s,), 𝐓, nothing}})
@ Unitful ~/.julia/packages/Unitful/ApCuY/src/quantities.jl:133
[2] top-level scope
@ REPL[17]:1
```
Con unidades electricas (escribir `\Omega[TAB]`)
```julia
julia> 1u"V/A" + 1u"Ω"
2 kg m^2 A^-2 s^-3
```
Usar `@enum` para los valores admisibles
```julia
julia> @enum Trifasico Fase1 Fase2 Fase3
julia> Fase1
Fase1::Trifasico = 0
julia> Fase2
Fase2::Trifasico = 1
julia> Fase3
Fase3::Trifasico = 2
```
- `frecuencia_muestreo::Any` -> `::Float64`
### Algoritmo generico para estimar frecuencia
Idea:
```julia
abstract struct FrequencyEstimator end # << tipo abstracto
Base.@kwdef struct HFE <: FrequencyEstimator
fn=5
fs=1000
end
# metodo por defecto
estimate_frequency(datos, n::Integer) = estimate_frequency(HFE(), datos, n)
function estimate_frequency(alg::HFE, datos, n::Integer)
fn = alg.fn
fs = alg.fs
# datos un array con las muestras
# n en que indice del vector tengo que calcular la frecuencia
# fn frecuencia nominal del sistema
# fs frecuencia de muestreo
ciclo=datos[n:Integer(n+ceil(fs/fn))]
display(plot(ciclo))
cruces=_NZC(ciclo)
f_est= length(cruces)>=2 ? fs/((cruces[2]-cruces[1])*2) : fn
f_i=f_est
grado=1
error=1 #valor inicial para comenzar bucle
while (error > 0.0005) & (grado < 9)
ciclo=DMF(datos[n:Integer(n+ceil(fs/fn)+grado+1)],grado)
display(plot!(ciclo))
cruces=_NZC(ciclo)
# println(cruces)
f_i= length(cruces)>=2 ? fs/((cruces[2]-cruces[1])*2) : f_i
error=abs(f_est-f_i)
println("grado ",grado," F_est ",f_est, " f_i ",f_i)
f_est=f_i
grado+=1
end
return f_est
end
```
## Estilo
- Activar JuliaFormatter al guardar el archivo.
- https://www.kutombawewe.net/es/visual-studio-code/como-formatear-el-codigo-en-guardar-en-el-codigo-vs/828268457/
## Algoritmo de lazo de falta
- Metodo elegido, articulo.
-
## Metodos de debugging
- `Infiltrator.jl`