Ajustes de autonomia parado
This commit is contained in:
parent
3df756a69d
commit
561a299dae
|
|
@ -8,10 +8,11 @@ namespace AgroBase.Services
|
|||
{
|
||||
public class CoulombCounterService
|
||||
{
|
||||
public CoulombCounterService(double _max_Amp)
|
||||
public CoulombCounterService(double _max_Amp, double w_m_base = 0.1167) // 3 km/h ~ 350 wh
|
||||
{
|
||||
double coulombsMax = _max_Amp * 3600;
|
||||
CargaMaxima = coulombsMax;
|
||||
WhPorMetroBase = w_m_base;
|
||||
//double consumo = (Variaveis.OperacaoEmAndamento.DispSen?.Dados?.BateriaCargaConsumida ?? 0);
|
||||
//Consumido = consumo < CargaMaxima ? consumo : 0;
|
||||
Consumido = 0;
|
||||
|
|
@ -88,6 +89,17 @@ namespace AgroBase.Services
|
|||
}
|
||||
|
||||
public double WhPorMetro { get; private set; }
|
||||
public double WhPorMetroBase { get; set; } // configurado externamente
|
||||
public double WhPorMetroHistorico { get; private set; }
|
||||
public double WhPorMetroReferencia
|
||||
{
|
||||
get
|
||||
{
|
||||
if (WhPorMetro > 0) return WhPorMetro;
|
||||
if (WhPorMetroHistorico > 0) return WhPorMetroHistorico;
|
||||
return WhPorMetroBase; // pode ser 0 se você não configurar
|
||||
}
|
||||
}
|
||||
public double DistanciaMaximaTeorica_m { get; private set; }
|
||||
public double DistanciaMaximaSegura_m { get; private set; }
|
||||
public double DistanciaEstimadaRestante_m { get; private set; }
|
||||
|
|
@ -212,10 +224,22 @@ namespace AgroBase.Services
|
|||
WhPorMetro = 0;
|
||||
}
|
||||
|
||||
// Calcula distâncias máxima teórica e segura
|
||||
if (WhPorMetro > 0 && WhRestante > 0)
|
||||
if (WhPorMetro > 0)
|
||||
{
|
||||
DistanciaMaximaTeorica_m = WhRestante / WhPorMetro;
|
||||
// EMA simples
|
||||
double alpha = 0.2; // suavização
|
||||
if (WhPorMetroHistorico <= 0)
|
||||
WhPorMetroHistorico = WhPorMetro;
|
||||
else
|
||||
WhPorMetroHistorico = WhPorMetroHistorico * (1 - alpha) + WhPorMetro * alpha;
|
||||
}
|
||||
|
||||
// Calcula distâncias máxima teórica e segura
|
||||
double consumoRef_WhPorMetro = WhPorMetroReferencia;
|
||||
|
||||
if (consumoRef_WhPorMetro > 0 && WhRestante > 0)
|
||||
{
|
||||
DistanciaMaximaTeorica_m = WhRestante / consumoRef_WhPorMetro;
|
||||
|
||||
double margem = FuncoesMatematicas.Clamp(MargemSegurancaAutonomia, 0.0, 0.9);
|
||||
DistanciaMaximaSegura_m = DistanciaMaximaTeorica_m * (1.0 - margem);
|
||||
|
|
@ -224,6 +248,7 @@ namespace AgroBase.Services
|
|||
}
|
||||
else
|
||||
{
|
||||
// aqui sim, caso extremo sem nada configurado
|
||||
DistanciaMaximaTeorica_m = 0;
|
||||
DistanciaMaximaSegura_m = 0;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -8,12 +8,13 @@ namespace AgroBase.Services
|
|||
{
|
||||
public class HerbicideCounterService
|
||||
{
|
||||
public HerbicideCounterService(double capacidadeLitros, double densidadeProduto)
|
||||
public HerbicideCounterService(double capacidadeLitros, double densidadeProduto, double l_m_base = 0.1188) // 3km/h ~ 3x 35 ml/s
|
||||
{
|
||||
CapacidadeLitros = capacidadeLitros;
|
||||
VolumeAtual_L = 0;
|
||||
VolumeConsumido_L = 0;
|
||||
DensidadeProduto = densidadeProduto;
|
||||
LPorMetroBase = l_m_base;
|
||||
|
||||
MargemSegurancaAutonomia = 0.30; // 30% por padrão
|
||||
}
|
||||
|
|
@ -80,6 +81,19 @@ namespace AgroBase.Services
|
|||
/// </summary>
|
||||
public double LPorMetro { get; private set; }
|
||||
|
||||
public double LPorMetroBase { get; set; }
|
||||
public double LPorMetroHistorico { get; private set; }
|
||||
|
||||
public double LPorMetroReferencia
|
||||
{
|
||||
get
|
||||
{
|
||||
if (LPorMetro > 0) return LPorMetro;
|
||||
if (LPorMetroHistorico > 0) return LPorMetroHistorico;
|
||||
return LPorMetroBase;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Distância máxima teórica que ainda pode ser pulverizada (sem margem), em metros.
|
||||
/// </summary>
|
||||
|
|
@ -232,6 +246,12 @@ namespace AgroBase.Services
|
|||
if (_somaDistanciaJanela_m > 0 && _somaVolumeDistJanela_L > 0)
|
||||
{
|
||||
LPorMetro = _somaVolumeDistJanela_L / _somaDistanciaJanela_m;
|
||||
|
||||
double alpha = 0.2;
|
||||
if (LPorMetroHistorico <= 0)
|
||||
LPorMetroHistorico = LPorMetro;
|
||||
else
|
||||
LPorMetroHistorico = LPorMetroHistorico * (1 - alpha) + LPorMetro * alpha;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -279,13 +299,21 @@ namespace AgroBase.Services
|
|||
}
|
||||
|
||||
// ----- Tempo máximo pulverizando (min) -----
|
||||
if (VolumeAtual_L > 0 && LPorMinuto > 0)
|
||||
double consumoRef_LPorMetro = LPorMetroReferencia;
|
||||
|
||||
if (VolumeAtual_L > 0 && consumoRef_LPorMetro > 0)
|
||||
{
|
||||
TempoEstimadoMinutosPulverizando = VolumeAtual_L / LPorMinuto;
|
||||
DistanciaMaximaTeorica_m = VolumeAtual_L / consumoRef_LPorMetro;
|
||||
|
||||
double margem = FuncoesMatematicas.Clamp(MargemSegurancaAutonomia, 0.0, 0.9);
|
||||
DistanciaMaximaSegura_m = DistanciaMaximaTeorica_m * (1.0 - margem);
|
||||
if (DistanciaMaximaSegura_m < 0)
|
||||
DistanciaMaximaSegura_m = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
TempoEstimadoMinutosPulverizando = 0;
|
||||
DistanciaMaximaTeorica_m = 0;
|
||||
DistanciaMaximaSegura_m = 0;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
File diff suppressed because one or more lines are too long
Loading…
Reference in New Issue