Atualizado forma de calibragem do atuador

This commit is contained in:
Diego Freitas 2026-07-03 09:32:25 -03:00
parent 504277b6bd
commit 2f37aa1c9c
2 changed files with 79 additions and 47 deletions

View File

@ -1915,7 +1915,8 @@ namespace AgroBase.Models.Modules
double? potenciaMinPid = null, double? potenciaMinPid = null,
double? Kp = null, double? Kp = null,
double? Ki = null, double? Ki = null,
double? Kd = null double? Kd = null,
bool? desligarSemBicoAberto = null
) )
{ {
var dispAtu = Variaveis.OperacaoEmAndamento?.DispAtu; var dispAtu = Variaveis.OperacaoEmAndamento?.DispAtu;
@ -1926,7 +1927,8 @@ namespace AgroBase.Models.Modules
bool comandoControle = bomba.ComandoAtuar; bool comandoControle = bomba.ComandoAtuar;
double potenciaControle = bomba.PotenciaSP; double potenciaControle = bomba.PotenciaSP;
double pressaoControle = bomba.PressaoSP; double pressaoControle = bomba.PressaoSP;
var modoControle = bomba.Controle.Modo; ModoControleBomba modoControle = bomba.Controle.Modo;
bool desligarSemBicoAbertoControle = bomba.Controle.DesligarSemBicosAbertos;
double potenciaMinPidControle = bomba.Controle.PotenciaMinPID; double potenciaMinPidControle = bomba.Controle.PotenciaMinPID;
double kpControle = bomba.Controle.Kp; double kpControle = bomba.Controle.Kp;
double kiControle = bomba.Controle.Ki; double kiControle = bomba.Controle.Ki;
@ -1942,6 +1944,7 @@ namespace AgroBase.Models.Modules
} }
if (modo.HasValue) bomba.Controle.Modo = modo.Value; if (modo.HasValue) bomba.Controle.Modo = modo.Value;
if (desligarSemBicoAberto.HasValue) bomba.Controle.DesligarSemBicosAbertos = desligarSemBicoAberto.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;
if (Ki.HasValue) bomba.Controle.Ki = Ki.Value; if (Ki.HasValue) bomba.Controle.Ki = Ki.Value;
@ -1962,6 +1965,7 @@ namespace AgroBase.Models.Modules
bomba.PotenciaSP = potenciaControle; bomba.PotenciaSP = potenciaControle;
bomba.PressaoSP = pressaoControle; bomba.PressaoSP = pressaoControle;
bomba.Controle.Modo = modoControle; bomba.Controle.Modo = modoControle;
bomba.Controle.DesligarSemBicosAbertos = desligarSemBicoAbertoControle;
bomba.Controle.PotenciaMinPID = potenciaMinPidControle; bomba.Controle.PotenciaMinPID = potenciaMinPidControle;
bomba.Controle.Kp = kpControle; bomba.Controle.Kp = kpControle;
bomba.Controle.Ki = kiControle; bomba.Controle.Ki = kiControle;
@ -2021,18 +2025,18 @@ namespace AgroBase.Models.Modules
continue; continue;
} }
if (Bomba.ID == BombaPressurizadora.ID) bool EhBombaPressurizadora = Bomba.ID == BombaPressurizadora.ID;
double pressaoTeste = 80.0;
if (EhBombaPressurizadora)
{ {
EnviarComandoFisicoBomba( EnviarComandoFisicoBomba(
Bomba, Bomba,
CanMessagePosicaoDados.Command2, CanMessagePosicaoDados.Command2,
setarControle: true, setarControle: true,
status: true, status: true,
modo: op.Parametros.Controle.AtuModoControle, modo: ModoControleBomba.OnOff,
potenciaMinPid: Bomba.Controle.PotenciaMinPID, desligarSemBicoAberto: false
Kp: Bomba.Controle.Kp,
Ki: Bomba.Controle.Ki,
Kd: Bomba.Controle.Kd
); );
EnviarComandoFisicoBomba( EnviarComandoFisicoBomba(
@ -2041,7 +2045,7 @@ namespace AgroBase.Models.Modules
setarControle: true, setarControle: true,
status: true, status: true,
potencia: 100, potencia: 100,
pressao: op.Parametros.Controle.AtuPressaoLinha pressao: pressaoTeste
); );
} }
else else
@ -2061,46 +2065,62 @@ namespace AgroBase.Models.Modules
{ {
Variaveis.MostrarLog($"[AtuadorModel] [RealizarTestesIniciais] Bomba {Bomba.ID} não possui um sensor de pressão, será controlada mecanicamente pelo pressostato"); Variaveis.MostrarLog($"[AtuadorModel] [RealizarTestesIniciais] Bomba {Bomba.ID} não possui um sensor de pressão, será controlada mecanicamente pelo pressostato");
op.Sensoriamento.InserirLog(Dispositivo, StatusModulo.Alerta, 50, $"Bomba {Bomba.ID} não possui um sensor de pressão, será controlada mecanicamente pelo pressostato", id: Bomba.ID); op.Sensoriamento.InserirLog(Dispositivo, StatusModulo.Alerta, 50, $"Bomba {Bomba.ID} não possui um sensor de pressão, será controlada mecanicamente pelo pressostato", id: Bomba.ID);
op.MarcarModuloCalibrado(Dispositivo, Bomba.ID, true);
bool bombaOk = true;
if (!EhBombaPressurizadora)
{
bool BombaLigou() => Bomba.ComandoAtuar == (Bomba._EstadoLeitura == Estado.Ligado);
await FuncoesGlobais.AguardarCondicaoAsync(BombaLigou, 3000, 200);
bombaOk = BombaLigou();
}
op.MarcarModuloCalibrado(Dispositivo, Bomba.ID, bombaOk);
continue; continue;
} }
await FuncoesGlobais.AguardarCondicaoAsync(Bomba.AtingiuPressao, 3000, 200); await FuncoesGlobais.AguardarCondicaoAsync(() => Bomba.AtingiuPressao(pressaoTeste), 3000, 200);
bool BombaOk = Bomba.AtingiuPressao(); bool BombaOk = Bomba.AtingiuPressao(pressaoTeste);
if (BombaOk) op.MarcarModuloCalibrado(Dispositivo, Bomba.ID, BombaOk);
if (EhBombaPressurizadora)
{ {
op.MarcarModuloCalibrado(Dispositivo, Bomba.ID, true); EnviarComandoFisicoBomba(
Bomba,
CanMessagePosicaoDados.Command2,
setarControle: true,
status: true,
modo: op.Parametros.Controle.AtuModoControle,
desligarSemBicoAberto: true,
potenciaMinPid: Bomba.Controle.PotenciaMinPID,
Kp: Bomba.Controle.Kp,
Ki: Bomba.Controle.Ki,
Kd: Bomba.Controle.Kd
);
EnviarComandoFisicoBomba(
Bomba,
CanMessagePosicaoDados.Command1,
setarControle: true,
status: op.Parametros.Controle.PulverizadorAutomatico,
potencia: 100,
pressao: op.Parametros.Controle.AtuPressaoLinha
);
} }
else else
{ {
foreach (var Bico in BicosPulverizadores.Where(x => x.Comandar && x.Inicializado)) bool ligar = op.Parametros.Controle.AtuAgitadorModo != ModoAgitadorCalda.SemAgitacao;
{ EnviarComandoFisicoBomba(
EnviarComandoFisicoBico( Bomba,
Bico, CanMessagePosicaoDados.Command1,
CanMessagePosicaoDados.Command1, setarControle: true,
setarControle: true, status: ligar,
status: true potencia: 100,
); pressao: -1
} );
await Task.Delay(3000);
foreach (var Bico in BicosPulverizadores.Where(x => x.Comandar && x.Inicializado))
{
EnviarComandoFisicoBico(
Bico,
CanMessagePosicaoDados.Command1,
setarControle: true,
status: false
);
}
await FuncoesGlobais.AguardarCondicaoAsync(Bomba.AtingiuPressao, 4000, 200);
BombaOk = Bomba.AtingiuPressao();
op.MarcarModuloCalibrado(Dispositivo, Bomba.ID, BombaOk);
} }
} }
// Testar os bicos // Testar os bicos
@ -2606,6 +2626,7 @@ namespace AgroBase.Models.Modules
new byte[] new byte[]
{ {
(byte)Controle.Modo, (byte)Controle.Modo,
(byte)(Controle.DesligarSemBicosAbertos ? 1 : 0),
(byte)Controle.PotenciaMinPID, (byte)Controle.PotenciaMinPID,
ConverterPIDParaByte(Controle.Kp), ConverterPIDParaByte(Controle.Kp),
ConverterPIDParaByte(Controle.Ki), ConverterPIDParaByte(Controle.Ki),
@ -2621,13 +2642,22 @@ namespace AgroBase.Models.Modules
} }
} }
public bool AtingiuPressao() => _PressaoAtual >= Variaveis.OperacaoEmAndamento.Parametros.Controle.AtuPressaoLinha; public bool AtingiuPressao(double? pressaoMinima = null)
{
double alvo = pressaoMinima
?? Variaveis.OperacaoEmAndamento?.Parametros?.Controle?.AtuPressaoLinha
?? -1;
return _PressaoAtual >= alvo;
}
public class BombaModoControleModel public class BombaModoControleModel
{ {
public ModoControleBomba Modo { get; set; } = ModoControleBomba.OnOff; public ModoControleBomba Modo { get; set; } = ModoControleBomba.OnOff;
public bool DesligarSemBicosAbertos { get; set; } = true;
public double PotenciaMinPID { get; set; } = 40.0; public double PotenciaMinPID { get; set; } = 40.0;
public double Kp { get; set; } = 0.08; public double Kp { get; set; } = 0.08;

View File

@ -668,22 +668,24 @@ class BombaPressurizadora_v2 : public ComponenteCAN {
Estado novoEstado = (Estado)data[2]; Estado novoEstado = (Estado)data[2];
double potencia = (data.size() > 3) ? (double)data[3] : _PotenciaSP; double potencia = (data.size() > 3) ? (double)data[3] : _PotenciaSP;
double pressao = (data.size() > 4) ? (double)data[4] : _PressaoSP; double pressao = (data.size() > 4) ? (double)data[4] : _PressaoSP;
AtualizarControle(novoEstado, potencia, pressao); AtualizarControle(novoEstado, potencia, pressao);
return true; return true;
} }
case CanMessagePosicaoDados::Command2: { case CanMessagePosicaoDados::Command2: {
if (data.size() < 7) { if (data.size() < 8) {
MostrarLog("Command2 invalido para bomba"); MostrarLog("Command2 invalido para bomba");
return false; return false;
} }
ModoControleBomba modo = static_cast<ModoControleBomba>(data[2]); ModoControleBomba modo = static_cast<ModoControleBomba>(data[2]);
double potenciaMin = (double)data[3]; bool desligarSemBicoAberto = (data.size() > 3) ? (int)data[3] == 1 : DesligarSemBicosAbertos;
double kp = ((double)data[4]) / 10.0; double potenciaMin = (double)data[4];
double ki = ((double)data[5]) / 10.0; double kp = ((double)data[5]) / 10.0;
double kd = ((double)data[6]) / 10.0; double ki = ((double)data[6]) / 10.0;
double kd = ((double)data[7]) / 10.0;
DesligarSemBicosAbertos = desligarSemBicoAberto;
ConfigurarModoControle(modo); ConfigurarModoControle(modo);
ConfigurarPID(kp, ki, kd, potenciaMin, PotenciaMaxPID); ConfigurarPID(kp, ki, kd, potenciaMin, PotenciaMaxPID);