Compare commits

...

2 Commits

Author SHA1 Message Date
Diego Freitas 504277b6bd adicionado atuador 2026-07-03 08:42:59 -03:00
Diego Freitas aa827bb57b ajustes de controle atuador e trajetoria 2026-07-03 08:42:47 -03:00
7 changed files with 147 additions and 51 deletions

View File

@ -156,7 +156,8 @@ namespace AgroBase.Forms.Atuador
op.DispAtu?.Dados?.EnviarComandoFisicoBomba(
Bomba,
Services.CanMessagePosicaoDados.Command1,
Bomba.ComandoAtuar
setarControle: true,
status: Bomba.ComandoAtuar
);
}
@ -167,7 +168,8 @@ namespace AgroBase.Forms.Atuador
op.DispAtu?.Dados?.EnviarComandoFisicoBomba(
Bomba,
Services.CanMessagePosicaoDados.Command1,
true
setarControle: true,
status: true
);
}
@ -178,7 +180,8 @@ namespace AgroBase.Forms.Atuador
op.DispAtu?.Dados?.EnviarComandoFisicoBomba(
Bomba,
Services.CanMessagePosicaoDados.Command1,
false
setarControle: true,
status: false
);
}
@ -208,7 +211,8 @@ namespace AgroBase.Forms.Atuador
Variaveis.OperacaoEmAndamento.DispAtu?.Dados?.EnviarComandoFisicoBico(
Bico,
Services.CanMessagePosicaoDados.Command1,
false
setarControle: true,
status: false
);
pnlBicos.Controls.OfType<Panel>().First(x => x.Name == "pnlB_" + ID).Invalidate();
pnlBicos.Controls.OfType<Panel>().First(x => x.Name == "pnlB_" + ID).Controls.OfType<Label>().First(x => x.Name == "lblCmd_" + ID).Text = "Comando: Desligado";
@ -223,7 +227,8 @@ namespace AgroBase.Forms.Atuador
Variaveis.OperacaoEmAndamento.DispAtu?.Dados?.EnviarComandoFisicoBico(
Bico,
Services.CanMessagePosicaoDados.Command1,
true
setarControle: true,
status: true
);
pnlBicos.Controls.OfType<Panel>().First(x => x.Name == "pnlB_" + ID).Invalidate();
pnlBicos.Controls.OfType<Panel>().First(x => x.Name == "pnlB_" + ID).Controls.OfType<Label>().First(x => x.Name == "lblCmd_" + ID).Text = "Comando: Ligado";

View File

@ -530,7 +530,8 @@ namespace AgroBase.Forms.IHM
op.DispAtu?.Dados?.EnviarComandoFisicoBomba(
Bomba,
CanMessagePosicaoDados.Command1,
Ligar,
setarControle: true,
status: Ligar,
potencia: 100,
pressao: Pressao + 10
);
@ -553,7 +554,8 @@ namespace AgroBase.Forms.IHM
Variaveis.OperacaoEmAndamento.DispAtu?.Dados?.EnviarComandoFisicoBico(
Bico,
CanMessagePosicaoDados.Command1,
Ligar
setarControle: true,
status: Ligar
);
DateTime inicio = DateTime.Now;
while (DateTime.Now < inicio.AddMilliseconds(Timeout))

View File

