ajustes na inicializacao do atuador e calibragem inicial

This commit is contained in:
Diego Freitas 2026-06-19 12:33:46 -03:00
parent 8eee8e5012
commit f5e8ba1fef
4 changed files with 86 additions and 110 deletions

View File

@ -1,5 +1,6 @@
using AgroBase.Services;
using AgroBase.Services.Operadores;
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Diagnostics;
@ -66,6 +67,7 @@ namespace AgroBase.Models.Modules
public AtuadorMensagemJsonModel DadosLeitura { get; set; } = new AtuadorMensagemJsonModel();
public AtuHandler _AtuHandler = new AtuHandler();
[JsonIgnore]
public AtuadorBombaModel BombaPressurizadora
{
get
@ -74,6 +76,7 @@ namespace AgroBase.Models.Modules
return Bomba;
}
}
[JsonIgnore]
public AtuadorBombaModel AgitadorDeCalda
{
get
@ -83,6 +86,7 @@ namespace AgroBase.Models.Modules
}
}
[JsonIgnore]
public SensorModel SensorMassaReservatorio
{
get
@ -91,6 +95,7 @@ namespace AgroBase.Models.Modules
return sMAS;
}
}
[JsonIgnore]
private SensorModel SensorAnguloBarraEsquerda
{
get
@ -99,6 +104,7 @@ namespace AgroBase.Models.Modules
return sMAG;
}
}
[JsonIgnore]
private SensorModel SensorAnguloBarraDireita
{
get
@ -112,6 +118,7 @@ namespace AgroBase.Models.Modules
#region VAZAO
[JsonIgnore]
private SensorModel SensorFluxoLinha => Sensores.FirstOrDefault(x => x.Componente == S_Code.sFLX && x.ID == "FLXLN");
public double VazaoMaximaSensor_LMin { get; set; } = 20.0;
@ -164,6 +171,8 @@ namespace AgroBase.Models.Modules
#endregion
#region PRESSAO
[JsonIgnore]
private SensorModel SensorPressaoLinha
{
get
@ -1004,8 +1013,8 @@ namespace AgroBase.Models.Modules
Descricao = "Angulo Barra Esquerda",
ID_Num = 41,
Componente = S_Code.sMAG,
Aferir = true,
Mandatorio = true,
Aferir = false,
Mandatorio = false,
Funcoes = new List<FuncoesPinout>()
{
FuncoesPinout.I2C,
@ -1059,8 +1068,8 @@ namespace AgroBase.Models.Modules
Descricao = "Angulo Barra Direita",
ID_Num = 42,
Componente = S_Code.sMAG,
Aferir = true,
Mandatorio = true,
Aferir = false,
Mandatorio = false,
Funcoes = new List<FuncoesPinout>()
{
FuncoesPinout.I2C,
@ -1311,6 +1320,7 @@ namespace AgroBase.Models.Modules
Dados.BombasPressurizadoras.ForEach(x => x.Funcoes = x.Funcoes.Distinct().ToList());
ReiniciarLeituras(Dados);
PrepararAtuadorParaOperacao(Dados);
}
public void ReiniciarLeituras(AtuadorModel Dados)
@ -1376,6 +1386,34 @@ namespace AgroBase.Models.Modules
}
}
private void PrepararAtuadorParaOperacao(AtuadorModel Dados)
{
var dadosAtuador = Dados;
var controle = Variaveis.OperacaoEmAndamento.Parametros?.Controle;
if (dadosAtuador == null || controle == null)
return;
var bomba = dadosAtuador.BombaPressurizadora;
if (bomba != null)
{
bomba.ComandoAtuar = false;
bomba.PotenciaSP = 100;
bomba.PressaoSP = controle.AtuPressaoLinha;
bomba.Controle.Modo = controle.AtuModoControle;
}
var agitador = dadosAtuador.AgitadorDeCalda;
if (agitador != null)
{
agitador.ComandoAtuar = false;
agitador.PotenciaSP = 0;
agitador.PressaoSP = -1;
}
}
public async Task<bool> VerificaDispositivoConectado()
{
if (!CanManager.CanService.IsConnected) return false;
@ -1850,109 +1888,47 @@ namespace AgroBase.Models.Modules
}
}
private void EnviarComandoFisicoBico(
AtuadorBicoModel bico,
bool status,
double angulo)
private void EnviarComandoFisicoBico(AtuadorBicoModel bico, bool status, double angulo)
{
var dispAtu =
Variaveis.OperacaoEmAndamento?.DispAtu;
var dispAtu = Variaveis.OperacaoEmAndamento?.DispAtu;
if (
dispAtu?.Dados?.Conectado != true ||
bico == null
)
{
if (dispAtu?.Dados?.Conectado != true || bico == null)
return;
}
byte anguloByte =
(byte)Math.Round(
FuncoesMatematicas.Clamp(
angulo,
0,
255
)
);
byte anguloByte = (byte)Math.Round(FuncoesMatematicas.Clamp(angulo, 0, 255));
byte[] data =
{
(byte)(
status
? Estado.Ligado
: Estado.Desligado
),
anguloByte
};
(byte)(status ? Estado.Ligado : Estado.Desligado),
anguloByte
};
dispAtu.AdicionarMensagemFila(
bico.ID_Num,
CanMessagePosicaoDados.Command1,
CanMessagePosicaoDados.Command1,
data,
false
);
dispAtu.AdicionarMensagemFila(bico.ID_Num, CanMessagePosicaoDados.Command1, CanMessagePosicaoDados.Command1, data, false);
}
private void EnviarComandoFisicoBomba(
AtuadorBombaModel bomba,
bool status,
double potencia,
double pressao)
private void EnviarComandoFisicoBomba(AtuadorBombaModel bomba, bool status, double potencia, double pressao)
{
var dispAtu =
Variaveis.OperacaoEmAndamento?.DispAtu;
var dispAtu = Variaveis.OperacaoEmAndamento?.DispAtu;
if (
dispAtu?.Dados?.Conectado != true ||
bomba == null
)
{
if (dispAtu?.Dados?.Conectado != true || bomba == null)
return;
}
byte potenciaByte =
(byte)Math.Round(
FuncoesMatematicas.Clamp(
potencia,
0,
100
)
);
byte potenciaByte = (byte)Math.Round(FuncoesMatematicas.Clamp(potencia, 0, 100));
/*
* -1 é usado para indicar ausência de sensor
* de pressão. No protocolo atual, representa 255.
*/
byte pressaoByte =
pressao < 0
? byte.MaxValue
: (byte)Math.Round(
FuncoesMatematicas.Clamp(
pressao,
0,
255
)
);
byte pressaoByte = pressao < 0 ? byte.MaxValue : (byte)Math.Round(FuncoesMatematicas.Clamp(pressao, 0, 255));
byte[] data =
{
(byte)(
status
? Estado.Ligado
: Estado.Desligado
),
potenciaByte,
pressaoByte
};
(byte)(status ? Estado.Ligado : Estado.Desligado),
potenciaByte,
pressaoByte
};
dispAtu.AdicionarMensagemFila(
bomba.ID_Num,
CanMessagePosicaoDados.Command1,
CanMessagePosicaoDados.Command1,
data,
false
);
dispAtu.AdicionarMensagemFila(bomba.ID_Num, CanMessagePosicaoDados.Command1, CanMessagePosicaoDados.Command1, data, false);
}
@ -2095,7 +2071,7 @@ namespace AgroBase.Models.Modules
}
if (t.IsCompleted)
{
var calAtu = Variaveis.OperacaoEmAndamento.ModsCalibragem[T_Code.Atu];
var calAtu = Variaveis.OperacaoEmAndamento.ModsCalibragem[Dispositivo];
var v = calAtu.Select(x => $"{x.Key} " + (x.Value ? "Sim" : "Não"));
Variaveis.MostrarLog($"[AtuadorModel] [RealizarCalibragemAsync] Task de referenciamento do módulo {Modulo_ID} finalizada: " + string.Join(", ", v));
Variaveis.OperacaoEmAndamento.Sensoriamento.InserirLog(Dispositivo, StatusModulo.Operante, 100, $"Task de referenciamento do módulo {Modulo_ID} finalizada: " + string.Join(", ", v));
@ -2172,7 +2148,7 @@ namespace AgroBase.Models.Modules
}
public List<SensorValoresLeituraModel> ValoresLeituras { get; set; }
public Estado _EstadoLeitura => (Estado)(ValoresLeituras?.FirstOrDefault(x => x.funcao == FuncoesPinout.EstadoLeitura)?.atual?.valor ?? 0);
public int _AnguloBicoLeitura => ValoresLeituras?.FirstOrDefault(x => x.funcao == FuncoesPinout.ServoAnguloLeitura)?.atual? .valor ?? 0;
public double _AnguloBicoLeitura => ValoresLeituras?.FirstOrDefault(x => x.funcao == FuncoesPinout.ServoAnguloLeitura)?.atual? .valor ?? 0;
public (CanMessagePosicaoDados, byte[]) ProtocoloConfiguracao(PinoutDataModel pinout, bool conectar)

