Adicionado regra tatica para parar o carro se a bomba cavitar

This commit is contained in:
Diego Freitas 2026-03-23 09:44:45 -03:00
parent 59669a6181
commit 878e7b5195
4 changed files with 53 additions and 4 deletions

View File

@ -2387,6 +2387,7 @@ namespace AgroBase.Models
var _DispMvd = Variaveis.OperacaoEmAndamento.DispMvd; var _DispMvd = Variaveis.OperacaoEmAndamento.DispMvd;
var _DispAtu = Variaveis.OperacaoEmAndamento.DispAtu; var _DispAtu = Variaveis.OperacaoEmAndamento.DispAtu;
var _DispSen = Variaveis.OperacaoEmAndamento.DispSen; var _DispSen = Variaveis.OperacaoEmAndamento.DispSen;
var pControle = Variaveis.OperacaoEmAndamento.Parametros.Controle;
var _Controle = Variaveis.OperacaoEmAndamento.Controle; var _Controle = Variaveis.OperacaoEmAndamento.Controle;
var _Bateria = _DispSen?.Dados?.ContadorCarga; var _Bateria = _DispSen?.Dados?.ContadorCarga;
var _Reservatorio = _DispAtu?.Dados?.ContadorCarga; var _Reservatorio = _DispAtu?.Dados?.ContadorCarga;
@ -2419,6 +2420,7 @@ namespace AgroBase.Models
IndiceImpacto = imu_iniciado ? sIMU.impacto_idx : 0, IndiceImpacto = imu_iniciado ? sIMU.impacto_idx : 0,
} : new OperacaoSensoriamentoLogImuModel(); } : new OperacaoSensoriamentoLogImuModel();
var bombaLinha = _DispAtu?.Dados?.BombasPressurizadoras?.FirstOrDefault(x => x.ID == "BMBLN");
var dadosAtuador = _DispAtu != null ? new OperacaoSensoriamentoLogAtuModel() var dadosAtuador = _DispAtu != null ? new OperacaoSensoriamentoLogAtuModel()
{ {
QtdCamerasSolo = _DispSen.Dados.CamerasSolo.Count, QtdCamerasSolo = _DispSen.Dados.CamerasSolo.Count,
@ -2437,10 +2439,11 @@ namespace AgroBase.Models
VazaoInstantaneaCalc = _DispAtu.Dados.VazaoFluxoMLpSInstantaneaCalc, VazaoInstantaneaCalc = _DispAtu.Dados.VazaoFluxoMLpSInstantaneaCalc,
VazaoMedia = _DispAtu.Dados.VazaoMediaMLs, VazaoMedia = _DispAtu.Dados.VazaoMediaMLs,
TempoBombaAtuada = _DispAtu.Dados.TempoAtuado, TempoBombaAtuada = _DispAtu.Dados.TempoAtuado,
ComandoBomba = _DispAtu.Dados.BombasPressurizadoras.FirstOrDefault().ComandoAtuar, ComandoBomba = bombaLinha.ComandoAtuar,
LeituraComandoBomba = _DispAtu.Dados.BombasPressurizadoras.FirstOrDefault()._EstadoLeitura == Estado.Ligado, LeituraComandoBomba = bombaLinha._EstadoLeitura == Estado.Ligado,
LeituraPotenciaBomba = FuncoesMatematicas.Clamp(_DispAtu.Dados.BombasPressurizadoras.FirstOrDefault()._Potencia, 0, 100), LeituraPotenciaBomba = FuncoesMatematicas.Clamp(bombaLinha._Potencia, 0, 100),
VolumeVazaoMl = _DispAtu.Dados.VolumeVazadoML, VolumeVazaoMl = _DispAtu.Dados.VolumeVazadoML,
BombaCavitada = _DispAtu.Dados.Conectado && _DispAtu.Dados.PressaoLinha < pControle.AtuPressaoLinha && _DispAtu.Dados.PressaoLinha < VariaveisEquipamento.PressaoMinimaCavitacao && bombaLinha._EstadoLeitura == Estado.Ligado && bombaLinha._Potencia > 20,
Iniciados = _DispAtu.Dados.Sensores.Select(s => new { s.ID, s.Inicializado }).Union(_DispAtu.Dados.BicosPulverizadores.Select(b => new { b.ID, b.Inicializado })).Union(_DispAtu.Dados.BombasPressurizadoras.Select(b => new { b.ID, b.Inicializado })).ToDictionary(x => x.ID, x => x.Inicializado), Iniciados = _DispAtu.Dados.Sensores.Select(s => new { s.ID, s.Inicializado }).Union(_DispAtu.Dados.BicosPulverizadores.Select(b => new { b.ID, b.Inicializado })).Union(_DispAtu.Dados.BombasPressurizadoras.Select(b => new { b.ID, b.Inicializado })).ToDictionary(x => x.ID, x => x.Inicializado),
AnguloBarraEsquerda = _DispAtu.Dados.AnguloBarraEsquerda, AnguloBarraEsquerda = _DispAtu.Dados.AnguloBarraEsquerda,
AnguloBarraDireita = _DispAtu.Dados.AnguloBarraDireita, AnguloBarraDireita = _DispAtu.Dados.AnguloBarraDireita,
@ -2755,6 +2758,7 @@ namespace AgroBase.Models
public double LPorMinuto { get; set; } public double LPorMinuto { get; set; }
public double TempoEstimadoRestanteMinutos { get; set; } public double TempoEstimadoRestanteMinutos { get; set; }
public double DistanciaEstimadaRestanteMetros { get; set; } public double DistanciaEstimadaRestanteMetros { get; set; }
public bool BombaCavitada { get; set; }
public Dictionary<string, bool> Iniciados { get; set; } public Dictionary<string, bool> Iniciados { get; set; }
public List<AtuBicoSensoriamentoLogModel> Bicos { get; set; } public List<AtuBicoSensoriamentoLogModel> Bicos { get; set; }
public DateTime UltimoComandoRespondido { get; set; } public DateTime UltimoComandoRespondido { get; set; }
@ -2786,6 +2790,7 @@ namespace AgroBase.Models
AnguloBarraEsquerda = AnguloBarraEsquerda, AnguloBarraEsquerda = AnguloBarraEsquerda,
AnguloBarraDireita = AnguloBarraDireita, AnguloBarraDireita = AnguloBarraDireita,
AnguloBarraAltura = AnguloBarraAltura, AnguloBarraAltura = AnguloBarraAltura,
BombaCavitada = BombaCavitada,
Iniciados = new Dictionary<string, bool>(Iniciados ?? new Dictionary<string, bool>()), Iniciados = new Dictionary<string, bool>(Iniciados ?? new Dictionary<string, bool>()),
UltimoComandoRespondido = UltimoComandoRespondido, UltimoComandoRespondido = UltimoComandoRespondido,
LPorMetro = LPorMetro, LPorMetro = LPorMetro,

View File

@ -469,6 +469,7 @@ namespace AgroBase.Models
public static double DistanciaEntreBicosCm { get; set; } = 50; public static double DistanciaEntreBicosCm { get; set; } = 50;
public static double DensidadeHerbicida { get; set; } = 1.0; public static double DensidadeHerbicida { get; set; } = 1.0;
public static double CapacidadeReservatorio { get; set; } = 30; public static double CapacidadeReservatorio { get; set; } = 30;
public static double PressaoMinimaCavitacao { get; set; } = 30.0;
public static double ReducaoDirecional { get; set; } = 20.0; public static double ReducaoDirecional { get; set; } = 20.0;
public static int RPM_Min_Roda { get; set; } = 15; public static int RPM_Min_Roda { get; set; } = 15;
public static int RPM_Max_Roda public static int RPM_Max_Roda

View File

@ -179,6 +179,15 @@ namespace AgroBase.Services.Operadores
percentual_reservatorio = _Sensoriamento.Atuador?.PercentualReservatorio ?? 0, percentual_reservatorio = _Sensoriamento.Atuador?.PercentualReservatorio ?? 0,
percentual_bateria = _Sensoriamento.Bateria?.PercentualBateria ?? 0, percentual_bateria = _Sensoriamento.Bateria?.PercentualBateria ?? 0,
} }
),
("Atuador", new
{
pressao_linha = _Sensoriamento.Atuador?.PressaoLinha ?? 0,
potencia_bomba = _Sensoriamento.Atuador?.LeituraPotenciaBomba ?? 0,
estado_bomba = _Sensoriamento.Atuador?.LeituraComandoBomba ?? false,
tempo_bomba_atuada = _Sensoriamento.Atuador?.TempoBombaAtuada ?? 0,
bomba_cavitada = _Sensoriamento.Atuador?.BombaCavitada ?? false,
}
) )
); );
@ -295,7 +304,6 @@ namespace AgroBase.Services.Operadores
qtd_bicos = _Parametros.QtdBicos, qtd_bicos = _Parametros.QtdBicos,
tempo_atuacao = pControle.AtuDuracaoAtuacao, tempo_atuacao = pControle.AtuDuracaoAtuacao,
capacidade_reservatorio = _Parametros.CapacidadeReservatorio, capacidade_reservatorio = _Parametros.CapacidadeReservatorio,
pressao_linha = pControle.AtuPressaoLinha,
percent_vertical_deteccao = pControle.AtuPercentualInicioPulverizacao / 100.0, percent_vertical_deteccao = pControle.AtuPercentualInicioPulverizacao / 100.0,
height_area_deteccao = pControle.AtuAlturaAreaPulverizacao / 100.0, height_area_deteccao = pControle.AtuAlturaAreaPulverizacao / 100.0,
pct_erva_bico_on = pControle.AtuPercentualErvasBicoOn / 100.0, pct_erva_bico_on = pControle.AtuPercentualErvasBicoOn / 100.0,
@ -346,6 +354,8 @@ namespace AgroBase.Services.Operadores
("oak_parada_por_bloqueio", pControle.OakParadaPorObstaculo), ("oak_parada_por_bloqueio", pControle.OakParadaPorObstaculo),
("imu_parada_por_inclinacao", pControle.ImuParadaPorInclinacao), ("imu_parada_por_inclinacao", pControle.ImuParadaPorInclinacao),
("pressao_linha", pControle.AtuPressaoLinha),
("registrar_dados_pos_processamento", pControle.RegistrarDadosPosProcessamento) ("registrar_dados_pos_processamento", pControle.RegistrarDadosPosProcessamento)
); );
} }