@ -675,7 +675,8 @@ namespace AgroBase.Forms.Operacoes
op.DispAtu?.Dados?.EnviarComandoFisicoBico(
Bico,
CanMessagePosicaoDados.Command1,
comando
setarControle: true,
status: comando
);
pnlAtuadores.Controls.OfType<Label>().First(x => x.Name == "lblCmd_" + ID).Text = "Comando: " + (comando ? "Ligado" : "Desligado");
@ -700,7 +701,8 @@ namespace AgroBase.Forms.Operacoes
op.DispAtu?.Dados?.EnviarComandoFisicoBomba(
Bomba,
CanMessagePosicaoDados.Command2,
true,
setarControle: true,
status: true,
modo: (ModoControleBomba)cmbModoBomba.SelectedIndex,
potenciaMinPid: potMin,
Kp: Kp,
@ -711,7 +713,8 @@ namespace AgroBase.Forms.Operacoes
op.DispAtu?.Dados?.EnviarComandoFisicoBomba(
Bomba,
CanMessagePosicaoDados.Command1,
true,
setarControle: true,
status: true,
potencia: potMax,
pressao: pressao
);
@ -725,7 +728,8 @@ namespace AgroBase.Forms.Operacoes
op.DispAtu?.Dados?.EnviarComandoFisicoBomba(
Bomba,
CanMessagePosicaoDados.Command1,
false
setarControle: true,
status: false
);
}
@ -740,7 +744,8 @@ namespace AgroBase.Forms.Operacoes
op.DispAtu?.Dados?.EnviarComandoFisicoBomba(
Agitador,
CanMessagePosicaoDados.Command2,
true,
setarControle: true,
status: true,
modo: Agitador.Controle.Modo,
potenciaMinPid: Agitador.Controle.PotenciaMinPID,
Kp: Agitador.Controle.Kp,
@ -751,7 +756,8 @@ namespace AgroBase.Forms.Operacoes
op.DispAtu?.Dados?.EnviarComandoFisicoBomba(
Agitador,
CanMessagePosicaoDados.Command1,
true,
setarControle: true,
status: true,
potencia: potencia
);
}
@ -764,7 +770,8 @@ namespace AgroBase.Forms.Operacoes
op.DispAtu?.Dados?.EnviarComandoFisicoBomba(
Agitador,
CanMessagePosicaoDados.Command1,
false
setarControle: true,
status: false
);
}

View File

@ -631,7 +631,8 @@ namespace AgroBase
op?.DispAtu?.Dados?.EnviarComandoFisicoBico(
bico,
Comando.Comando,
Comando.EstadoAplicar
setarControle: true,
status: Comando.EstadoAplicar
);
return;
@ -639,7 +640,8 @@ namespace AgroBase
op?.DispAtu?.Dados?.EnviarComandoFisicoBomba(
bomba,
Comando.Comando,
Comando.EstadoAplicar
setarControle: true,
status: Comando.EstadoAplicar
);
return;
}

View File

@ -1335,7 +1335,8 @@ namespace AgroBase.Models.Modules
EnviarComandoFisicoBomba(
bomba,
CanMessagePosicaoDados.Command2,
true,
setarControle: true,
status: true,
modo: bomba.Controle.Modo,
potenciaMinPid: bomba.Controle.PotenciaMinPID,
Kp: bomba.Controle.Kp,
@ -1361,7 +1362,8 @@ namespace AgroBase.Models.Modules
EnviarComandoFisicoBomba(
agitador,
CanMessagePosicaoDados.Command2,
true,
setarControle: true,
status: true,
modo: agitador.Controle.Modo,
potenciaMinPid: agitador.Controle.PotenciaMinPID,
Kp: agitador.Controle.Kp,
@ -1431,7 +1433,8 @@ namespace AgroBase.Models.Modules
EnviarComandoFisicoBomba(
bomba,
CanMessagePosicaoDados.Command1,
statusDesejado,
setarControle: false,
status: statusDesejado,
potencia: potenciaEfetiva,
pressao: pressaoEfetiva
);
@ -1738,7 +1741,8 @@ namespace AgroBase.Models.Modules
EnviarComandoFisicoBico(
bico,
CanMessagePosicaoDados.Command1,
statusDesejado,
setarControle: false,
status: statusDesejado,
angulo: anguloDesejado
);
}
@ -1826,12 +1830,13 @@ namespace AgroBase.Models.Modules
bool pressaoDivergente = bomba.Sensor_ID_Num > -1 && Math.Abs(bomba._PressaoSP - pressaoEfetiva) > 0.05;
if (potenciaDivergente || pressaoDivergente) // estadoDivergente ||
if (estadoDivergente || potenciaDivergente || pressaoDivergente)
{
EnviarComandoFisicoBomba(
bomba,
CanMessagePosicaoDados.Command1,
statusDesejado,
setarControle: false,
status: statusDesejado,
potencia: potenciaEfetiva,
pressao: pressaoEfetiva
);
@ -1853,6 +1858,7 @@ namespace AgroBase.Models.Modules
public void EnviarComandoFisicoBico(
AtuadorBicoModel bico,
CanMessagePosicaoDados dado,
bool setarControle,
bool status,
double? angulo = null
)
@ -1862,20 +1868,46 @@ namespace AgroBase.Models.Modules
if (dispAtu?.Dados?.Conectado != true || bico == null)
return;
bico.ComandoAtuar = status;
if (angulo.HasValue) bico.AnguloControle = angulo.Value;
bool comandoControle = bico.ComandoAtuar;
double anguloControle = bico.AnguloControle;
(_, _, byte[] data) = bico.ProtocoloComando();
try
{
bico.ComandoAtuar = status;
dispAtu.AdicionarMensagemFila(bico.ID_Num, dado, dado, data, false);
bico.UltimoComandoEnviado = DateTime.Now;
bico.UltimoStatusDesejado = status;
if (angulo.HasValue) bico.UltimoAnguloDesejado = angulo.Value;
if (angulo.HasValue)
bico.AnguloControle = angulo.Value;
(_, _, byte[] data) = bico.ProtocoloComando();
dispAtu.AdicionarMensagemFila(
bico.ID_Num,
dado,
dado,
data,
false
);
bico.UltimoComandoEnviado = DateTime.Now;
bico.UltimoStatusDesejado = status;
if (angulo.HasValue)
bico.UltimoAnguloDesejado = angulo.Value;
}
finally
{
if (!setarControle)
{
bico.ComandoAtuar = comandoControle;
bico.AnguloControle = anguloControle;
}
}
}
public void EnviarComandoFisicoBomba(
AtuadorBombaModel bomba,
CanMessagePosicaoDados dado,
bool setarControle,
bool status,
double? potencia = null,
double? pressao = null,
@ -1891,9 +1923,24 @@ namespace AgroBase.Models.Modules
if (dispAtu?.Dados?.Conectado != true || bomba == null)
return;
bomba.ComandoAtuar = status;
if (potencia.HasValue) bomba.PotenciaSP = potencia.Value;
if (pressao.HasValue) bomba.PressaoSP = pressao.Value;
bool comandoControle = bomba.ComandoAtuar;
double potenciaControle = bomba.PotenciaSP;
double pressaoControle = bomba.PressaoSP;
var modoControle = bomba.Controle.Modo;
double potenciaMinPidControle = bomba.Controle.PotenciaMinPID;
double kpControle = bomba.Controle.Kp;
double kiControle = bomba.Controle.Ki;
double kdControle = bomba.Controle.Kd;
bool ehComandoEstado = dado == CanMessagePosicaoDados.Command1;
if (ehComandoEstado)
{
bomba.ComandoAtuar = status;
if (potencia.HasValue) bomba.PotenciaSP = potencia.Value;
if (pressao.HasValue) bomba.PressaoSP = pressao.Value;
}
if (modo.HasValue) bomba.Controle.Modo = modo.Value;
if (potenciaMinPid.HasValue) bomba.Controle.PotenciaMinPID = potenciaMinPid.Value;
if (Kp.HasValue) bomba.Controle.Kp = Kp.Value;
@ -1908,6 +1955,18 @@ namespace AgroBase.Models.Modules
bomba.UltimoStatusDesejado = status;
if (potencia.HasValue) bomba.UltimaPotenciaDesejada = potencia.Value;
if (pressao.HasValue) bomba.UltimaPressaoDesejada = pressao.Value;
if (!setarControle)
{
bomba.ComandoAtuar = comandoControle;
bomba.PotenciaSP = potenciaControle;
bomba.PressaoSP = pressaoControle;
bomba.Controle.Modo = modoControle;
bomba.Controle.PotenciaMinPID = potenciaMinPidControle;
bomba.Controle.Kp = kpControle;
bomba.Controle.Ki = kiControle;
bomba.Controle.Kd = kdControle;
}
}
@ -1967,7 +2026,8 @@ namespace AgroBase.Models.Modules
EnviarComandoFisicoBomba(
Bomba,
CanMessagePosicaoDados.Command2,
true,
setarControle: true,
status: true,
modo: op.Parametros.Controle.AtuModoControle,
potenciaMinPid: Bomba.Controle.PotenciaMinPID,
Kp: Bomba.Controle.Kp,
@ -1978,7 +2038,8 @@ namespace AgroBase.Models.Modules
EnviarComandoFisicoBomba(
Bomba,
CanMessagePosicaoDados.Command1,
true,
setarControle: true,
status: true,
potencia: 100,
pressao: op.Parametros.Controle.AtuPressaoLinha
);
@ -1989,7 +2050,8 @@ namespace AgroBase.Models.Modules
EnviarComandoFisicoBomba(
Bomba,
CanMessagePosicaoDados.Command1,
ligar,
setarControle: true,
status: ligar,
potencia: 100,
pressao: -1
);
@ -2017,7 +2079,8 @@ namespace AgroBase.Models.Modules
EnviarComandoFisicoBico(
Bico,
CanMessagePosicaoDados.Command1,
true
setarControle: true,
status: true
);
}
@ -2028,7 +2091,8 @@ namespace AgroBase.Models.Modules
EnviarComandoFisicoBico(
Bico,
CanMessagePosicaoDados.Command1,
false
setarControle: true,
status: false
);
}
@ -2052,7 +2116,8 @@ namespace AgroBase.Models.Modules
EnviarComandoFisicoBico(
Bico,
CanMessagePosicaoDados.Command1,
true
setarControle: true,
status: true
);
await Task.Delay(200);
@ -2060,7 +2125,8 @@ namespace AgroBase.Models.Modules
EnviarComandoFisicoBico(
Bico,
CanMessagePosicaoDados.Command1,
false
setarControle: true,
status: false
);
await Task.Delay(200);

View File

@ -95,11 +95,11 @@ namespace AgroBase.Models
{
get
{
return _tmrLogsOperacao.Interval;
return _tmrLogsOperacao?.Interval ?? 1000;
}
set
{
_tmrLogsOperacao.SetInterval((int)value);
_tmrLogsOperacao?.SetInterval((int)value);
}
}
private AsyncTaskTimerModel _tmrLogsOperacao;
@ -1249,6 +1249,8 @@ namespace AgroBase.Models
novaOp.DefinirComponentesEmUso();
Variaveis.OperacaoEmAndamento = novaOp;
var ruasSelecionadas = parametros.RuasPercorrer ?? new List<string>();
if (parametros.Mapa != null)
@ -1258,8 +1260,6 @@ namespace AgroBase.Models
novaOp.Mapa.PopularTrajetoriaMapa(parametros.Mapa);
}
Variaveis.OperacaoEmAndamento = novaOp;
RedisService.AtualizarCampos(CtxKey.DadosOperacao, ("configurado", false));
return novaOp;
@ -1986,7 +1986,8 @@ namespace AgroBase.Models
op.DispAtu?.Dados?.EnviarComandoFisicoBico(
bicos[i],
CanMessagePosicaoDados.Command1,
bicos[i].ComandoAtuar
setarControle: true,
status: bicos[i].ComandoAtuar
);
}
}
@ -2590,7 +2591,8 @@ namespace AgroBase.Models
dadosAtu?.EnviarComandoFisicoBico(
bico,
CanMessagePosicaoDados.Command1,
controleBase.Controle.Estado == true,
setarControle: true,
status: controleBase.Controle.Estado == true,
angulo: controleBase.Controle.AnguloSP
);
return;
@ -2616,7 +2618,8 @@ namespace AgroBase.Models
dadosAtu?.EnviarComandoFisicoBomba(
bomba,
CanMessagePosicaoDados.Command1,
controleBase.Controle.Estado == true,
setarControle: true,
status: controleBase.Controle.Estado == true,
potencia: controleBase.Controle.Potencia,
pressao: controleBase.Controle.Pressao,
modo: op.Parametros.Controle.AtuModoControle
@ -4899,6 +4902,9 @@ namespace AgroBase.Models
{
if (op == null) return;
if (!ReferenceEquals(Variaveis.OperacaoEmAndamento, op))
op = Variaveis.OperacaoEmAndamento;
DateTime agora = DateTime.Now;
// Contexto

View File

@ -671,7 +671,7 @@ namespace AgroBase.Models
if (!_TrajetoriaFixaDefinida) return;
// Atualiza apenas os pontos dentro do intervalo definido
foreach (var ponto in _TrajetoriaJanela)
foreach (var ponto in _TrajetoriaJanela ?? new List<PontoTrajetoriaModel>())
{
ponto.AtualizarPropriedades();
}
@ -2847,8 +2847,16 @@ namespace AgroBase.Models
var op = Variaveis.OperacaoEmAndamento;
// Valida índice do corredor
if (op.Trajetoria?._Corredores?.Count <= idxCorredor)
if ((op.Trajetoria?._Corredores?.Count ?? 0) <= idxCorredor)
{
Liberado = false;
Motivos = new List<string>()
{
$"Trajetória não possui corredores definidos. {idxCorredor}/{op.Trajetoria?._Corredores?.Count}"
};
Status = AutonomiaCorredorStatus.Critico;
return;
}
// Se já registrou esse corredor como liberado e travado/feito, não recalcula
if (CorredoresLiberados.ContainsKey(idxCorredor) && CorredoresLiberados[idxCorredor].Liberado)