View File

@ -1184,27 +1184,27 @@ namespace AgroBase.Models
Variaveis.OperacaoEmAndamento.Sensoriamento.UltimoRegistroLog = DateTime.Now;
tmrLogs?.Start();
Iniciado = true;
Simulando = false;
Treinando = false;
Emergencia = false;
Pausa = false;
DataInicio = DateTime.Now;
DataFim = DateTime.MinValue;
idxLog = 0;
Variaveis.OperacaoEmAndamento.Iniciado = true;
Variaveis.OperacaoEmAndamento.Simulando = false;
Variaveis.OperacaoEmAndamento.Treinando = false;
Variaveis.OperacaoEmAndamento.Emergencia = false;
Variaveis.OperacaoEmAndamento.Pausa = false;
Variaveis.OperacaoEmAndamento.DataInicio = DateTime.Now;
Variaveis.OperacaoEmAndamento.DataFim = DateTime.MinValue;
Variaveis.OperacaoEmAndamento.idxLog = 0;
ID = DataInicio.ToString("dd_MM_yyyy_HH_mm_ss") + "_" + (Parametros?.Modo ?? ModoOperacao.NaoDefinido).ToString();
Variaveis.OperacaoEmAndamento.ID = DataInicio.ToString("dd_MM_yyyy_HH_mm_ss") + "_" + (Parametros?.Modo ?? ModoOperacao.NaoDefinido).ToString();
Directory.CreateDirectory(Variaveis.CaminhoOperacoes + ID + "/");
SalvarOperacao();
Sensoriamento.AtualizarDados();
Variaveis.OperacaoEmAndamento.Sensoriamento.AtualizarDados();
DispMvd?.Dados?.ReiniciarLeituras(DispMvd?.Dados);
DispAtu?.Dados?.ReiniciarLeituras(DispAtu?.Dados);
DispSen?.Dados?.ReiniciarLeituras(DispSen?.Dados);
Variaveis.OperacaoEmAndamento.DispMvd?.Dados?.ReiniciarLeituras(DispMvd?.Dados);
Variaveis.OperacaoEmAndamento.DispAtu?.Dados?.ReiniciarLeituras(DispAtu?.Dados);
Variaveis.OperacaoEmAndamento.DispSen?.Dados?.ReiniciarLeituras(DispSen?.Dados);
ModsCalibragem = new Dictionary<T_Code, Dictionary<string, bool>>()
Variaveis.OperacaoEmAndamento.ModsCalibragem = new Dictionary<T_Code, Dictionary<string, bool>>()
{
{ T_Code.Mov, new Dictionary<string, bool>() { } },
{ T_Code.Dir, new Dictionary<string, bool>() { } },
@ -1215,19 +1215,19 @@ namespace AgroBase.Models
WeedWorkerService.ReiniciarLeituraAnalise();
VisualWorkerService.ReiniciarLeituraAnalise();
Controle.Reiniciar();
ControleAnterior.Reiniciar();
Variaveis.OperacaoEmAndamento.Controle.Reiniciar();
Variaveis.OperacaoEmAndamento.ControleAnterior.Reiniciar();
double distanciaPercorrida = DispMvd?.Dados?.DistanciaPercorridaTotal ?? 0;
double tempoAtuado = DispAtu?.Dados?.TempoAtuado ?? 0;
DispSen?.Dados?.ContadorCarga?.AtualizarConsumo(distanciaPercorrida);
DispSen?.Dados?.ContadorCarga?.IniciarOperacao(distanciaPercorrida);
DispAtu?.Dados?.ContadorCarga?.IniciarOperacao(distanciaPercorrida, tempoAtuado);
Variaveis.OperacaoEmAndamento.DispSen?.Dados?.ContadorCarga?.AtualizarConsumo(distanciaPercorrida);
Variaveis.OperacaoEmAndamento.DispSen?.Dados?.ContadorCarga?.IniciarOperacao(distanciaPercorrida);
Variaveis.OperacaoEmAndamento.DispAtu?.Dados?.ContadorCarga?.IniciarOperacao(distanciaPercorrida, tempoAtuado);
GPSTrajetoria = new List<GPSModel>();
Variaveis.OperacaoEmAndamento.GPSTrajetoria = new List<GPSModel>();
Trajetoria?.ProjetarTrajetoriaFixa();
Trajetoria.VerificacaoInicialMeioRuaConcluida = false;
Variaveis.OperacaoEmAndamento.Trajetoria?.ProjetarTrajetoriaFixa();
Variaveis.OperacaoEmAndamento.Trajetoria.VerificacaoInicialMeioRuaConcluida = false;
RedisService.Publish(CmdKey.ManagerWorkerRx, JsonConvert.SerializeObject(new { cmd = ManagerWorkerCommandType.IniciarMPC }));
await RealizarCalibragemInicialAsync(true);

View File

@ -699,7 +699,7 @@ namespace AgroBase.Models.Operacoes
Posicao = x.Posicao,
AnguloAbertura = x.AnguloAbertura,
ComandoAngulo = (int)x.AnguloControle,
LeituraAngulo = x._AnguloBicoLeitura,
LeituraAngulo = (int)x._AnguloBicoLeitura,
ComandoEstado = x.ComandoAtuar,
LeituraEstado = x._EstadoLeitura == Estado.Ligado,
VazaoMediaMLs = x.VazaoMediaMLs,

View File

@ -474,7 +474,7 @@ namespace AgroBase.Models
public static double DistanciaEntreBicosCm { get; set; } = 50;
public static double DensidadeHerbicida { get; set; } = 1.0;
public static double CapacidadeReservatorio { get; set; } = 60;
public static double PressaoMinimaCavitacao { get; set; } = 30.0;
public static double PressaoMinimaCavitacao { get; set; } = 10.0;
public static double ReducaoDirecional { get; set; } = 20.0;
public static double PercentualVelMin
{