refinamentos fluxo do atuador

This commit is contained in:
Diego Freitas 2026-06-19 09:15:05 -03:00
parent b88852cbab
commit 8eee8e5012
11 changed files with 1281 additions and 247 deletions

View File

@ -32,7 +32,7 @@ namespace AgroBase.Forms.Atuador
txtPressaoVmax.Text = DispAtu.Dados._PressaoVmax.ToString();
txtMLRef.Text = DispAtu.Dados.VazaoFluxoMLpSReferencia.ToString();
//txtPulsosRef.Text = DispAtu.Dados._FluxoPulsoRef.ToString();
txtVolume.Text = DispAtu.Dados.VolumeVazaoAferido.ToString();
//txtVolume.Text = DispAtu.Dados.VolumeVazaoAferido.ToString();
grdSensoriamento.Rows.Clear();
grdSensoriamento.Columns.Clear();
@ -135,7 +135,7 @@ namespace AgroBase.Forms.Atuador
private void AtualizarGridSensores()
{
var BombaPressurizadora = DispAtu.Dados.BombasPressurizadoras.FirstOrDefault();
var BombaPressurizadora = DispAtu.Dados.BombaPressurizadora;
grdSensoriamento.Rows[0].Cells[1].Value = BombaPressurizadora.Inicializado;
grdSensoriamento.Rows[1].Cells[1].Value = BombaPressurizadora.ComandoAtuar;
grdSensoriamento.Rows[2].Cells[1].Value = BombaPressurizadora._EstadoLeitura;
@ -150,20 +150,20 @@ namespace AgroBase.Forms.Atuador
private void nudPressaoSP_ValueChanged(object sender, EventArgs e)
{
var Bomba = Variaveis.OperacaoEmAndamento.DispAtu.Dados.BombasPressurizadoras.FirstOrDefault();
var Bomba = Variaveis.OperacaoEmAndamento.DispAtu.Dados.BombaPressurizadora;
Variaveis.OperacaoEmAndamento.Parametros.Controle.AtuPressaoLinha = Convert.ToInt32(((NumericUpDown)sender).Value);
GeneralJoystick.EnviarComandoAtuador(S_Code.sBMB, Bomba.ID, Status: Bomba.ComandoAtuar, Comando: Services.CanMessagePosicaoDados.Command1);
}
private void btnLigarBomba_Click(object sender, EventArgs e)
{
var Bomba = Variaveis.OperacaoEmAndamento.DispAtu.Dados.BombasPressurizadoras.FirstOrDefault();
var Bomba = Variaveis.OperacaoEmAndamento.DispAtu.Dados.BombaPressurizadora;
GeneralJoystick.EnviarComandoAtuador(S_Code.sBMB, Bomba.ID, Status: true, Comando: Services.CanMessagePosicaoDados.Command1, Forcar: true);
}
private void btnDesligarBomba_Click(object sender, EventArgs e)
{
var Bomba = Variaveis.OperacaoEmAndamento.DispAtu.Dados.BombasPressurizadoras.FirstOrDefault();
var Bomba = Variaveis.OperacaoEmAndamento.DispAtu.Dados.BombaPressurizadora;
GeneralJoystick.EnviarComandoAtuador(S_Code.sBMB, Bomba.ID, Status: false, Comando: Services.CanMessagePosicaoDados.Command1, Forcar: true);
}
@ -209,7 +209,7 @@ namespace AgroBase.Forms.Atuador
DispAtu.Dados._PressaoVmax = Convert.ToDouble(txtPressaoVmax.Text);
//DispAtu.Dados._FluxoMlRef = Convert.ToDouble(txtMLRef.Text);
//DispAtu.Dados._FluxoPulsoRef = Convert.ToDouble(txtPulsosRef.Text);
DispAtu.Dados.VolumeVazaoAferido = Convert.ToDouble(txtVolume.Text);
//DispAtu.Dados.VolumeVazaoAferido = Convert.ToDouble(txtVolume.Text);
}
private void btnCalibrarVazao_Click(object sender, EventArgs e)

View File

