ajustado movimento combinado

This commit is contained in:
Diego Freitas 2026-09-09 09:18:49 -03:00
parent e0259cc755
commit 8e8f06ebb2
3 changed files with 58 additions and 16 deletions

View File

@ -697,7 +697,7 @@ namespace AgroBase
cmd.CalcularValor(direcao == Direcao.Parado, valorJoy: valor); cmd.CalcularValor(direcao == Direcao.Parado, valorJoy: valor);
bool mudou = direcao != _ultimaDirecaoMovEnviada || double.IsNaN(_ultimoValorMovEnviado) || Math.Abs(cmd.ValorAplicar - _ultimoValorMovEnviado) >= VariacaoMinimaMov; bool mudou = direcao != _ultimaDirecaoMovEnviada || double.IsNaN(_ultimoValorMovEnviado) || Math.Abs(cmd.ValorAplicar - _ultimoValorMovEnviado) >= VariacaoMinimaMov;
bool combinado = MovimentosCombinados.Contains(Variaveis.OperacaoEmAndamento.Controle.TipoMovimento); bool combinado = MovimentosCombinados.Contains(Variaveis.OperacaoEmAndamento.Controle.TipoMovimento);
bool heartbeat = !combinado && (DateTime.Now - _ultimoEnvioDir).TotalMilliseconds >= HeartbeatComandoMs; bool heartbeat = !combinado && (DateTime.Now - _ultimoEnvioMov).TotalMilliseconds >= HeartbeatComandoMs;
if (!mudou && !heartbeat) return; if (!mudou && !heartbeat) return;
EnviarComandoMotorAtualizado(cmd, ForcarComando: false); EnviarComandoMotorAtualizado(cmd, ForcarComando: false);
_ultimaDirecaoMovEnviada = direcao; _ultimoValorMovEnviado = cmd.ValorAplicar; _ultimoEnvioMov = DateTime.Now; _ultimaDirecaoMovEnviada = direcao; _ultimoValorMovEnviado = cmd.ValorAplicar; _ultimoEnvioMov = DateTime.Now;
@ -718,7 +718,8 @@ namespace AgroBase
if (cmd == null) return; if (cmd == null) return;
cmd.CalcularValor(solto, valorJoy: valor); cmd.CalcularValor(solto, valorJoy: valor);
bool mudou = double.IsNaN(_ultimoAnguloDirEnviado) || Math.Abs(cmd.ValorAplicar - _ultimoAnguloDirEnviado) >= VariacaoMinimaDir; bool mudou = double.IsNaN(_ultimoAnguloDirEnviado) || Math.Abs(cmd.ValorAplicar - _ultimoAnguloDirEnviado) >= VariacaoMinimaDir;
bool heartbeat = (DateTime.Now - _ultimoEnvioDir).TotalMilliseconds >= HeartbeatComandoMs; bool combinado = MovimentosCombinados.Contains(Variaveis.OperacaoEmAndamento.Controle.TipoMovimento);
bool heartbeat = !combinado && (DateTime.Now - _ultimoEnvioDir).TotalMilliseconds >= HeartbeatComandoMs;
if (!mudou && !heartbeat) return; if (!mudou && !heartbeat) return;
EnviarComandoMotorAtualizado(cmd, ForcarComando: false); EnviarComandoMotorAtualizado(cmd, ForcarComando: false);
_ultimoAnguloDirEnviado = cmd.ValorAplicar; _ultimoEnvioDir = DateTime.Now; _ultimoAnguloDirEnviado = cmd.ValorAplicar; _ultimoEnvioDir = DateTime.Now;

View File

