From 58181043ddfb12402eb167b9c78c25ce1240179e Mon Sep 17 00:00:00 2001 From: Diego Freitas Date: Fri, 3 Jul 2026 14:13:16 -0300 Subject: [PATCH] novo metodo de calibragem da bomba --- .../AgroBase/Models/Modules/AtuadorModel.cs | 172 +++++++++--------- 1 file changed, 91 insertions(+), 81 deletions(-) diff --git a/AgroBase/AgroBase/Models/Modules/AtuadorModel.cs b/AgroBase/AgroBase/Models/Modules/AtuadorModel.cs index 7ab3378b7..2e9d7ec70 100644 --- a/AgroBase/AgroBase/Models/Modules/AtuadorModel.cs +++ b/AgroBase/AgroBase/Models/Modules/AtuadorModel.cs @@ -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