@ -121,7 +121,7 @@ namespace AgroBase.Forms
//CameraSolo.IniciarRotinaProcesso();
CameraSolo.camera.IniciarCamera(
Variaveis.OperacaoEmAndamento.DispAtu.Dados.ScriptDeteccaoErvas,
"", //Variaveis.OperacaoEmAndamento.DispAtu.Dados.ScriptDeteccaoErvas,
new string[] {
CameraSolo.MaxLeituras.ToString(),
CameraSolo.VideoPorta,

View File

@ -430,8 +430,8 @@ namespace AgroBase.Forms.IHM
bool Inicializado = Dispositivo != null && Dispositivo.Dados.ConexaoAtiva;
idx = PreencheDadosLinha(grid, Testes, idx, Inicializado ? 1 : 0);
AtuadorBombaModel Bomba = Dispositivo.Dados.BombasPressurizadoras.FirstOrDefault();
bool BombaInicializado = Bomba.Inicializado;
AtuadorBombaModel Bomba = Dispositivo.Dados.BombaPressurizadora;
bool BombaInicializado = Bomba?.Inicializado ?? false;
idx = PreencheDadosLinha(grid, Testes, idx, BombaInicializado ? 1 : 0);
SensorModel sMAS = Dispositivo.Dados.Sensores.FirstOrDefault(x => x.Componente == Enums.S_Code.sMAS);
@ -525,7 +525,7 @@ namespace AgroBase.Forms.IHM
private async Task EnviarComandoBomba(bool Ligar, double Pressao, int Timeout, AtuadorModel disp = null)
{
var Bomba = Variaveis.OperacaoEmAndamento.DispAtu.Dados.BombasPressurizadoras.FirstOrDefault();
var Bomba = Variaveis.OperacaoEmAndamento.DispAtu.Dados.BombaPressurizadora;
Variaveis.OperacaoEmAndamento.Parametros.Controle.AtuPressaoLinha = Pressao + 10;
GeneralJoystick.EnviarComandoAtuador(S_Code.sBMB, Bomba.ID, Status: Ligar, Comando: CanMessagePosicaoDados.Command1);

View File

@ -54,7 +54,7 @@ namespace AgroBase.Forms.Operacoes
cmbModoAgitador.Items.AddRange(Enum.GetNames(typeof(ModoAgitadorCalda)));
cmbModoAgitador.SelectedIndex = (int)pC.AtuAgitadorModo;
var b = Variaveis.OperacaoEmAndamento.DispAtu.Dados.BombasPressurizadoras.FirstOrDefault(x => x.ID == "BMBLN");
var b = Variaveis.OperacaoEmAndamento.DispAtu.Dados.BombaPressurizadora;
if (b != null)
{
txtKp.Text = b.Controle.Kp.ToString();
@ -592,7 +592,7 @@ namespace AgroBase.Forms.Operacoes
gridDados.Rows[34].Cells[1].Value = (_Atuador?.VolumeVazaoMl ?? 0).ToString("0.00");
gridDados.Rows[35].Cells[1].Value = (_Atuador?.AnguloBarraEsquerda ?? 0).ToString("0.00");
gridDados.Rows[36].Cells[1].Value = (_Atuador?.AnguloBarraDireita ?? 0).ToString("0.00");
gridDados.Rows[37].Cells[1].Value = (Variaveis.OperacaoEmAndamento.DispAtu?.Dados?.ContadorCarga?.AgitadorCalda?._Potencia ?? 0).ToString("0.00");
gridDados.Rows[37].Cells[1].Value = (Variaveis.OperacaoEmAndamento.DispAtu?.Dados?.AgitadorDeCalda?._Potencia ?? 0).ToString("0.00");
gridDados.Rows[38].Cells[1].Value = "";
gridDados.Rows[39].Cells[1].Value = (_IMU?.RollSeguro ?? 0).ToString("0.00");
gridDados.Rows[40].Cells[1].Value = (_IMU?.PitchSeguro ?? 0).ToString("0.00");
@ -673,7 +673,7 @@ namespace AgroBase.Forms.Operacoes
private void btnLigarBomba_Click(object sender, EventArgs e)
{
var Bomba = Variaveis.OperacaoEmAndamento.DispAtu.Dados.BombasPressurizadoras.FirstOrDefault(x => x.ID == "BMBLN");
var Bomba = Variaveis.OperacaoEmAndamento.DispAtu.Dados.BombaPressurizadora;
if (Bomba != null)
{
Variaveis.OperacaoEmAndamento.Parametros.Controle.AtuModoControle = (ModoControleBomba)cmbModoBomba.SelectedIndex;
@ -691,14 +691,14 @@ namespace AgroBase.Forms.Operacoes
private void btnDesligarBomba_Click(object sender, EventArgs e)
{
var Bomba = Variaveis.OperacaoEmAndamento.DispAtu.Dados.BombasPressurizadoras.FirstOrDefault(x => x.ID == "BMBLN");
var Bomba = Variaveis.OperacaoEmAndamento.DispAtu.Dados.BombaPressurizadora;
if (Bomba != null)
GeneralJoystick.EnviarComandoAtuador(Bomba.Componente, Bomba.ID, Status: false, Comando: CanMessagePosicaoDados.Command1, Forcar: true);
}
private void btnLigarAgitador_Click(object sender, EventArgs e)
{
var Agitador = Variaveis.OperacaoEmAndamento.DispAtu.Dados.BombasPressurizadoras.FirstOrDefault(x => x.ID == "BMBAGT");
var Agitador = Variaveis.OperacaoEmAndamento.DispAtu.Dados.AgitadorDeCalda;
if (Agitador != null)
{
Variaveis.OperacaoEmAndamento.Parametros.Controle.AtuAgitadorModo = (ModoAgitadorCalda)cmbModoAgitador.SelectedIndex;
@ -710,7 +710,7 @@ namespace AgroBase.Forms.Operacoes
private void btnDeslsigarAgitador_Click(object sender, EventArgs e)
{
var Agitador = Variaveis.OperacaoEmAndamento.DispAtu.Dados.BombasPressurizadoras.FirstOrDefault(x => x.ID == "BMBAGT");
var Agitador = Variaveis.OperacaoEmAndamento.DispAtu.Dados.AgitadorDeCalda;
if (Agitador != null)
GeneralJoystick.EnviarComandoAtuador(Agitador.Componente, Agitador.ID, Status: false, Comando: CanMessagePosicaoDados.Command1, Forcar: true);
}
@ -729,7 +729,7 @@ namespace AgroBase.Forms.Operacoes
{
var Atuador = Variaveis.OperacaoEmAndamento.DispAtu.Dados;
bool ligado = Atuador.BombasPressurizadoras.FirstOrDefault()?._BombaLigada ?? false;
bool ligado = Atuador.BombaPressurizadora?._BombaLigada ?? false;
AtuadorFuncoesGerais.DesenharAtuadores(
pnlAtuadores,
e,

View File

@ -180,7 +180,7 @@ namespace AgroBase.Forms.Operacoes
Posicao = x.Posicao,
StatusBico = x._EstadoLeitura == Enums.Estado.Ligado,
TempoAtuado = x.TempoAtuado,
}).ToList(), Atuador.BombasPressurizadoras.FirstOrDefault()?._BombaLigada ?? false, Atuador.PressaoLinha, Atuador.TempoAtuado);
}).ToList(), Atuador.BombaPressurizadora?._BombaLigada ?? false, Atuador.PressaoLinha, Atuador.TempoAtuado);
}
private void pnlCaminho_Paint(object sender, PaintEventArgs e)

File diff suppressed because it is too large Load Diff

View File

@ -376,10 +376,12 @@ namespace AgroBase.Models.Modules
{
await SetZero();
Variaveis.MostrarLog($"[DirecionalModel] [ReferenciaMotor] [DIR {Mod_ID}] - Referenciamento Concluído!");
Variaveis.OperacaoEmAndamento.Sensoriamento.InserirLog(T_Code.Dir, StatusModulo.Operante, 100, $"Referenciamento Concluído!", id: Mod_ID);
}
else
{
Variaveis.MostrarLog($"[DirecionalModel] [ReferenciaMotor] [DIR {Mod_ID}] - Referenciamento Falhou!");
Variaveis.OperacaoEmAndamento.Sensoriamento.InserirLog(T_Code.Dir, StatusModulo.Falha, 0, $"Referenciamento Falhou!", id: Mod_ID);
}
Referenciando = false;
@ -468,6 +470,7 @@ namespace AgroBase.Models.Modules
if (!Sucesso)
{
Variaveis.MostrarLog($"[DirecionalModel] [ReferenciaMotorRelativo] [DIR {Mod_ID}] - ReferenciaMotorRelativo falhou (timeout ou não inicializado). Entrada={AnguloEntrada}, Saida={AnguloSaida}");
Variaveis.OperacaoEmAndamento.Sensoriamento.InserirLog(T_Code.Dir, StatusModulo.Falha, 0, $"ReferenciaMotorRelativo falhou (timeout ou não inicializado). Entrada={AnguloEntrada}, Saida={AnguloSaida}", id: Mod_ID);
}
return Sucesso;

View File

@ -458,10 +458,14 @@ namespace AgroBase.Models.Modules
if (calDir[Modulo.Modulo_ID]) continue;
tasks.Add(Modulo.DirMotor.ReferenciaMotor().ContinueWith(t => {
if (t.IsFaulted)
{
Variaveis.MostrarLog($"[MovimentacaoUnificadaModel] [RealizarCalibragemDirAsync] Erro no referenciamento do módulo {Modulo.Modulo_ID}: {t.Exception?.InnerException?.Message}");
Variaveis.OperacaoEmAndamento.Sensoriamento.InserirLog(Dispositivo, StatusModulo.Falha, 0, $"Erro no referenciamento do módulo {Modulo.Modulo_ID}: {t.Exception?.InnerException?.Message}");
}
if (t.IsCompleted)
{
Variaveis.MostrarLog($"[MovimentacaoUnificadaModel] [RealizarCalibragemDirAsync] Referenciamento do módulo {Modulo.Modulo_ID} concluído com sucesso!");
Variaveis.OperacaoEmAndamento.Sensoriamento.InserirLog(Dispositivo, StatusModulo.Operante, 100, $"Referenciamento do módulo {Modulo.Modulo_ID} concluído com sucesso!");
calDir[Modulo.Modulo_ID] = true;
}
}));

View File

@ -1304,10 +1304,12 @@ namespace AgroBase.Models
if (!calibragemAtuNecessaria && !calibragemDirNecessaria && !calibragemMovNecessaria) return;
Variaveis.MostrarLog("[OperacaoModel] [RealizarCalibragemInicialAsync] Pausa para calibragem inicial");
Variaveis.OperacaoEmAndamento.Sensoriamento.InserirLog(T_Code.Mod, StatusModulo.Operante, 100, $"Pausa para calibragem inicial");
Variaveis.OperacaoEmAndamento.Pausa = true;
await Task.Delay(5000);
Variaveis.MostrarLog("[OperacaoModel] [RealizarCalibragemInicialAsync] Calibragem dos modulos inciada...");
Variaveis.OperacaoEmAndamento.Sensoriamento.InserirLog(T_Code.Mod, StatusModulo.Operante, 100, $"Calibragem dos modulos inciada...");
Variaveis.OperacaoEmAndamento.Calibrando = true;
RedisService.AtualizarCampos(CtxKey.DadosOperacao, ("calibrando", Variaveis.OperacaoEmAndamento.Calibrando));
@ -1322,6 +1324,7 @@ namespace AgroBase.Models
if (tasks.Count == 0)
{
Variaveis.MostrarLog("[OperacaoModel] [RealizarCalibragemInicialAsync] Nenhuma calibragem foi iniciada.");
Variaveis.OperacaoEmAndamento.Sensoriamento.InserirLog(T_Code.Mod, StatusModulo.Alerta, 50, $"Nenhuma calibragem foi iniciada.");
_Controle.TipoMovimento = tipoControle;
Variaveis.OperacaoEmAndamento.Calibrando = false;
Variaveis.OperacaoEmAndamento.Pausa = false;
@ -1336,15 +1339,18 @@ namespace AgroBase.Models
if (completed == allTasks)
{
Variaveis.MostrarLog("[OperacaoModel] [RealizarCalibragemInicialAsync] Calibragem finalizada com sucesso!");
Variaveis.OperacaoEmAndamento.Sensoriamento.InserirLog(T_Code.Mod, StatusModulo.Operante, 100, $"Calibragem finalizada com sucesso!");
}
else
{
Variaveis.MostrarLog("[OperacaoModel] [RealizarCalibragemInicialAsync] Timeout na calibragem. Continuando mesmo assim.");
Variaveis.OperacaoEmAndamento.Sensoriamento.InserirLog(T_Code.Mod, StatusModulo.Alerta, 50, $"Timeout na calibragem. Continuando mesmo assim.");
}
}
catch (Exception ex)
{
Variaveis.MostrarLog($"[OperacaoModel] [RealizarCalibragemInicialAsync] Erro durante calibragem: {ex.Message}");
Variaveis.OperacaoEmAndamento.Sensoriamento.InserirLog(T_Code.Mod, StatusModulo.Falha, 0, $"Erro durante calibragem: {ex.Message}");
}
_Controle.TipoMovimento = tipoControle;
Variaveis.OperacaoEmAndamento.Calibrando = false;
@ -1623,26 +1629,12 @@ namespace AgroBase.Models
}
case T_Code.Atu:
{
bool enviarComando = false;
for (int i = 0; i < _Controle.Bicos.Count; i++)
{
Estado comandoEstado = _Controle.Bicos[i].ComandoAtuar ? Estado.Ligado : Estado.Desligado;
if (ForcarEnvio || comandoEstado != _Controle.Bicos[i]._EstadoLeitura)
{
GeneralJoystick.EnviarComandoAtuador(_Controle.Bicos[i].Componente, _Controle.Bicos[i].ID, Status: _Controle.Bicos[i].ComandoAtuar);
enviarComando = true;
}
}
// Ligar a bomba caso esteja desligada e tenha herbicida suficiente no reservatorio
if ((Variaveis.OperacaoEmAndamento.DispAtu?.Dados?.ContadorCarga?.PulverizadorLiberado ?? false) && enviarComando)
{
foreach (var Bomba in Variaveis.OperacaoEmAndamento.DispAtu.Dados.BombasPressurizadoras)
{
if (Bomba._EstadoLeitura == Estado.Desligado)
{
GeneralJoystick.EnviarComandoAtuador(Bomba.Componente, Bomba.ID, Status: true, Comando: CanMessagePosicaoDados.Command1);
}
}
}
@ -2066,8 +2058,8 @@ namespace AgroBase.Models
HerbicidaPorAtuacao = Variaveis.OperacaoEmAndamento.DispAtu.Dados.ContadorCarga.HerbicidaPorAtuacao_L,
PressaoLinha_SP = Variaveis.OperacaoEmAndamento.Parametros.Controle.AtuPressaoLinha,
PressaoLinha = Variaveis.OperacaoEmAndamento.DispAtu.Dados.PressaoLinha,
PotenciaBomba = Variaveis.OperacaoEmAndamento.DispAtu.Dados.BombasPressurizadoras.FirstOrDefault()?._Potencia ?? 0,
BombaLigada = Variaveis.OperacaoEmAndamento.DispAtu.Dados.BombasPressurizadoras.FirstOrDefault().ComandoAtuar,
PotenciaBomba = Variaveis.OperacaoEmAndamento.DispAtu.Dados.BombaPressurizadora?._Potencia ?? 0,
BombaLigada = Variaveis.OperacaoEmAndamento.DispAtu.Dados.BombaPressurizadora?.ComandoAtuar ?? false,
VazaoFluxoMLpSInstantanea = Variaveis.OperacaoEmAndamento.DispAtu.Dados.VazaoFluxoMLpSInstantanea,
VazaoFluxoMLpSMedia = Variaveis.OperacaoEmAndamento.DispAtu.Dados.VazaoMediaMLs,
VolumeVazaoML = Variaveis.OperacaoEmAndamento.DispAtu.Dados.VolumeVazadoML,
@ -2731,7 +2723,7 @@ namespace AgroBase.Models
_DispMvd?.Dados?.AtualizarDadosFreio();
_DispSen?.Dados?.AtualizarStatusSinaleiros(Variaveis.OperacaoEmAndamento.Parametros?.Modo ?? ModoOperacao.NaoDefinido, Variaveis.OperacaoEmAndamento.StatusAtual);
_DispSen?.Dados?.AtualizarDadosCameras();
_DispAtu?.Dados?.AtualizaTempoAtuadoGeral();
_DispAtu?.Dados?.AtualizarMetricasOperacao();
_Cooler?.Atualizar(tmp_max, DateTime.Now);
_Bateria?.AtualizarConsumo(_DispMvd?.Dados?.DistanciaPercorridaTotal ?? 0);
_Reservatorio?.AtualizarConsumo(_DispMvd?.Dados?.DistanciaPercorridaTotal ?? 0, Variaveis.OperacaoEmAndamento.TempoDecorridoSegs, _DispMvd?.Dados?.VelocidadeMedia ?? 0);
@ -2743,7 +2735,7 @@ namespace AgroBase.Models
bool imu_iniciado = sIMU?.timestamp > 0 && HealthWorkerService.ModulosSaude.FirstOrDefault(x => x.modulo == T_Code.Imu)?.status != StatusModulo.Desconectado;
var dadosIMU = sIMU != null && imu_iniciado ? sIMU.Clone() : new ModuloIMUModel();
var bombaLinha = _DispAtu?.Dados?.BombasPressurizadoras?.FirstOrDefault(x => x.ID == "BMBLN");
var bombaLinha = _DispAtu?.Dados?.BombaPressurizadora;
var dadosAtuador = _DispAtu != null ? new OperacaoSensoriamentoLogAtuModel()
{
QtdCamerasSolo = _DispSen.Dados.CamerasSolo.Count,
@ -2765,11 +2757,11 @@ namespace AgroBase.Models
VazaoInstantaneaCalc = _DispAtu.Dados.VazaoFluxoMLpSInstantaneaCalc,
VazaoMedia = _DispAtu.Dados.VazaoMediaMLs,
TempoBombaAtuada = _DispAtu.Dados.TempoAtuado,
ComandoBomba = bombaLinha.ComandoAtuar,
LeituraComandoBomba = bombaLinha._EstadoLeitura == Estado.Ligado,
LeituraPotenciaBomba = FuncoesMatematicas.Clamp(bombaLinha._Potencia, 0, 100),
ComandoBomba = bombaLinha?.ComandoAtuar ?? false,
LeituraComandoBomba = bombaLinha?._EstadoLeitura == Estado.Ligado,
LeituraPotenciaBomba = FuncoesMatematicas.Clamp(bombaLinha?._Potencia ?? 0, 0, 100),
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,
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),
AnguloBarraEsquerda = _DispAtu.Dados.AnguloBarraEsquerda,
AnguloBarraDireita = _DispAtu.Dados.AnguloBarraDireita,

View File

@ -1214,19 +1214,17 @@ namespace AgroBase.Services
_Trajetoria?.AtualizarDistanciaPercorrida(distancia);
}
}
var bicos = Variaveis.OperacaoEmAndamento.Controle?.Bicos;
if (bicos != null)
{
foreach (var bico in bicos)
var bicos = Variaveis.OperacaoEmAndamento.DispAtu?.Dados?.BicosPulverizadores;
if (bicos != null)
{
if (!bico.Inicializado || !bico.Comandar || bico._EstadoLeitura != Estado.Ligado)
foreach (var bico in bicos)
{
continue;
}
if (!bico.Inicializado || !bico.Comandar || !bico.ComandoAtuar)
continue;
bico.AdicionarPontoTrechoAtivo(UltimaLeitura.Latitude, UltimaLeitura.Longitude);
bico.AdicionarPontoTrechoAtivo(UltimaLeitura.Latitude, UltimaLeitura.Longitude);
}
}
}

View File

@ -138,10 +138,6 @@ namespace AgroBase.Services
private bool _inicializado;
private SensorModel SensorMassaReservatorio => Variaveis.OperacaoEmAndamento.DispAtu?.Dados?.Sensores?.FirstOrDefault(x => x.Componente == S_Code.sMAS && x.ID == "MASRS");
public AtuadorBombaModel AgitadorCalda => Variaveis.OperacaoEmAndamento.DispAtu?.Dados?.BombasPressurizadoras?.FirstOrDefault(x => x.ID == "AGTCLD");
public void IniciarOperacao(double distanciaTotalMetrosAtual, double tempoTotalSegundosAtual)
{
if (!_inicializado)
@ -169,10 +165,19 @@ namespace AgroBase.Services
public void AtualizarConsumo(double distanciaTotalMetrosAtual, double tempoTotalSegundosAtual, double velocidadeAtual_m_s)
{
Iniciado = SensorMassaReservatorio?.Inicializado ?? false;
Iniciado = Variaveis.OperacaoEmAndamento.DispAtu?.Dados?.SensorMassaReservatorio?.Inicializado ?? false;
if (!Iniciado)
{
PulverizadorLiberado = false;
BicosAtivos = 0;
Pulverizando = false;
VazaoFluxoAtual_mLs = 0;
VazaoEstimativaBicos_mLs = 0;
VazaoReferencia_mLs = 0;
LPorMinutoEstimadoBicos = 0;
return;
}
LerReservatorio(out double massaLida_Kg, out double massaCalc_Kg, out double volumeMedido_L);
@ -237,11 +242,12 @@ namespace AgroBase.Services
private void LerReservatorio(out double massaLida_Kg, out double massaCalc_Kg, out double volumeMedido_L)
{
massaLida_Kg = SensorMassaReservatorio?.ValoresLeituras?.FirstOrDefault(x => x.funcao == FuncoesPinout.Massa)?.atual?.valor ?? 0;
var sensor = Variaveis.OperacaoEmAndamento.DispAtu?.Dados?.SensorMassaReservatorio;
massaLida_Kg = sensor?.ValoresLeituras?.FirstOrDefault(x => x.funcao == FuncoesPinout.Massa)?.atual?.valor ?? 0;
double leituraBruta = SensorMassaReservatorio?.ValoresLeituras?.FirstOrDefault(x => x.funcao == FuncoesPinout.LeituraBruta)?.atual?.valor ?? 0;
double leituraBruta = sensor?.ValoresLeituras?.FirstOrDefault(x => x.funcao == FuncoesPinout.LeituraBruta)?.atual?.valor ?? 0;
double.TryParse(SensorMassaReservatorio?.Parametros?.FirstOrDefault(x => x.Descricao == "Offset")?.Valor ?? "0", out double offset);
double.TryParse(sensor?.Parametros?.FirstOrDefault(x => x.Descricao == "Offset")?.Valor ?? "0", out double offset);
massaCalc_Kg = leituraBruta + offset;
@ -520,35 +526,69 @@ namespace AgroBase.Services
public void AtualizarAgitadorCalda(ModoAgitadorCalda modo)
{
if (!(AgitadorCalda?.Inicializado ?? false))
return;
var operacao = Variaveis.OperacaoEmAndamento;
var controle = Variaveis.OperacaoEmAndamento?.Parametros?.Controle;
if (controle == null)
if (operacao?.Calibrando == true)
{
AgitadorCalda.PotenciaSP = 0;
/*
* Durante a calibração, RealizarTestesIniciais()
* é o proprietário temporário do agitador.
*/
return;
}
bool operacaoIniciada = Variaveis.OperacaoEmAndamento?.Iniciado ?? false;
bool pausado = Variaveis.OperacaoEmAndamento?.Pausa ?? false;
bool operacaoAtiva = operacaoIniciada && !pausado;
var agitador =
operacao?.DispAtu?.Dados?.AgitadorDeCalda;
if (!(agitador?.Inicializado ?? false))
return;
var controle = operacao.Parametros?.Controle;
if (controle == null)
{
agitador.ComandoAtuar = false;
agitador.PotenciaSP = 0;
agitador.PressaoSP = -1;
return;
}
bool operacaoConcluida =
operacao.Sensoriamento?.StatusOperacao ==
StatusOperacao.Concluido;
bool operacaoAtiva =
operacao.Iniciado &&
!operacao.Pausa &&
!operacaoConcluida &&
PulverizadorLiberado;
bool bicosAtuando =
Variaveis.OperacaoEmAndamento.DispAtu?.Dados?.BicosPulverizadores?
.Any(x => x.Comandar && x.ComandoAtuar) ?? false;
operacao.DispAtu?.Dados?.BicosPulverizadores?
.Any(x =>
x.Comandar &&
x.ComandoAtuar)
?? false;
double potenciaFinal = 0;
DateTime agora = DateTime.Now;
if (operacaoAtiva && !_agitadorOperacaoAtivaAnterior)
if (
operacaoAtiva &&
!_agitadorOperacaoAtivaAnterior
)
{
_agitadorBoostAte = agora.AddMilliseconds(AtuAgitadorBoostRetomadaMs);
_agitadorBoostAte =
agora.AddMilliseconds(
AtuAgitadorBoostRetomadaMs
);
_agitadorUltimaTroca = agora;
_agitadorIntermitenteLigado = true;
}
bool emBoost = agora < _agitadorBoostAte;
bool emBoost =
agora < _agitadorBoostAte;
switch (modo)
{
@ -560,11 +600,20 @@ namespace AgroBase.Services
if (operacaoAtiva)
{
if (emBoost)
potenciaFinal = AtuAgitadorPotenciaBoost;
{
potenciaFinal =
AtuAgitadorPotenciaBoost;
}
else if (bicosAtuando)
potenciaFinal = AtuAgitadorPotenciaContinua;
{
potenciaFinal =
AtuAgitadorPotenciaContinua;
}
else
potenciaFinal = AtuAgitadorPotenciaManutencao;
{
potenciaFinal =
AtuAgitadorPotenciaManutencao;
}
}
break;
@ -577,32 +626,57 @@ namespace AgroBase.Services
}
else if (emBoost)
{
potenciaFinal = AtuAgitadorPotenciaBoost;
potenciaFinal =
AtuAgitadorPotenciaBoost;
}
else
{
int tempoAtualMs = _agitadorIntermitenteLigado
? AtuAgitadorTempoLigadoMs
: AtuAgitadorTempoDesligadoMs;
int tempoAtualMs =
_agitadorIntermitenteLigado
? AtuAgitadorTempoLigadoMs
: AtuAgitadorTempoDesligadoMs;
if ((agora - _agitadorUltimaTroca).TotalMilliseconds >= tempoAtualMs)
if (
(agora - _agitadorUltimaTroca)
.TotalMilliseconds >=
tempoAtualMs
)
{
_agitadorIntermitenteLigado = !_agitadorIntermitenteLigado;
_agitadorIntermitenteLigado =
!_agitadorIntermitenteLigado;
_agitadorUltimaTroca = agora;
}
potenciaFinal = _agitadorIntermitenteLigado
? AtuAgitadorPotenciaIntermitente
: 0;
potenciaFinal =
_agitadorIntermitenteLigado
? AtuAgitadorPotenciaIntermitente
: 0;
}
break;
}
potenciaFinal = Math.Min(potenciaFinal, PotenciaLimitePorNivel(PercentualAtual));
potenciaFinal = Clamp(potenciaFinal, 0, 100);
potenciaFinal =
Math.Min(
potenciaFinal,
PotenciaLimitePorNivel(PercentualAtual)
);
AgitadorCalda.PotenciaSP = potenciaFinal;
_agitadorOperacaoAtivaAnterior = operacaoAtiva;
potenciaFinal =
Clamp(potenciaFinal, 0, 100);
/*
* Este método é a fonte de verdade do agitador.
*/
agitador.PotenciaSP = potenciaFinal;
agitador.PressaoSP = -1;
agitador.ComandoAtuar =
agitador.Comandar &&
potenciaFinal > 0;
_agitadorOperacaoAtivaAnterior =
operacaoAtiva;
}
}
}