@ -531,20 +531,36 @@ namespace AgroBase.Models.Modules
private Direcao? _ultimaSolicitacaoMovimentoCombinado = null;
private readonly object _syncMovimentoCombinado = new object();
public async Task ExecutarMovimentoDirecionalCombinado(Direcao DirecaoAtual) public async Task ExecutarMovimentoDirecionalCombinado(Direcao DirecaoAtual)
{ {
_ctsMovimentoCombinado?.Cancel(); CancellationTokenSource cts;
var cts = new CancellationTokenSource(); lock (_syncMovimentoCombinado)
_ctsMovimentoCombinado = cts; {
if (_ultimaSolicitacaoMovimentoCombinado == DirecaoAtual)
return;
await _gateMovimentoCombinado.WaitAsync(); _ultimaSolicitacaoMovimentoCombinado = DirecaoAtual;
_ctsMovimentoCombinado?.Cancel();
cts = new CancellationTokenSource();
_ctsMovimentoCombinado = cts;
}
try try
{ {
if (cts.IsCancellationRequested) await _gateMovimentoCombinado.WaitAsync(cts.Token);
return; }
catch (OperationCanceledException)
{
return;
}
try
{
MovimentoDirecionalCombinadoEmExecucao = true; MovimentoDirecionalCombinadoEmExecucao = true;
var op = Variaveis.OperacaoEmAndamento; var op = Variaveis.OperacaoEmAndamento;
@ -564,9 +580,29 @@ namespace AgroBase.Models.Modules
modulo.MovMotor.EnviarComandoControle(Direcao.Parado); modulo.MovMotor.EnviarComandoControle(Direcao.Parado);
} }
bool parado() => op?.Sensoriamento?.Movimentacao?.RPMMotorMedio <= 5; bool carroParado()
await FuncoesGlobais.AguardarCondicaoAsync(parado, 2500, 200); {
double rpm = op?.Sensoriamento?.Movimentacao?.RPMMotorMedio ?? double.MaxValue;
return Math.Abs(rpm) <= 5;
}
bool finalizarEsperaParada() => cts.IsCancellationRequested || carroParado();
await FuncoesGlobais.AguardarCondicaoAsync(finalizarEsperaParada, 2500, 200);
if (cts.IsCancellationRequested)
return;
if (!carroParado())
{
Variaveis.MostrarLog(
$"[MVD] Movimento combinado abortado: " +
$"tração não confirmou parada | " +
$"RPM={op?.Sensoriamento?.Movimentacao?.RPMMotorMedio:F1}"
);
return;
}
switch (op.Controle.TipoMovimento) switch (op.Controle.TipoMovimento)
{ {
case TipoMovimentoDirecional.RotacionarNoEixo: case TipoMovimentoDirecional.RotacionarNoEixo:
@ -578,10 +614,15 @@ namespace AgroBase.Models.Modules
} }
DateTime Agora = DateTime.Now; DateTime Agora = DateTime.Now;
bool atingiuSp() => Modulos.All(x => x.DirMotor.PosicaoTipoMovimentoConcluido(DirecaoAtual)); bool posicaoConcluida() => Modulos.All(x => x.DirMotor.PosicaoTipoMovimentoConcluido(DirecaoAtual));
await FuncoesGlobais.AguardarCondicaoAsync(atingiuSp, 5000, 200); bool finalizarEsperaAngulo() => cts.IsCancellationRequested || posicaoConcluida();
bool Sucesso = atingiuSp(); await FuncoesGlobais.AguardarCondicaoAsync(finalizarEsperaAngulo, 5000, 200);
if (cts.IsCancellationRequested)
return;
bool Sucesso = posicaoConcluida();
if (Sucesso && DirecaoAtual != Direcao.Parado) if (Sucesso && DirecaoAtual != Direcao.Parado)
{ {
op.Controle.PercentualVelocidadeSP = 20; op.Controle.PercentualVelocidadeSP = 20;

View File

@ -1959,7 +1959,7 @@ namespace AgroBase.Models
var dispMvd = DispMvd; var dispMvd = DispMvd;
if (dispMvd?.Dados?.Modulos != null) // && value != Controle.TipoMovimento if (dispMvd?.Dados?.Modulos != null) // && value != Controle.TipoMovimento
{ {
Controle.DefinirTipoMovimento(value, dispMvd.Dados.Modulos); Controle.DefinirTipoMovimento(value, dispMvd.Dados.Modulos);
} }
} }