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( op.DispAtu?.Dados?.EnviarComandoFisicoBomba(
Bomba, Bomba,
Services.CanMessagePosicaoDados.Command1, Services.CanMessagePosicaoDados.Command1,
Bomba.ComandoAtuar setarControle: true,
status: Bomba.ComandoAtuar
); );
} }
@ -167,7 +168,8 @@ namespace AgroBase.Forms.Atuador
op.DispAtu?.Dados?.EnviarComandoFisicoBomba( op.DispAtu?.Dados?.EnviarComandoFisicoBomba(
Bomba, Bomba,
Services.CanMessagePosicaoDados.Command1, Services.CanMessagePosicaoDados.Command1,
true setarControle: true,
status: true
); );
} }
@ -178,7 +180,8 @@ namespace AgroBase.Forms.Atuador
op.DispAtu?.Dados?.EnviarComandoFisicoBomba( op.DispAtu?.Dados?.EnviarComandoFisicoBomba(
Bomba, Bomba,
Services.CanMessagePosicaoDados.Command1, Services.CanMessagePosicaoDados.Command1,
false setarControle: true,
status: false
); );
} }
@ -208,7 +211,8 @@ namespace AgroBase.Forms.Atuador
Variaveis.OperacaoEmAndamento.DispAtu?.Dados?.EnviarComandoFisicoBico( Variaveis.OperacaoEmAndamento.DispAtu?.Dados?.EnviarComandoFisicoBico(
Bico, Bico,
Services.CanMessagePosicaoDados.Command1, 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).Invalidate();
pnlBicos.Controls.OfType<Panel>().First(x => x.Name == "pnlB_" + ID).Controls.OfType<Label>().First(x => x.Name == "lblCmd_" + ID).Text = "Comando: Desligado"; 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( Variaveis.OperacaoEmAndamento.DispAtu?.Dados?.EnviarComandoFisicoBico(
Bico, Bico,
Services.CanMessagePosicaoDados.Command1, 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).Invalidate();
pnlBicos.Controls.OfType<Panel>().First(x => x.Name == "pnlB_" + ID).Controls.OfType<Label>().First(x => x.Name == "lblCmd_" + ID).Text = "Comando: Ligado"; 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( op.DispAtu?.Dados?.EnviarComandoFisicoBomba(
Bomba, Bomba,
CanMessagePosicaoDados.Command1, CanMessagePosicaoDados.Command1,
Ligar, setarControle: true,
status: Ligar,
potencia: 100, potencia: 100,
pressao: Pressao + 10 pressao: Pressao + 10
); );
@ -553,7 +554,8 @@ namespace AgroBase.Forms.IHM
Variaveis.OperacaoEmAndamento.DispAtu?.Dados?.EnviarComandoFisicoBico( Variaveis.OperacaoEmAndamento.DispAtu?.Dados?.EnviarComandoFisicoBico(
Bico, Bico,
CanMessagePosicaoDados.Command1, CanMessagePosicaoDados.Command1,
Ligar setarControle: true,
status: Ligar
); );
DateTime inicio = DateTime.Now; DateTime inicio = DateTime.Now;
while (DateTime.Now < inicio.AddMilliseconds(Timeout)) while (DateTime.Now < inicio.AddMilliseconds(Timeout))

View File

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

View File

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

View File

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

View File

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

View File

@ -671,7 +671,7 @@ namespace AgroBase.Models
if (!_TrajetoriaFixaDefinida) return; if (!_TrajetoriaFixaDefinida) return;
// Atualiza apenas os pontos dentro do intervalo definido // Atualiza apenas os pontos dentro do intervalo definido
foreach (var ponto in _TrajetoriaJanela) foreach (var ponto in _TrajetoriaJanela ?? new List<PontoTrajetoriaModel>())
{ {
ponto.AtualizarPropriedades(); ponto.AtualizarPropriedades();
} }
@ -2847,8 +2847,16 @@ namespace AgroBase.Models
var op = Variaveis.OperacaoEmAndamento; var op = Variaveis.OperacaoEmAndamento;
// Valida índice do corredor // 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; return;
}
// Se já registrou esse corredor como liberado e travado/feito, não recalcula // Se já registrou esse corredor como liberado e travado/feito, não recalcula
if (CorredoresLiberados.ContainsKey(idxCorredor) && CorredoresLiberados[idxCorredor].Liberado) if (CorredoresLiberados.ContainsKey(idxCorredor) && CorredoresLiberados[idxCorredor].Liberado)