View File

@ -18,6 +18,12 @@ class RegrasTaticas:
"ts_inicio_false": None, "ts_inicio_false": None,
"ultimo_estado_bruto": False, "ultimo_estado_bruto": False,
}, },
"bomba_cavitada": {
"ativo": False,
"ts_inicio_true": None,
"ts_inicio_false": None,
"ultimo_estado_bruto": False,
},
} }
def verifica_controle_liberado(self, ignorar_parada=False): def verifica_controle_liberado(self, ignorar_parada=False):
@ -26,6 +32,7 @@ class RegrasTaticas:
freio_necessario = False freio_necessario = False
_controle = ContextoGlobalRedis.get_controle() _controle = ContextoGlobalRedis.get_controle()
_operacao = ContextoGlobalRedis.get_operacao() _operacao = ContextoGlobalRedis.get_operacao()
_contexto = ContextoGlobalRedis.get_contexto()
status_operacao = StatusOperacao(_operacao.get("status", StatusOperacao.NaoIniciado.value)) status_operacao = StatusOperacao(_operacao.get("status", StatusOperacao.NaoIniciado.value))
finalizando = _operacao.get("finalizando", False) finalizando = _operacao.get("finalizando", False)
@ -81,6 +88,32 @@ class RegrasTaticas:
motivos.append(f"Inclinação perigosa detectada. roll: {roll:.2f}/{ang_roll_max}, pitch: {pitch:.2f}/{ang_pitch_max}") motivos.append(f"Inclinação perigosa detectada. roll: {roll:.2f}/{ang_roll_max}, pitch: {pitch:.2f}/{ang_pitch_max}")
freio_necessario = True freio_necessario = True
pulverizador_automatico = _controle.get("pulverizador_automatico", False)
if pulverizador_automatico:
_atu = ContextoGlobalRedis.get_modulo(T_Code.Atu)
_atu_saude = StatusModulo(_atu.get("saude", {}).get("status", StatusModulo.DESCONECTADO.value))
atu_operante = _atu_saude in [StatusModulo.OPERANTE, StatusModulo.ALERTA]
bomba_cavitada = _contexto.get("Atuador", {}).get("bomba_cavitada", False)
pressao_sp = _controle.get("pressao_linha", 0)
pressao_atual = _contexto.get("Atuador", {}).get("pressao_linha", 0)
cavitacao_persistente = self._avaliar_persistencia(
nome="bomba_cavitada",
estado_bruto=(atu_operante and bomba_cavitada),
tempo_acionar=5.0,
tempo_liberar=5.0
)
if not atu_operante:
motivos.append(f"Pulverizador mandatório não operante: {_atu_saude.name}")
elif cavitacao_persistente:
motivos.append(
f"Cavitação na bomba pressurizadora da linha! "
f"Pressão: {pressao_sp}/{pressao_atual} psi"
)
freio_necessario = False
return motivos, freio_necessario return motivos, freio_necessario
except Exception as e: except Exception as e: