From 2f37aa1c9c6bcb3c8a2e4a4d540fe87fa9cebc9f Mon Sep 17 00:00:00 2001 From: Diego Freitas Date: Fri, 3 Jul 2026 09:32:25 -0300 Subject: [PATCH] Atualizado forma de calibragem do atuador --- .../AgroBase/Models/Modules/AtuadorModel.cs | 112 +++++++++++------- .../Modulos/BombaPressurizadoraModel_v2.h | 14 ++- 2 files changed, 79 insertions(+), 47 deletions(-) diff --git a/AgroBase/AgroBase/Models/Modules/AtuadorModel.cs b/AgroBase/AgroBase/Models/Modules/AtuadorModel.cs index 7d703c2ce..e202bc912 100644 --- a/AgroBase/AgroBase/Models/Modules/AtuadorModel.cs +++ b/AgroBase/AgroBase/Models/Modules/AtuadorModel.cs @@ -1915,7 +1915,8 @@ namespace AgroBase.Models.Modules double? potenciaMinPid = null, double? Kp = null, double? Ki = null, - double? Kd = null + double? Kd = null, + bool? desligarSemBicoAberto = null ) { var dispAtu = Variaveis.OperacaoEmAndamento?.DispAtu; @@ -1926,7 +1927,8 @@ namespace AgroBase.Models.Modules bool comandoControle = bomba.ComandoAtuar; double potenciaControle = bomba.PotenciaSP; double pressaoControle = bomba.PressaoSP; - var modoControle = bomba.Controle.Modo; + ModoControleBomba modoControle = bomba.Controle.Modo; + bool desligarSemBicoAbertoControle = bomba.Controle.DesligarSemBicosAbertos; double potenciaMinPidControle = bomba.Controle.PotenciaMinPID; double kpControle = bomba.Controle.Kp; double kiControle = bomba.Controle.Ki; @@ -1942,6 +1944,7 @@ namespace AgroBase.Models.Modules } if (modo.HasValue) bomba.Controle.Modo = modo.Value; + if (desligarSemBicoAberto.HasValue) bomba.Controle.DesligarSemBicosAbertos = desligarSemBicoAberto.Value; if (potenciaMinPid.HasValue) bomba.Controle.PotenciaMinPID = potenciaMinPid.Value; if (Kp.HasValue) bomba.Controle.Kp = Kp.Value; if (Ki.HasValue) bomba.Controle.Ki = Ki.Value; @@ -1962,6 +1965,7 @@ namespace AgroBase.Models.Modules bomba.PotenciaSP = potenciaControle; bomba.PressaoSP = pressaoControle; bomba.Controle.Modo = modoControle; + bomba.Controle.DesligarSemBicosAbertos = desligarSemBicoAbertoControle; bomba.Controle.PotenciaMinPID = potenciaMinPidControle; bomba.Controle.Kp = kpControle; bomba.Controle.Ki = kiControle; @@ -2021,18 +2025,18 @@ namespace AgroBase.Models.Modules continue; } - if (Bomba.ID == BombaPressurizadora.ID) + bool EhBombaPressurizadora = Bomba.ID == BombaPressurizadora.ID; + double pressaoTeste = 80.0; + + if (EhBombaPressurizadora) { EnviarComandoFisicoBomba( Bomba, CanMessagePosicaoDados.Command2, setarControle: true, status: true, - modo: op.Parametros.Controle.AtuModoControle, - potenciaMinPid: Bomba.Controle.PotenciaMinPID, - Kp: Bomba.Controle.Kp, - Ki: Bomba.Controle.Ki, - Kd: Bomba.Controle.Kd + modo: ModoControleBomba.OnOff, + desligarSemBicoAberto: false ); EnviarComandoFisicoBomba( @@ -2041,7 +2045,7 @@ namespace AgroBase.Models.Modules setarControle: true, status: true, potencia: 100, - pressao: op.Parametros.Controle.AtuPressaoLinha + pressao: pressaoTeste ); } else @@ -2061,46 +2065,62 @@ namespace AgroBase.Models.Modules { 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); - op.MarcarModuloCalibrado(Dispositivo, Bomba.ID, true); + + bool bombaOk = true; + + if (!EhBombaPressurizadora) + { + bool BombaLigou() => Bomba.ComandoAtuar == (Bomba._EstadoLeitura == Estado.Ligado); + await FuncoesGlobais.AguardarCondicaoAsync(BombaLigou, 3000, 200); + bombaOk = BombaLigou(); + } + + op.MarcarModuloCalibrado(Dispositivo, Bomba.ID, bombaOk); continue; } - await FuncoesGlobais.AguardarCondicaoAsync(Bomba.AtingiuPressao, 3000, 200); + await FuncoesGlobais.AguardarCondicaoAsync(() => Bomba.AtingiuPressao(pressaoTeste), 3000, 200); - bool BombaOk = Bomba.AtingiuPressao(); - if (BombaOk) + bool BombaOk = Bomba.AtingiuPressao(pressaoTeste); + op.MarcarModuloCalibrado(Dispositivo, Bomba.ID, BombaOk); + + if (EhBombaPressurizadora) { - op.MarcarModuloCalibrado(Dispositivo, Bomba.ID, true); + 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 { - foreach (var Bico in BicosPulverizadores.Where(x => x.Comandar && x.Inicializado)) - { - EnviarComandoFisicoBico( - Bico, - CanMessagePosicaoDados.Command1, - setarControle: true, - status: true - ); - } - - await Task.Delay(3000); - - foreach (var Bico in BicosPulverizadores.Where(x => x.Comandar && x.Inicializado)) - { - EnviarComandoFisicoBico( - Bico, - CanMessagePosicaoDados.Command1, - setarControle: true, - status: false - ); - } - - await FuncoesGlobais.AguardarCondicaoAsync(Bomba.AtingiuPressao, 4000, 200); - - BombaOk = Bomba.AtingiuPressao(); - op.MarcarModuloCalibrado(Dispositivo, Bomba.ID, BombaOk); + bool ligar = op.Parametros.Controle.AtuAgitadorModo != ModoAgitadorCalda.SemAgitacao; + EnviarComandoFisicoBomba( + Bomba, + CanMessagePosicaoDados.Command1, + setarControle: true, + status: ligar, + potencia: 100, + pressao: -1 + ); } + } // Testar os bicos @@ -2606,6 +2626,7 @@ namespace AgroBase.Models.Modules new byte[] { (byte)Controle.Modo, + (byte)(Controle.DesligarSemBicosAbertos ? 1 : 0), (byte)Controle.PotenciaMinPID, ConverterPIDParaByte(Controle.Kp), ConverterPIDParaByte(Controle.Ki), @@ -2621,13 +2642,22 @@ namespace AgroBase.Models.Modules } } - public bool AtingiuPressao() => _PressaoAtual >= Variaveis.OperacaoEmAndamento.Parametros.Controle.AtuPressaoLinha; + public bool AtingiuPressao(double? pressaoMinima = null) + { + double alvo = pressaoMinima + ?? Variaveis.OperacaoEmAndamento?.Parametros?.Controle?.AtuPressaoLinha + ?? -1; + + return _PressaoAtual >= alvo; + } public class BombaModoControleModel { public ModoControleBomba Modo { get; set; } = ModoControleBomba.OnOff; + public bool DesligarSemBicosAbertos { get; set; } = true; + public double PotenciaMinPID { get; set; } = 40.0; public double Kp { get; set; } = 0.08; diff --git a/Firmware/Modulos/BombaPressurizadoraModel_v2.h b/Firmware/Modulos/BombaPressurizadoraModel_v2.h index f35d17b19..6f42e70df 100644 --- a/Firmware/Modulos/BombaPressurizadoraModel_v2.h +++ b/Firmware/Modulos/BombaPressurizadoraModel_v2.h @@ -668,22 +668,24 @@ class BombaPressurizadora_v2 : public ComponenteCAN { Estado novoEstado = (Estado)data[2]; double potencia = (data.size() > 3) ? (double)data[3] : _PotenciaSP; double pressao = (data.size() > 4) ? (double)data[4] : _PressaoSP; - AtualizarControle(novoEstado, potencia, pressao); return true; } case CanMessagePosicaoDados::Command2: { - if (data.size() < 7) { + if (data.size() < 8) { MostrarLog("Command2 invalido para bomba"); return false; } ModoControleBomba modo = static_cast(data[2]); - double potenciaMin = (double)data[3]; - double kp = ((double)data[4]) / 10.0; - double ki = ((double)data[5]) / 10.0; - double kd = ((double)data[6]) / 10.0; + bool desligarSemBicoAberto = (data.size() > 3) ? (int)data[3] == 1 : DesligarSemBicosAbertos; + double potenciaMin = (double)data[4]; + double kp = ((double)data[5]) / 10.0; + double ki = ((double)data[6]) / 10.0; + double kd = ((double)data[7]) / 10.0; + + DesligarSemBicosAbertos = desligarSemBicoAberto; ConfigurarModoControle(modo); ConfigurarPID(kp, ki, kd, potenciaMin, PotenciaMaxPID);