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? Kp = null,
double? Ki = null,
double? Kd = null
double? Kd = null,
bool? desligarSemBicoAberto = null
)
{
var dispAtu = Variaveis.OperacaoEmAndamento?.DispAtu;
@ -1926,7 +1927,8 @@ namespace AgroBase.Models.Modules
bool comandoControle = bomba.ComandoAtuar;
double potenciaControle = bomba.PotenciaSP;
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 kpControle = bomba.Controle.Kp;
double kiControle = bomba.Controle.Ki;
@ -1942,6 +1944,7 @@ namespace AgroBase.Models.Modules
}
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 (Kp.HasValue) bomba.Controle.Kp = Kp.Value;
if (Ki.HasValue) bomba.Controle.Ki = Ki.Value;
@ -1962,6 +1965,7 @@ namespace AgroBase.Models.Modules
bomba.PotenciaSP = potenciaControle;
bomba.PressaoSP = pressaoControle;
bomba.Controle.Modo = modoControle;
bomba.Controle.DesligarSemBicosAbertos = desligarSemBicoAbertoControle;
bomba.Controle.PotenciaMinPID = potenciaMinPidControle;
bomba.Controle.Kp = kpControle;
bomba.Controle.Ki = kiControle;
@ -2021,18 +2025,18 @@ namespace AgroBase.Models.Modules
continue;
}
if (Bomba.ID == BombaPressurizadora.ID)
bool EhBombaPressurizadora = Bomba.ID == BombaPressurizadora.ID;
double pressaoTeste = 80.0;
if (EhBombaPressurizadora)
{
EnviarComandoFisicoBomba(
Bomba,
CanMessagePosicaoDados.Command2,
setarControle: true,
status: true,
modo: op.Parametros.Controle.AtuModoControle,
potenciaMinPid: Bomba.Controle.PotenciaMinPID,
Kp: Bomba.Controle.Kp,
Ki: Bomba.Controle.Ki,
Kd: Bomba.Controle.Kd
modo: ModoControleBomba.OnOff,
desligarSemBicoAberto: false
);
EnviarComandoFisicoBomba(
@ -2041,7 +2045,7 @@ namespace AgroBase.Models.Modules
setarControle: true,
status: true,
potencia: 100,
pressao: op.Parametros.Controle.AtuPressaoLinha
pressao: pressaoTeste
);
}
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");
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;
}
await FuncoesGlobais.AguardarCondicaoAsync(Bomba.AtingiuPressao, 3000, 200);
await FuncoesGlobais.AguardarCondicaoAsync(() => Bomba.AtingiuPressao(pressaoTeste), 3000, 200);
bool BombaOk = Bomba.AtingiuPressao();
if (BombaOk)
bool BombaOk = Bomba.AtingiuPressao(pressaoTeste);
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
{
foreach (var Bico in BicosPulverizadores.Where(x => x.Comandar && x.Inicializado))
{
EnviarComandoFisicoBico(
Bico,
CanMessagePosicaoDados.Command1,
setarControle: true,
status: true
);
}
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);
bool ligar = op.Parametros.Controle.AtuAgitadorModo != ModoAgitadorCalda.SemAgitacao;
EnviarComandoFisicoBomba(
Bomba,
CanMessagePosicaoDados.Command1,
setarControle: true,
status: ligar,
potencia: 100,
pressao: -1
);
}
}
// Testar os bicos
@ -2606,6 +2626,7 @@ namespace AgroBase.Models.Modules
new byte[]
{
(byte)Controle.Modo,
(byte)(Controle.DesligarSemBicosAbertos ? 1 : 0),
(byte)Controle.PotenciaMinPID,
ConverterPIDParaByte(Controle.Kp),
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 ModoControleBomba Modo { get; set; } = ModoControleBomba.OnOff;
public bool DesligarSemBicosAbertos { get; set; } = true;
public double PotenciaMinPID { get; set; } = 40.0;
public double Kp { get; set; } = 0.08;

View File

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