Ajustes de autonomia parado
This commit is contained in:
parent
3df756a69d
commit
561a299dae
|
|
@ -8,10 +8,11 @@ namespace AgroBase.Services
|
||||||
{
|
{
|
||||||
public class CoulombCounterService
|
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;
|
double coulombsMax = _max_Amp * 3600;
|
||||||
CargaMaxima = coulombsMax;
|
CargaMaxima = coulombsMax;
|
||||||
|
WhPorMetroBase = w_m_base;
|
||||||
//double consumo = (Variaveis.OperacaoEmAndamento.DispSen?.Dados?.BateriaCargaConsumida ?? 0);
|
//double consumo = (Variaveis.OperacaoEmAndamento.DispSen?.Dados?.BateriaCargaConsumida ?? 0);
|
||||||
//Consumido = consumo < CargaMaxima ? consumo : 0;
|
//Consumido = consumo < CargaMaxima ? consumo : 0;
|
||||||
Consumido = 0;
|
Consumido = 0;
|
||||||
|
|
@ -88,6 +89,17 @@ namespace AgroBase.Services
|
||||||
}
|
}
|
||||||
|
|
||||||
public double WhPorMetro { get; private set; }
|
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 DistanciaMaximaTeorica_m { get; private set; }
|
||||||
public double DistanciaMaximaSegura_m { get; private set; }
|
public double DistanciaMaximaSegura_m { get; private set; }
|
||||||
public double DistanciaEstimadaRestante_m { get; private set; }
|
public double DistanciaEstimadaRestante_m { get; private set; }
|
||||||
|
|
@ -212,10 +224,22 @@ namespace AgroBase.Services
|
||||||
WhPorMetro = 0;
|
WhPorMetro = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Calcula distâncias máxima teórica e segura
|
if (WhPorMetro > 0)
|
||||||
if (WhPorMetro > 0 && WhRestante > 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);
|
double margem = FuncoesMatematicas.Clamp(MargemSegurancaAutonomia, 0.0, 0.9);
|
||||||
DistanciaMaximaSegura_m = DistanciaMaximaTeorica_m * (1.0 - margem);
|
DistanciaMaximaSegura_m = DistanciaMaximaTeorica_m * (1.0 - margem);
|
||||||
|
|
@ -224,6 +248,7 @@ namespace AgroBase.Services
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
// aqui sim, caso extremo sem nada configurado
|
||||||
DistanciaMaximaTeorica_m = 0;
|
DistanciaMaximaTeorica_m = 0;
|
||||||
DistanciaMaximaSegura_m = 0;
|
DistanciaMaximaSegura_m = 0;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -8,12 +8,13 @@ namespace AgroBase.Services
|
||||||
{
|
{
|
||||||
public class HerbicideCounterService
|
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;
|
CapacidadeLitros = capacidadeLitros;
|
||||||
VolumeAtual_L = 0;
|
VolumeAtual_L = 0;
|
||||||
VolumeConsumido_L = 0;
|
VolumeConsumido_L = 0;
|
||||||
DensidadeProduto = densidadeProduto;
|
DensidadeProduto = densidadeProduto;
|
||||||
|
LPorMetroBase = l_m_base;
|
||||||
|
|
||||||
MargemSegurancaAutonomia = 0.30; // 30% por padrão
|
MargemSegurancaAutonomia = 0.30; // 30% por padrão
|
||||||
}
|
}
|
||||||
|
|
@ -80,6 +81,19 @@ namespace AgroBase.Services
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public double LPorMetro { get; private set; }
|
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>
|
/// <summary>
|
||||||
/// Distância máxima teórica que ainda pode ser pulverizada (sem margem), em metros.
|
/// Distância máxima teórica que ainda pode ser pulverizada (sem margem), em metros.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|
@ -232,6 +246,12 @@ namespace AgroBase.Services
|
||||||
if (_somaDistanciaJanela_m > 0 && _somaVolumeDistJanela_L > 0)
|
if (_somaDistanciaJanela_m > 0 && _somaVolumeDistJanela_L > 0)
|
||||||
{
|
{
|
||||||
LPorMetro = _somaVolumeDistJanela_L / _somaDistanciaJanela_m;
|
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) -----
|
// ----- 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
|
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