novo metodo de calibragem da bomba

This commit is contained in:
Diego Freitas 2026-07-03 14:13:16 -03:00
parent b7501aa2a2
commit 58181043dd
1 changed files with 91 additions and 81 deletions

View File

@ -339,6 +339,9 @@ namespace AgroBase.Models.Modules
{
var op = Variaveis.OperacaoEmAndamento;
if (op.CalibrandoRuntime)
return;
lock (_metricasLock)
{
long agoraTicks = Stopwatch.GetTimestamp();
@ -2013,7 +2016,9 @@ namespace AgroBase.Models.Modules
if (!forcar && op.ModuloEstaCalibrado(Dispositivo, Bomba.ID))
continue;
op.MarcarModuloCalibrado(Dispositivo, Bomba.ID, false);
bool BombaOk = false;
op.MarcarModuloCalibrado(Dispositivo, Bomba.ID, BombaOk);
// Sem herbicida no reservatorio, bomba nao precisa ligar
if (!Bomba.Inicializado || ContadorCarga.PercentualAtual < VariaveisEquipamento.PercentualReservatorioMin)
@ -2021,106 +2026,111 @@ namespace AgroBase.Models.Modules
Variaveis.MostrarLog($"[AtuadorModel] [RealizarTestesIniciais] Bomba não iniciada ou nível do reservatório baixo, não irá ligar a bomba {Bomba.ID}");
op.Sensoriamento.InserirLog(Dispositivo, StatusModulo.Alerta, 50, $"Bomba não iniciada ou nível do reservatório baixo, não irá ligar a bomba {Bomba.ID}", id: Bomba.ID);
op.MarcarModuloCalibrado(Dispositivo, Bomba.ID, false);
op.MarcarModuloCalibrado(Dispositivo, Bomba.ID, BombaOk);
continue;
}
bool EhBombaPressurizadora = Bomba.ID == BombaPressurizadora.ID;
double pressaoTeste = 80.0;
if (EhBombaPressurizadora)
{
EnviarComandoFisicoBomba(
Bomba,
CanMessagePosicaoDados.Command2,
setarControle: true,
status: true,
modo: ModoControleBomba.OnOff,
desligarSemBicoAberto: false
);
EnviarComandoFisicoBomba(
Bomba,
CanMessagePosicaoDados.Command1,
setarControle: true,
status: true,
potencia: 100,
pressao: pressaoTeste
);
}
else
{
bool ligar = op.Parametros.Controle.AtuAgitadorModo != ModoAgitadorCalda.SemAgitacao;
EnviarComandoFisicoBomba(
Bomba,
CanMessagePosicaoDados.Command1,
setarControle: true,
status: ligar,
potencia: 100,
pressao: -1
);
}
if (Bomba.Sensor_ID_Num == -1)
{
Variaveis.MostrarLog($"[AtuadorModel] [RealizarTestesIniciais] Bomba {Bomba.ID} não possui um sensor de pressão, será controlada mecanicamente pelo pressostato");
op.Sensoriamento.InserirLog(Dispositivo, StatusModulo.Alerta, 50, $"Bomba {Bomba.ID} não possui um sensor de pressão, será controlada mecanicamente pelo pressostato", id: Bomba.ID);
bool bombaOk = true;
if (!EhBombaPressurizadora)
if (Bomba.Sensor_ID_Num > -1)
{
bool BombaLigou() => Bomba.ComandoAtuar == (Bomba._EstadoLeitura == Estado.Ligado);
await FuncoesGlobais.AguardarCondicaoAsync(BombaLigou, 3000, 200);
bombaOk = BombaLigou();
// Alivia pressao da linha
BicosPulverizadores.Where(x => x.Inicializado && x.Comandar).ToList().ForEach(Bico => EnviarComandoFisicoBico(Bico, CanMessagePosicaoDados.Command1, setarControle: true, status: true));
await Task.Delay(3000);
BicosPulverizadores.Where(x => x.Inicializado && x.Comandar).ToList().ForEach(Bico => EnviarComandoFisicoBico(Bico, CanMessagePosicaoDados.Command1, setarControle: true, status: false));
await Task.Delay(1000);
double pressaoTeste = 80.0;
double difPressaoTeste = 40.0;
double pressaoInicialTeste = Bomba._PressaoAtual;
try
{
EnviarComandoFisicoBomba(
Bomba,
CanMessagePosicaoDados.Command2,
setarControle: true,
status: true,
modo: ModoControleBomba.OnOff,
desligarSemBicoAberto: false
);
EnviarComandoFisicoBomba(
Bomba,
CanMessagePosicaoDados.Command1,
setarControle: true,
status: true,
potencia: 100,
pressao: pressaoTeste
);
await FuncoesGlobais.AguardarCondicaoAsync(() => Bomba.AtingiuPressao(pressaoTeste), 3000, 200);
bool pressaoSubiu = Bomba._PressaoAtual - pressaoInicialTeste >= difPressaoTeste;
BombaOk = (Bomba.AtingiuPressao(pressaoTeste) && pressaoSubiu) || !Bomba.Mandatorio;
op.MarcarModuloCalibrado(Dispositivo, Bomba.ID, BombaOk);
}
finally
{
EnviarComandoFisicoBomba(
Bomba,
CanMessagePosicaoDados.Command2,
setarControle: true,
status: false,
modo: op.Parametros.Controle.AtuModoControle,
desligarSemBicoAberto: true,
potenciaMinPid: Bomba.Controle.PotenciaMinPID,
Kp: Bomba.Controle.Kp,
Ki: Bomba.Controle.Ki,
Kd: Bomba.Controle.Kd
);
EnviarComandoFisicoBomba(
Bomba,
CanMessagePosicaoDados.Command1,
setarControle: true,
status: false,
potencia: 100,
pressao: op.Parametros.Controle.AtuPressaoLinha
);
}
}
else
{
Variaveis.MostrarLog($"[AtuadorModel] [RealizarTestesIniciais] Bomba {Bomba.ID} não possui um sensor de pressão, será controlada mecanicamente pelo pressostato");
op.Sensoriamento.InserirLog(Dispositivo, StatusModulo.Alerta, 50, $"Bomba {Bomba.ID} não possui um sensor de pressão, será controlada mecanicamente pelo pressostato", id: Bomba.ID);
BombaOk = true;
op.MarcarModuloCalibrado(Dispositivo, Bomba.ID, BombaOk);
}
op.MarcarModuloCalibrado(Dispositivo, Bomba.ID, bombaOk);
continue;
}
await FuncoesGlobais.AguardarCondicaoAsync(() => Bomba.AtingiuPressao(pressaoTeste), 3000, 200);
bool BombaOk = Bomba.AtingiuPressao(pressaoTeste);
op.MarcarModuloCalibrado(Dispositivo, Bomba.ID, BombaOk);
if (EhBombaPressurizadora)
{
EnviarComandoFisicoBomba(
Bomba,
CanMessagePosicaoDados.Command2,
setarControle: true,
status: true,
modo: op.Parametros.Controle.AtuModoControle,
desligarSemBicoAberto: true,
potenciaMinPid: Bomba.Controle.PotenciaMinPID,
Kp: Bomba.Controle.Kp,
Ki: Bomba.Controle.Ki,
Kd: Bomba.Controle.Kd
);
EnviarComandoFisicoBomba(
Bomba,
CanMessagePosicaoDados.Command1,
setarControle: true,
status: op.Parametros.Controle.PulverizadorAutomatico,
potencia: 100,
pressao: op.Parametros.Controle.AtuPressaoLinha
);
}
else
{
bool ligar = op.Parametros.Controle.AtuAgitadorModo != ModoAgitadorCalda.SemAgitacao;
EnviarComandoFisicoBomba(
Bomba,
CanMessagePosicaoDados.Command1,
setarControle: true,
status: ligar,
status: true,
potencia: 100,
pressao: -1
);
bool BombaLigou() => Bomba.ComandoAtuar == (Bomba._EstadoLeitura == Estado.Ligado);
await FuncoesGlobais.AguardarCondicaoAsync(BombaLigou, 3000, 200);
BombaOk = BombaLigou() || !Bomba.Mandatorio;
op.MarcarModuloCalibrado(Dispositivo, Bomba.ID, BombaOk);
EnviarComandoFisicoBomba(
Bomba,
CanMessagePosicaoDados.Command1,
setarControle: true,
status: false,
potencia: 100,
pressao: -1
);
}
}
// Testar os bicos