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

View File

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

View File

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

View File

@ -474,7 +474,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; } = 60; 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 ReducaoDirecional { get; set; } = 20.0;
public static double PercentualVelMin public static double PercentualVelMin
{ {