ajustado controle de pressão da bomba pid

This commit is contained in:
Diego Freitas 2026-06-25 15:17:42 -03:00
parent 915f14679d
commit f3cca4c54f
8 changed files with 1348 additions and 507 deletions

View File

@ -104,6 +104,8 @@
this.chbSonarAtivado = new System.Windows.Forms.CheckBox();
this.lblPressao = new System.Windows.Forms.Label();
this.chbImuAtivado = new System.Windows.Forms.CheckBox();
this.lblPressaoBomba = new System.Windows.Forms.Label();
this.lblVazaoInstantanea = new System.Windows.Forms.Label();
((System.ComponentModel.ISupportInitialize)(this.chartGraficos)).BeginInit();
this.tabControl1.SuspendLayout();
this.tabMapa.SuspendLayout();
@ -500,6 +502,8 @@
//
// groupBox2
//
this.groupBox2.Controls.Add(this.lblVazaoInstantanea);
this.groupBox2.Controls.Add(this.lblPressaoBomba);
this.groupBox2.Controls.Add(this.label7);
this.groupBox2.Controls.Add(this.nudPotenciaBombaMax);
this.groupBox2.Controls.Add(this.label6);
@ -949,6 +953,30 @@
this.chbImuAtivado.UseVisualStyleBackColor = true;
this.chbImuAtivado.CheckedChanged += new System.EventHandler(this.chbImuAtivado_CheckedChanged);
//
// lblPressaoBomba
//
this.lblPressaoBomba.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
this.lblPressaoBomba.AutoSize = true;
this.lblPressaoBomba.Font = new System.Drawing.Font("Microsoft Sans Serif", 15.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.lblPressaoBomba.Location = new System.Drawing.Point(305, 17);
this.lblPressaoBomba.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0);
this.lblPressaoBomba.Name = "lblPressaoBomba";
this.lblPressaoBomba.Size = new System.Drawing.Size(76, 25);
this.lblPressaoBomba.TabIndex = 48;
this.lblPressaoBomba.Text = "80 psi";
//
// lblVazaoInstantanea
//
this.lblVazaoInstantanea.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
this.lblVazaoInstantanea.AutoSize = true;
this.lblVazaoInstantanea.Font = new System.Drawing.Font("Microsoft Sans Serif", 15.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.lblVazaoInstantanea.Location = new System.Drawing.Point(305, 42);
this.lblVazaoInstantanea.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0);
this.lblVazaoInstantanea.Name = "lblVazaoInstantanea";
this.lblVazaoInstantanea.Size = new System.Drawing.Size(108, 25);
this.lblVazaoInstantanea.TabIndex = 49;
this.lblVazaoInstantanea.Text = "0,00 ml/s";
//
// frmOperacaoManual
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
@ -1088,5 +1116,7 @@
private System.Windows.Forms.Label label7;
private System.Windows.Forms.NumericUpDown nudPotenciaBombaMax;
private System.Windows.Forms.CheckBox chbImuAtivado;
private System.Windows.Forms.Label lblPressaoBomba;
private System.Windows.Forms.Label lblVazaoInstantanea;
}
}

View File

@ -189,6 +189,8 @@ namespace AgroBase.Forms.Operacoes
lblRPM.Text = _Sensoriamento.Movimentacao.RPMMedio.ToString("0") + " rpm";
lblVelocidade.Text = (_Sensoriamento.Movimentacao.VelocidadeMedia * 3.6).ToString("0.00");
lblPressao.Text = $"{(_Sensoriamento.Atuador.PressaoLinha):F0} psi";
lblPressaoBomba.Text = $"{(_Sensoriamento.Atuador.PressaoAtualBomba):F0} psi";
lblVazaoInstantanea.Text = $"{(_Sensoriamento.Atuador.VazaoFluxoMLpSInstantaneaCorrigida):F0} ml/s";
bool atuadorAtivado = Variaveis.OperacaoEmAndamento.DispAtu.Dados.Conectado;
chbPulverizador.Enabled = atuadorAtivado;
@ -587,9 +589,9 @@ namespace AgroBase.Forms.Operacoes
gridDados.Rows[29].Cells[1].Value = (_Atuador?.PressaoLinha ?? 0).ToString("0.00");
gridDados.Rows[30].Cells[1].Value = (_Atuador?.LeituraPotenciaBomba ?? 0).ToString("0.00");
gridDados.Rows[31].Cells[1].Value = (_Atuador?.BombaCavitada ?? false) ? "Sim" : "Não";
gridDados.Rows[32].Cells[1].Value = $"{_Atuador?.VazaoInstantanea ?? 0:0.000} ({Variaveis.OperacaoEmAndamento.DispAtu?.Dados?.VazaoFluxoMLpSInstantaneaCalc:0.000})";
gridDados.Rows[33].Cells[1].Value = $"{_Atuador?.VazaoMedia ?? 0:0.000}";
gridDados.Rows[34].Cells[1].Value = (_Atuador?.VolumeVazaoMl ?? 0).ToString("0.00");
gridDados.Rows[32].Cells[1].Value = $"{_Atuador?.VazaoFluxoMLpSInstantanea ?? 0:0.000} ({_Atuador?.VazaoFluxoMLpSInstantaneaCorrigida ?? 0:0.000})";
gridDados.Rows[33].Cells[1].Value = $"{_Atuador?.VazaoFluxoMLpSMedia ?? 0:0.000}";
gridDados.Rows[34].Cells[1].Value = (_Atuador?.VolumeVazaoML ?? 0).ToString("0.00");
gridDados.Rows[35].Cells[1].Value = (_Atuador?.AnguloBarraEsquerda ?? 0).ToString("0.00");
gridDados.Rows[36].Cells[1].Value = (_Atuador?.AnguloBarraDireita ?? 0).ToString("0.00");
gridDados.Rows[37].Cells[1].Value = (Variaveis.OperacaoEmAndamento.DispAtu?.Dados?.AgitadorDeCalda?._Potencia ?? 0).ToString("0.00");

View File

@ -121,11 +121,11 @@ namespace AgroBase.Models.Modules
[JsonIgnore]
private SensorModel SensorFluxoLinha => Sensores.FirstOrDefault(x => x.Componente == S_Code.sFLX && x.ID == "FLXLN");
const double FatorCalibracaoFluxo = 0.776;
const double FatorCalibracaoFluxo = 0.55;
public double VazaoMaximaSensor_LMin { get; set; } = 20.0;
public double VazaoFluxoMLpSInstantanea => SensorFluxoLinha?.ValoresLeituras?.FirstOrDefault(x => x.funcao == FuncoesPinout.Fluxo)?.atual?.valor ?? 0;
public double VazaoFluxoMLpSInstantanea => SensorFluxoLinha?.ValoresLeituras?.FirstOrDefault(x => x.posicao == CanMessagePosicaoDados.Dados1 && x.funcao == FuncoesPinout.Fluxo)?.atual?.valor ?? 0;
public double VazaoFluxoMLpSInstantaneaCorrigida => VazaoFluxoMLpSInstantanea * FatorCalibracaoFluxo;
@ -188,12 +188,12 @@ namespace AgroBase.Models.Modules
public double _PressaoVmin { get; set; } = 0.0;
public double _PressaoVmax { get; set; } = 4.5;
public double _PressaoMax { get; set; } = 174.045; // 1,2 MPa
public double PressaoLinha => SensorPressaoLinha?.ValoresLeituras.FirstOrDefault(x => x.funcao == FuncoesPinout.Pressao)?.atual?.valor ?? 0;
public double PressaoLinha => SensorPressaoLinha?.ValoresLeituras.FirstOrDefault(x => x.posicao == CanMessagePosicaoDados.Dados1 && x.funcao == FuncoesPinout.Pressao)?.atual?.valor ?? 0;
public double PressaoLinhaCalc
{
get
{
double _LeituraPressao = SensorPressaoLinha?.ValoresLeituras?.FirstOrDefault(x => x.funcao == FuncoesPinout.LeituraBruta)?.atual?.valor ?? 0;
double _LeituraPressao = SensorPressaoLinha?.ValoresLeituras?.FirstOrDefault(x => x.posicao == CanMessagePosicaoDados.Dados1 && x.funcao == FuncoesPinout.LeituraBruta)?.atual?.valor ?? 0;
double tensao = FuncoesMatematicas.Map(_LeituraPressao, 0, 4095, 0, 3300) / 1000.0;
double pressao = FuncoesMatematicas.Map(tensao, _PressaoVmin, _PressaoVmax, 0, _PressaoMax);
return pressao;
@ -231,22 +231,15 @@ namespace AgroBase.Models.Modules
{
var sensor = SensorFluxoLinha;
if (sensor == null ||
!sensor.Inicializado ||
sensor.ValoresLeituras == null)
{
if (sensor == null || !sensor.Inicializado || sensor.ValoresLeituras == null)
return 0;
}
double maximaMLs =
VazaoMaximaSensor_LMin *
1000.0 /
60.0;
var leituraFluxo =
sensor.ValoresLeituras.FirstOrDefault(
x => x.funcao == FuncoesPinout.Fluxo
);
var leituraFluxo = sensor.ValoresLeituras.FirstOrDefault(x => x.posicao == CanMessagePosicaoDados.Dados1 && x.funcao == FuncoesPinout.Fluxo);
/*
* IMPORTANTE:
@ -262,10 +255,7 @@ namespace AgroBase.Models.Modules
try
{
vazaoMLs =
Convert.ToDouble(
leituraFluxo.atual.valor
);
vazaoMLs = Convert.ToDouble(leituraFluxo.atual.valor);
}
catch
{
@ -279,8 +269,10 @@ namespace AgroBase.Models.Modules
return 0;
}
double vazaoCorrigidaMLs = vazaoMLs * FatorCalibracaoFluxo;
return FuncoesMatematicas.Clamp(
vazaoMLs,
vazaoCorrigidaMLs,
0.0,
maximaMLs
);
@ -290,32 +282,19 @@ namespace AgroBase.Models.Modules
* Fallback por pulso:
* aqui sim a fórmula calcula q em L/min e depois converte para mL/s.
*/
var leituraPulsos =
sensor.ValoresLeituras.FirstOrDefault(
x => x.funcao == FuncoesPinout.QtdPulsos
);
var leituraPulsos = sensor.ValoresLeituras.FirstOrDefault(x => x.posicao == CanMessagePosicaoDados.Dados1 && x.funcao == FuncoesPinout.QtdPulsos);
var leituraPeriodo = sensor.ValoresLeituras.FirstOrDefault(x => x.posicao == CanMessagePosicaoDados.Dados1 && x.funcao == FuncoesPinout.Periodo);
var leituraPeriodo =
sensor.ValoresLeituras.FirstOrDefault(
x => x.funcao == FuncoesPinout.Periodo
);
if (!LeituraSensorRecente(leituraPulsos, agora) ||
!LeituraSensorRecente(leituraPeriodo, agora))
{
if (!LeituraSensorRecente(leituraPulsos, agora) || !LeituraSensorRecente(leituraPeriodo, agora))
return 0;
}
double calculadaMLs =
VazaoFluxoMLpSInstantaneaCalc;
if (double.IsNaN(calculadaMLs) ||
double.IsInfinity(calculadaMLs) ||
calculadaMLs < 0)
{
if (double.IsNaN(calculadaMLs) || double.IsInfinity(calculadaMLs) || calculadaMLs < 0)
return 0;
}
return FuncoesMatematicas.Clamp(
calculadaMLs,
0.0,
@ -325,44 +304,27 @@ namespace AgroBase.Models.Modules
private double ObterPotenciaAtualConfiavelPct(AtuadorBombaModel bomba, DateTime agora)
{
if (bomba == null ||
!bomba.Inicializado ||
bomba.ValoresLeituras == null)
{
if (bomba == null || !bomba.Inicializado || bomba.ValoresLeituras == null)
return 0;
}
var leituraPotencia =
bomba.ValoresLeituras.FirstOrDefault(
x => x.funcao == FuncoesPinout.Potencia
);
var leituraPotencia = bomba.ValoresLeituras.FirstOrDefault(x => x.posicao == CanMessagePosicaoDados.Dados1 && x.funcao == FuncoesPinout.Potencia);
if (!LeituraSensorRecente(
leituraPotencia,
agora))
{
if (!LeituraSensorRecente(leituraPotencia, agora))
return 0;
}
double potencia;
try
{
potencia =
Convert.ToDouble(
leituraPotencia.atual.valor
);
potencia = Convert.ToDouble(leituraPotencia.atual.valor);
}
catch
{
return 0;
}
if (double.IsNaN(potencia) ||
double.IsInfinity(potencia))
{
if (double.IsNaN(potencia) || double.IsInfinity(potencia))
return 0;
}
return FuncoesMatematicas.Clamp(
potencia,
@ -1168,6 +1130,13 @@ namespace AgroBase.Models.Modules
posicao = CanMessagePosicaoDados.Status,
indice = 0,
},
new SensorValoresLeituraModel()
{
funcao = FuncoesPinout.MalhaFechada,
posicao = CanMessagePosicaoDados.Status,
indice = 1,
},
new SensorValoresLeituraModel()
{
funcao = FuncoesPinout.EstadoLeitura,
@ -1203,7 +1172,44 @@ namespace AgroBase.Models.Modules
funcao = FuncoesPinout.ModoControleBomba,
posicao = CanMessagePosicaoDados.Dados1,
indice = 5,
}
},
new SensorValoresLeituraModel()
{
funcao = FuncoesPinout.QtdPulsos,
posicao = CanMessagePosicaoDados.Dados2,
indice = 0,
},
new SensorValoresLeituraModel()
{
funcao = FuncoesPinout.PotenciaSP,
posicao = CanMessagePosicaoDados.Dados2,
indice = 1,
},
new SensorValoresLeituraModel()
{
funcao = FuncoesPinout.Potencia,
posicao = CanMessagePosicaoDados.Dados2,
indice = 2,
},
new SensorValoresLeituraModel()
{
funcao = FuncoesPinout.Pressao,
posicao = CanMessagePosicaoDados.Dados2,
indice = 3,
},
new SensorValoresLeituraModel()
{
funcao = FuncoesPinout.PressaoSP,
posicao = CanMessagePosicaoDados.Dados2,
indice = 4,
},
new SensorValoresLeituraModel()
{
funcao = FuncoesPinout.PressaoSPExtra,
posicao = CanMessagePosicaoDados.Dados2,
indice = 5,
},
},
Controle = new AtuadorBombaModel.BombaModoControleModel()
{
@ -1237,6 +1243,13 @@ namespace AgroBase.Models.Modules
posicao = CanMessagePosicaoDados.Status,
indice = 0,
},
new SensorValoresLeituraModel()
{
funcao = FuncoesPinout.MalhaFechada,
posicao = CanMessagePosicaoDados.Status,
indice = 1,
},
new SensorValoresLeituraModel()
{
funcao = FuncoesPinout.EstadoLeitura,
@ -2256,7 +2269,7 @@ namespace AgroBase.Models.Modules
var sensor = Sensores.FirstOrDefault(x => x.ID_Num == id_num);
if (sensor == null) return;
double angulo = sensor.ValoresLeituras?.FirstOrDefault(x => x.funcao == FuncoesPinout.LeituraAngulo)?.atual?.valor ?? double.NaN;
double angulo = sensor.ValoresLeituras?.FirstOrDefault(x => x.posicao == CanMessagePosicaoDados.Dados1 && x.funcao == FuncoesPinout.LeituraAngulo)?.atual?.valor ?? double.NaN;
if (sensor.ID_Num == SensorAnguloBarraEsquerda.ID_Num)
AnguloBarraEsquerda = angulo;
else if (sensor.ID_Num == SensorAnguloBarraDireita.ID_Num)
@ -2302,8 +2315,8 @@ namespace AgroBase.Models.Modules
}
}
public List<SensorValoresLeituraModel> ValoresLeituras { get; set; }
public Estado _EstadoLeitura => (Estado)(ValoresLeituras?.FirstOrDefault(x => x.funcao == FuncoesPinout.EstadoLeitura)?.atual?.valor ?? 0);
public double _AnguloBicoLeitura => ValoresLeituras?.FirstOrDefault(x => x.funcao == FuncoesPinout.ServoAnguloLeitura)?.atual? .valor ?? 0;
public Estado _EstadoLeitura => (Estado)(ValoresLeituras?.FirstOrDefault(x => x.posicao == CanMessagePosicaoDados.Dados1 && x.funcao == FuncoesPinout.EstadoLeitura)?.atual?.valor ?? 0);
public double _AnguloBicoLeitura => ValoresLeituras?.FirstOrDefault(x => x.posicao == CanMessagePosicaoDados.Dados1 && x.funcao == FuncoesPinout.ServoAnguloLeitura)?.atual? .valor ?? 0;
public DateTime UltimoComandoEnviado { get; set; } = DateTime.MinValue;
public bool UltimoStatusDesejado { get; set; } = false;
@ -2517,12 +2530,19 @@ namespace AgroBase.Models.Modules
}
public List<SensorValoresLeituraModel> ValoresLeituras { get; set; }
public BombaModoControleModel Controle { get; set; }
public Estado _EstadoLeitura => ValoresLeituras?.FirstOrDefault(x => x.funcao == FuncoesPinout.EstadoLeitura)?.atual?.valor ?? Estado.Desligado;
public double _Potencia => ValoresLeituras?.FirstOrDefault(x => x.funcao == FuncoesPinout.Potencia)?.atual?.valor ?? 0;
public Estado _EstadoLeitura => ValoresLeituras?.FirstOrDefault(x => x.posicao == CanMessagePosicaoDados.Dados1 && x.funcao == FuncoesPinout.EstadoLeitura)?.atual?.valor ?? Estado.Desligado;
public double _Potencia => ValoresLeituras?.FirstOrDefault(x => x.posicao == CanMessagePosicaoDados.Dados1 && x.funcao == FuncoesPinout.Potencia)?.atual?.valor ?? 0;
public bool _BombaLigada => _Potencia > 0;
public double _PressaoSP => ValoresLeituras?.FirstOrDefault(x => x.funcao == FuncoesPinout.PressaoSP)?.atual?.valor ?? 0;
public double _PotenciaSP => ValoresLeituras?.FirstOrDefault(x => x.funcao == FuncoesPinout.PotenciaSP)?.atual?.valor ?? 0;
public double _PressaoAtual => ValoresLeituras?.FirstOrDefault(x => x.funcao == FuncoesPinout.Pressao)?.atual?.valor ?? 0;
public double _PressaoSP => ValoresLeituras?.FirstOrDefault(x => x.posicao == CanMessagePosicaoDados.Dados1 && x.funcao == FuncoesPinout.PressaoSP)?.atual?.valor ?? 0;
public double _PotenciaSP => ValoresLeituras?.FirstOrDefault(x => x.posicao == CanMessagePosicaoDados.Dados1 && x.funcao == FuncoesPinout.PotenciaSP)?.atual?.valor ?? 0;
public double _PressaoAtual => ValoresLeituras?.FirstOrDefault(x => x.posicao == CanMessagePosicaoDados.Dados1 && x.funcao == FuncoesPinout.Pressao)?.atual?.valor ?? 0;
public int _QtdBicosLigados => (int)(ValoresLeituras?.FirstOrDefault(x => x.posicao == CanMessagePosicaoDados.Dados2 && x.funcao == FuncoesPinout.QtdPulsos)?.atual?.valor ?? 0);
public double _PotenciaFeedForwared => ValoresLeituras?.FirstOrDefault(x => x.posicao == CanMessagePosicaoDados.Dados2 && x.funcao == FuncoesPinout.PotenciaSP)?.atual?.valor ?? 0;
public double _PotenciaFinal => ValoresLeituras?.FirstOrDefault(x => x.posicao == CanMessagePosicaoDados.Dados2 && x.funcao == FuncoesPinout.Potencia)?.atual?.valor ?? 0;
public double _PressaoSensor => ValoresLeituras?.FirstOrDefault(x => x.posicao == CanMessagePosicaoDados.Dados2 && x.funcao == FuncoesPinout.Pressao)?.atual?.valor ?? 0;
public double _PressaoSPControle => ValoresLeituras?.FirstOrDefault(x => x.posicao == CanMessagePosicaoDados.Dados2 && x.funcao == FuncoesPinout.PressaoSP)?.atual?.valor ?? 0;
public bool _PressaoSPForaDoMapa => ValoresLeituras?.FirstOrDefault(x => x.posicao == CanMessagePosicaoDados.Dados2 && x.funcao == FuncoesPinout.PressaoSPExtra)?.atual?.valor ?? false;
public int Atuacoes { get; set; }
@ -2623,10 +2643,10 @@ namespace AgroBase.Models.Modules
{
public ModoControleBomba Modo { get; set; } = ModoControleBomba.OnOff;
public double PotenciaMinPID { get; set; } = 30.0;
public double PotenciaMinPID { get; set; } = 40.0;
public double Kp { get; set; } = 6.0;
public double Ki { get; set; } = 0.2;
public double Kp { get; set; } = 0.08;
public double Ki { get; set; } = 0.008;
public double Kd { get; set; } = 0.0;
}
@ -3060,20 +3080,66 @@ namespace AgroBase.Models.Modules
{
case CanMessagePosicaoDados.Status:
{
bool Iniciado = data[2] == 1;
bool MalhaFechada = data[3] == 1;
AtualizarDados(ID_Num, posicao, componente, new List<dynamic>() { Iniciado });
bool iniciado = data.Length > 2 && data[2] == 1;
bool malhaFechada = data.Length > 3 && data[3] == 1;
AtualizarDados(
ID_Num,
posicao,
componente,
new List<dynamic>() {
iniciado,
malhaFechada,
}
);
break;
}
case CanMessagePosicaoDados.Dados1:
{
Estado estado = (Estado)data[2];
int potenciaSp = data[3];
int percentualPotencia = data[4];
int pressaoSp = data[5];
int pressaoAtual = data[6];
ModoControleBomba modo = (ModoControleBomba)data[7];
AtualizarDados(ID_Num, posicao, componente, new List<dynamic>() { estado, potenciaSp, percentualPotencia, pressaoSp, pressaoAtual, modo });
Estado estado = data.Length > 2 ? (Estado)data[2] : Estado.Desligado;
int potenciaSp = data.Length > 3 ? data[3] : 0;
int percentualPotencia = data.Length > 4 ? data[4] : 0;
int pressaoSp = data.Length > 5 ? data[5] : 0;
int pressaoAtual = data.Length > 6 ? data[6] : 0;
ModoControleBomba modo = data.Length > 7 ? (ModoControleBomba)data[7] : ModoControleBomba.OnOff;
AtualizarDados(
ID_Num,
posicao,
componente,
new List<dynamic>()
{
estado,
potenciaSp,
percentualPotencia,
pressaoSp,
pressaoAtual,
modo
}
);
break;
}
case CanMessagePosicaoDados.Dados2:
{
int qtdBicosLigados = data.Length > 2 ? data[2] : 0;
int potenciaFeedForward = data.Length > 3 ? data[3] : 0;
int potenciaFinal = data.Length > 4 ? data[4] : 0;
int pressaoSensor = data.Length > 5 ? data[5] : 0;
int pressaoSpControle = data.Length > 6 ? data[6] : 0;
bool pressaoSpForaDoMapa = data.Length > 7 && data[7] == 1;
AtualizarDados(
ID_Num,
posicao,
componente,
new List<dynamic>()
{
qtdBicosLigados,
potenciaFeedForward,
potenciaFinal,
pressaoSensor,
pressaoSpControle,
pressaoSpForaDoMapa
}
);
break;
}
}

View File

@ -440,6 +440,8 @@ namespace AgroBase.Models.Modules
PotenciaSP,
ModoControleBomba,
Botao,
MalhaFechada,
PressaoSPExtra,
}
public static class PinoutUtils

View File

@ -3022,41 +3022,7 @@ namespace AgroBase.Models
);
}
AtuSensoriamentoLogModel logAtu = new AtuSensoriamentoLogModel()
{
Momento = Agora,
Inicializado = Variaveis.OperacaoEmAndamento.DispAtu.Dados.ConexaoAtiva,
QualidadeWifi = Variaveis.OperacaoEmAndamento.DispAtu.Dados.DadosLeitura.QualidadeWifi,
LatenciaLoop = Variaveis.OperacaoEmAndamento.DispAtu.Dados.DadosLeitura.LatenciaLoop,
MassaReservatorio = Variaveis.OperacaoEmAndamento.DispAtu.Dados.ContadorCarga.MassaAtual_Kg,
PercentualReservatorio = Variaveis.OperacaoEmAndamento.DispAtu.Dados.ContadorCarga.PercentualAtual,
VolumeReservatorio = Variaveis.OperacaoEmAndamento.DispAtu.Dados.ContadorCarga.VolumeAtual_L,
PercentualHerbicidaConsumido = Variaveis.OperacaoEmAndamento.DispAtu.Dados.ContadorCarga.PercentualConsumidoTotal,
PercentualHerbicidaConsumidoOperacao = Variaveis.OperacaoEmAndamento.DispAtu.Dados.ContadorCarga.PercentualConsumidoOperacao,
HerbicidaPorAtuacao = Variaveis.OperacaoEmAndamento.DispAtu.Dados.ContadorCarga.HerbicidaPorAtuacao_L,
PressaoLinha_SP = Variaveis.OperacaoEmAndamento.Parametros.Controle.AtuPressaoLinha,
PressaoLinha = Variaveis.OperacaoEmAndamento.DispAtu.Dados.PressaoLinha,
PotenciaBomba = Variaveis.OperacaoEmAndamento.DispAtu.Dados.BombaPressurizadora?._Potencia ?? 0,
BombaLigada = Variaveis.OperacaoEmAndamento.DispAtu.Dados.BombaPressurizadora?.ComandoAtuar ?? false,
VazaoFluxoMLpSInstantanea = Variaveis.OperacaoEmAndamento.DispAtu.Dados.VazaoFluxoMLpSInstantaneaCorrigida,
VazaoFluxoMLpSMedia = Variaveis.OperacaoEmAndamento.DispAtu.Dados.VazaoMediaMLs,
VolumeVazaoML = Variaveis.OperacaoEmAndamento.DispAtu.Dados.VolumeVazadoML,
QuantidadeBicos = Variaveis.OperacaoEmAndamento.Parametros.QtdBicos ?? VariaveisEquipamento.QuantidadeBicosPulverizadores,
TempoPulverizadorAtuado = Variaveis.OperacaoEmAndamento.DispAtu.Dados.TempoAtuado,
Bicos = Variaveis.OperacaoEmAndamento.DispAtu.Dados.BicosPulverizadores.Select(Bico => new AtuBicoSensoriamentoLogModel()
{
ID = Bico.ID,
Inicializado = Bico.Inicializado,
Comandar = Bico.Comandar,
Atuado = Bico.ComandoAtuar,
MediaNivelFluxo = Bico.VazaoMediaMLs,
Posicao = Bico.Posicao,
StatusBico = Bico._EstadoLeitura == Estado.Ligado,
Atuacoes = Bico.Atuacoes,
TempoAtuado = Bico.TempoAtuado,
}).ToList(),
UltimoComandoRespondido = Variaveis.OperacaoEmAndamento.DispAtu.Dados.DadosLeitura.Momento,
};
var logAtu = AtuSensoriamentoLogModel.MontarLogAtuador(Agora);
SalvarLogLine(T_Code.Atu.ToString(), logAtu);
var senLeitura = Variaveis.OperacaoEmAndamento.DispSen.Dados;
@ -3640,7 +3606,7 @@ namespace AgroBase.Models
}
}
public ModuloIMUModel IMU { get; set; }
public OperacaoSensoriamentoLogAtuModel Atuador { get; set; }
public AtuSensoriamentoLogModel Atuador { get; set; }
public OperacaoSensoriamentoLogMovModel Movimentacao { get; set; }
public OperacaoSensoriamentoLogDirModel Direcional { get; set; }
public OperacaoSensoriamentoLogBateriaModel Bateria { get; set; }
@ -3725,56 +3691,8 @@ namespace AgroBase.Models
bool imu_iniciado = sIMU?.timestamp > 0 && HealthWorkerService.ModulosSaude.FirstOrDefault(x => x.modulo == T_Code.Imu)?.status != StatusModulo.Desconectado;
var dadosIMU = sIMU != null && imu_iniciado ? sIMU.Clone() : new ModuloIMUModel();
var bombaLinha = _DispAtu?.Dados?.BombaPressurizadora;
var dadosAtuador = _DispAtu != null ? new OperacaoSensoriamentoLogAtuModel()
{
QtdCamerasSolo = CameraWorkerService.CamerasSolo.Count,
CapacidadeReservatorio = VariaveisEquipamento.CapacidadeReservatorio,
HerbicidaConsumido = _Reservatorio.VolumeConsumidoTotal_L,
HerbicidaConsumidoOperacao = _Reservatorio.VolumeConsumidoOperacao_L,
PercentualHerbicidaConsumido = _Reservatorio.PercentualConsumidoTotal,
PercentualHerbicidaConsumidoOperacao = _Reservatorio.PercentualConsumidoOperacao,
PercentualErvasTerreno = _DispAtu.Dados.PercentualErvasTerreno,
HerbicidaPorErva = _Reservatorio.HerbicidaPorAtuacao_L,
ErvasNoRadar = WeedWorkerService.DadosLeitura?.Analise?.ervas_no_radar ?? false,
PercentualErvasNoRadar = WeedWorkerService.DadosLeitura?.Analise?.percentual_ervas_no_radar ?? 0,
PercentualReservatorio = _Reservatorio.PercentualAtual,
VolumeReservatorio = _Reservatorio.VolumeAtual_L,
MassaReservatorio = _Reservatorio.MassaAtual_Kg,
PressaoLinha = _DispAtu.Dados.PressaoLinha,
PressaoLinhaCalc = _DispAtu.Dados.PressaoLinhaCalc,
VazaoInstantanea = _DispAtu.Dados.VazaoFluxoMLpSInstantaneaCorrigida,
VazaoInstantaneaCalc = _DispAtu.Dados.VazaoFluxoMLpSInstantaneaCalc,
VazaoMedia = _DispAtu.Dados.VazaoMediaMLs,
TempoBombaAtuada = _DispAtu.Dados.TempoAtuado,
ComandoBomba = bombaLinha?.ComandoAtuar ?? false,
LeituraComandoBomba = bombaLinha?._EstadoLeitura == Estado.Ligado,
LeituraPotenciaBomba = FuncoesMatematicas.Clamp(bombaLinha?._Potencia ?? 0, 0, 100),
VolumeVazaoMl = _DispAtu.Dados.VolumeVazadoML,
BombaCavitada = _DispAtu.Dados.Conectado && _DispAtu.Dados.PressaoLinha < pControle?.AtuPressaoLinha && _DispAtu.Dados.PressaoLinha < VariaveisEquipamento.PressaoMinimaCavitacao && bombaLinha?._EstadoLeitura == Estado.Ligado && bombaLinha?._Potencia > 20,
Iniciados = _DispAtu.Dados.Sensores.Select(s => new { s.ID, s.Inicializado }).Union(_DispAtu.Dados.BicosPulverizadores.Select(b => new { b.ID, b.Inicializado })).Union(_DispAtu.Dados.BombasPressurizadoras.Select(b => new { b.ID, b.Inicializado })).ToDictionary(x => x.ID, x => x.Inicializado),
AnguloBarraEsquerda = _DispAtu.Dados.AnguloBarraEsquerda,
AnguloBarraDireita = _DispAtu.Dados.AnguloBarraDireita,
UltimoComandoRespondido = _DispAtu.Dados.DadosLeitura?.UltimoComandoRespondido ?? DateTime.MinValue,
LPorMetro = _Reservatorio.LPorMetro,
LPorMinuto = _Reservatorio.LPorMinuto,
TempoEstimadoRestanteMinutos = _Reservatorio.TempoEstimadoMinutosPulverizando,
DistanciaEstimadaRestanteMetros = _Reservatorio.DistanciaEstimadaRestantePulverizando_m,
Bicos = Variaveis.OperacaoEmAndamento.DispAtu.Dados.BicosPulverizadores.Select(Bico => new AtuBicoSensoriamentoLogModel()
{
ID = Bico.ID,
Inicializado = Bico.Inicializado,
Comandar = Bico.Comandar,
Atuado = Bico.ComandoAtuar,
MediaNivelFluxo = Bico.VazaoMediaMLs,
Posicao = Bico.Posicao,
StatusBico = Bico._EstadoLeitura == Estado.Ligado,
Atuacoes = Bico.Atuacoes,
TempoAtuado = Bico.TempoAtuado,
AnguloAbertura = Bico.AnguloAbertura,
AnguloControle = Bico.AnguloControle,
}).ToList(),
} : new OperacaoSensoriamentoLogAtuModel();
var logAtu = AtuSensoriamentoLogModel.MontarLogAtuador(DateTime.Now);
var dadosAtuador = logAtu.Clone();
var dadosMovimentacao = _DispMvd != null ? new OperacaoSensoriamentoLogMovModel()
{
@ -4040,83 +3958,6 @@ namespace AgroBase.Models
}
}
public class OperacaoSensoriamentoLogAtuModel
{
public int QtdCamerasSolo { get; set; }
public double CapacidadeReservatorio { get; set; }
public double HerbicidaConsumido { get; set; }
public double HerbicidaConsumidoOperacao { get; set; }
public double PercentualHerbicidaConsumido { get; set; }
public double PercentualHerbicidaConsumidoOperacao { get; set; }
public double PercentualErvasTerreno { get; set; }
public double HerbicidaPorErva { get; set; }
public bool ErvasNoRadar { get; set; }
public double PercentualErvasNoRadar { get; set; }
public double PercentualReservatorio { get; set; }
public double MassaReservatorio { get; set; }
public double VolumeReservatorio { get; set; }
public double PressaoLinha { get; set; }
public double PressaoLinhaCalc { get; set; }
public double VazaoInstantanea { get; set; }
public double VazaoInstantaneaCalc { get; set; }
public double VazaoMedia { get; set; }
public double TempoBombaAtuada { get; set; }
public bool ComandoBomba { get; set; }
public bool LeituraComandoBomba { get; set; }
public double LeituraPotenciaBomba { get; set; }
public double VolumeVazaoMl { get; set; }
public double AnguloBarraEsquerda { get; set; }
public double AnguloBarraDireita { get; set; }
public double LPorMetro { get; set; }
public double LPorMinuto { get; set; }
public double TempoEstimadoRestanteMinutos { get; set; }
public double DistanciaEstimadaRestanteMetros { get; set; }
public bool BombaCavitada { get; set; }
public Dictionary<string, bool> Iniciados { get; set; }
public List<AtuBicoSensoriamentoLogModel> Bicos { get; set; }
public DateTime UltimoComandoRespondido { get; set; }
public OperacaoSensoriamentoLogAtuModel Clone()
{
return new OperacaoSensoriamentoLogAtuModel()
{
QtdCamerasSolo = QtdCamerasSolo,
CapacidadeReservatorio = CapacidadeReservatorio,
ErvasNoRadar = ErvasNoRadar,
PercentualErvasNoRadar = PercentualErvasNoRadar,
HerbicidaConsumido = HerbicidaConsumido,
HerbicidaConsumidoOperacao = HerbicidaConsumidoOperacao,
PercentualHerbicidaConsumido = PercentualHerbicidaConsumido,
PercentualHerbicidaConsumidoOperacao = PercentualHerbicidaConsumidoOperacao,
HerbicidaPorErva = HerbicidaPorErva,
PercentualErvasTerreno = PercentualErvasTerreno,
PercentualReservatorio = PercentualReservatorio,
VolumeReservatorio = VolumeReservatorio,
MassaReservatorio = MassaReservatorio,
PressaoLinha = PressaoLinha,
PressaoLinhaCalc = PressaoLinhaCalc,
VazaoInstantanea = VazaoInstantanea,
VazaoInstantaneaCalc = VazaoInstantaneaCalc,
VazaoMedia = VazaoMedia,
TempoBombaAtuada = TempoBombaAtuada,
ComandoBomba = ComandoBomba,
LeituraComandoBomba = LeituraComandoBomba,
LeituraPotenciaBomba = LeituraPotenciaBomba,
VolumeVazaoMl = VolumeVazaoMl,
AnguloBarraEsquerda = AnguloBarraEsquerda,
AnguloBarraDireita = AnguloBarraDireita,
BombaCavitada = BombaCavitada,
Iniciados = new Dictionary<string, bool>(Iniciados ?? new Dictionary<string, bool>()),
UltimoComandoRespondido = UltimoComandoRespondido,
LPorMetro = LPorMetro,
LPorMinuto = LPorMinuto,
TempoEstimadoRestanteMinutos = TempoEstimadoRestanteMinutos,
DistanciaEstimadaRestanteMetros = DistanciaEstimadaRestanteMetros,
Bicos = new List<AtuBicoSensoriamentoLogModel>(Bicos ?? new List<AtuBicoSensoriamentoLogModel>())
};
}
}
public class OperacaoSensoriamentoLogMovModel
{
public double VelocidadeMedia { get; set; }
@ -4366,41 +4207,315 @@ namespace AgroBase.Models
public class AtuSensoriamentoLogModel
{
public DateTime Momento { get; set; }
// Conexão / saúde geral
public bool Inicializado { get; set; }
public bool ConexaoAtiva { get; set; }
public int QualidadeWifi { get; set; }
public int LatenciaLoop { get; set; }
public DateTime UltimoComandoRespondido { get; set; }
// Contexto da operação
public int QtdCamerasSolo { get; set; }
public int QuantidadeBicos { get; set; }
public double CapacidadeReservatorio { get; set; }
// Reservatório / consumo
public double MassaReservatorio { get; set; }
public double PressaoLinha_SP { get; set; }
public double PressaoLinha { get; set; }
public double VolumeReservatorio { get; set; }
public double PercentualReservatorio { get; set; }
public double HerbicidaConsumido { get; set; }
public double HerbicidaConsumidoOperacao { get; set; }
public double PercentualHerbicidaConsumido { get; set; }
public double PercentualHerbicidaConsumidoOperacao { get; set; }
public double HerbicidaPorAtuacao { get; set; }
public double PotenciaBomba { get; set; }
public bool BombaLigada { get; set; }
public double HerbicidaPorErva { get; set; }
// Ervas / contexto visual
public bool ErvasNoRadar { get; set; }
public double PercentualErvasNoRadar { get; set; }
public double PercentualErvasTerreno { get; set; }
// Pressão / vazão
public double PressaoLinha_SP { get; set; }
public double PressaoLinha { get; set; }
public double PressaoLinhaCalc { get; set; }
public double PressaoAtualBomba { get; set; }
public double VazaoFluxoMLpSInstantanea { get; set; }
public double VazaoFluxoMLpSInstantaneaCorrigida { get; set; }
public double VazaoFluxoMLpSMedia { get; set; }
public double VolumeVazaoML { get; set; }
public int QuantidadeBicos { get; set; }
// Bomba linha
public bool BombaLigada { get; set; }
public bool ComandoBomba { get; set; }
public bool LeituraComandoBomba { get; set; }
// Mantém nomes úteis para tela/log antigo
public double PotenciaBomba { get; set; }
public double LeituraPotenciaBomba { get; set; }
// Novos dados da bomba via Dados2
public int QtdBicosLigados { get; set; }
public double PotenciaFeedForward { get; set; }
public double PotenciaFinal { get; set; }
public double PressaoSensor { get; set; }
public double PressaoSPControle { get; set; }
public bool PressaoSPForaDoMapa { get; set; }
public double TempoPulverizadorAtuado { get; set; }
public List<AtuBicoSensoriamentoLogModel> Bicos { get; set; }
public DateTime UltimoComandoRespondido { get; set; }
public double TempoBombaAtuada { get; set; }
public bool BombaCavitada { get; set; }
// Agitador
public ModoAgitadorCalda ModoControleAgitador { get; set; }
public double PotenciaAgitador { get; set; }
// Barra
public double AnguloBarraEsquerda { get; set; }
public double AnguloBarraDireita { get; set; }
// Autonomia / estimativas
public double LPorMetro { get; set; }
public double LPorMinuto { get; set; }
public double TempoEstimadoRestanteMinutos { get; set; }
public double DistanciaEstimadaRestanteMetros { get; set; }
// Componentes
public Dictionary<string, bool> Iniciados { get; set; } = new Dictionary<string, bool>();
public List<AtuBicoSensoriamentoLogModel> Bicos { get; set; } = new List<AtuBicoSensoriamentoLogModel>();
public AtuSensoriamentoLogModel Clone()
{
return new AtuSensoriamentoLogModel()
{
Momento = Momento,
Inicializado = Inicializado,
ConexaoAtiva = ConexaoAtiva,
QualidadeWifi = QualidadeWifi,
LatenciaLoop = LatenciaLoop,
UltimoComandoRespondido = UltimoComandoRespondido,
QtdCamerasSolo = QtdCamerasSolo,
QuantidadeBicos = QuantidadeBicos,
CapacidadeReservatorio = CapacidadeReservatorio,
MassaReservatorio = MassaReservatorio,
VolumeReservatorio = VolumeReservatorio,
PercentualReservatorio = PercentualReservatorio,
HerbicidaConsumido = HerbicidaConsumido,
HerbicidaConsumidoOperacao = HerbicidaConsumidoOperacao,
PercentualHerbicidaConsumido = PercentualHerbicidaConsumido,
PercentualHerbicidaConsumidoOperacao = PercentualHerbicidaConsumidoOperacao,
HerbicidaPorAtuacao = HerbicidaPorAtuacao,
HerbicidaPorErva = HerbicidaPorErva,
ErvasNoRadar = ErvasNoRadar,
PercentualErvasNoRadar = PercentualErvasNoRadar,
PercentualErvasTerreno = PercentualErvasTerreno,
PressaoLinha_SP = PressaoLinha_SP,
PressaoLinha = PressaoLinha,
PressaoLinhaCalc = PressaoLinhaCalc,
PressaoAtualBomba = PressaoAtualBomba,
VazaoFluxoMLpSInstantanea = VazaoFluxoMLpSInstantanea,
VazaoFluxoMLpSInstantaneaCorrigida = VazaoFluxoMLpSInstantaneaCorrigida,
VazaoFluxoMLpSMedia = VazaoFluxoMLpSMedia,
VolumeVazaoML = VolumeVazaoML,
BombaLigada = BombaLigada,
ComandoBomba = ComandoBomba,
LeituraComandoBomba = LeituraComandoBomba,
PotenciaBomba = PotenciaBomba,
LeituraPotenciaBomba = LeituraPotenciaBomba,
QtdBicosLigados = QtdBicosLigados,
PotenciaFeedForward = PotenciaFeedForward,
PotenciaFinal = PotenciaFinal,
PressaoSensor = PressaoSensor,
PressaoSPControle = PressaoSPControle,
PressaoSPForaDoMapa = PressaoSPForaDoMapa,
TempoPulverizadorAtuado = TempoPulverizadorAtuado,
TempoBombaAtuada = TempoBombaAtuada,
BombaCavitada = BombaCavitada,
ModoControleAgitador = ModoControleAgitador,
PotenciaAgitador = PotenciaAgitador,
AnguloBarraEsquerda = AnguloBarraEsquerda,
AnguloBarraDireita = AnguloBarraDireita,
LPorMetro = LPorMetro,
LPorMinuto = LPorMinuto,
TempoEstimadoRestanteMinutos = TempoEstimadoRestanteMinutos,
DistanciaEstimadaRestanteMetros = DistanciaEstimadaRestanteMetros,
Iniciados = new Dictionary<string, bool>(Iniciados ?? new Dictionary<string, bool>()),
Bicos = Bicos?.Select(b => b.Clone()).ToList() ?? new List<AtuBicoSensoriamentoLogModel>()
};
}
public static AtuSensoriamentoLogModel MontarLogAtuador(DateTime agora)
{
var op = Variaveis.OperacaoEmAndamento;
var dadosAtu = op?.DispAtu?.Dados;
var pControle = op?.Parametros?.Controle;
var bombaLinha = dadosAtu?.BombaPressurizadora;
var reservatorio = dadosAtu?.ContadorCarga;
if (dadosAtu == null)
{
return new AtuSensoriamentoLogModel()
{
Momento = agora,
Inicializado = false,
ConexaoAtiva = false
};
}
return new AtuSensoriamentoLogModel()
{
Momento = agora,
Inicializado = dadosAtu.ConexaoAtiva,
ConexaoAtiva = dadosAtu.ConexaoAtiva,
QualidadeWifi = dadosAtu.DadosLeitura?.QualidadeWifi ?? 0,
LatenciaLoop = dadosAtu.DadosLeitura?.LatenciaLoop ?? 0,
UltimoComandoRespondido = dadosAtu.DadosLeitura?.UltimoComandoRespondido ?? dadosAtu.DadosLeitura?.Momento ?? DateTime.MinValue,
QtdCamerasSolo = CameraWorkerService.CamerasSolo.Count,
QuantidadeBicos = op?.Parametros?.QtdBicos ?? VariaveisEquipamento.QuantidadeBicosPulverizadores,
CapacidadeReservatorio = VariaveisEquipamento.CapacidadeReservatorio,
MassaReservatorio = dadosAtu.ContadorCarga?.MassaAtual_Kg ?? reservatorio?.MassaAtual_Kg ?? 0,
VolumeReservatorio = dadosAtu.ContadorCarga?.VolumeAtual_L ?? reservatorio?.VolumeAtual_L ?? 0,
PercentualReservatorio = dadosAtu.ContadorCarga?.PercentualAtual ?? reservatorio?.PercentualAtual ?? 0,
HerbicidaConsumido = reservatorio?.VolumeConsumidoTotal_L ?? 0,
HerbicidaConsumidoOperacao = reservatorio?.VolumeConsumidoOperacao_L ?? 0,
PercentualHerbicidaConsumido = dadosAtu.ContadorCarga?.PercentualConsumidoTotal ?? reservatorio?.PercentualConsumidoTotal ?? 0,
PercentualHerbicidaConsumidoOperacao = dadosAtu.ContadorCarga?.PercentualConsumidoOperacao ?? reservatorio?.PercentualConsumidoOperacao ?? 0,
HerbicidaPorAtuacao = dadosAtu.ContadorCarga?.HerbicidaPorAtuacao_L ?? 0,
HerbicidaPorErva = reservatorio?.HerbicidaPorAtuacao_L ?? dadosAtu.ContadorCarga?.HerbicidaPorAtuacao_L ?? 0,
ErvasNoRadar = WeedWorkerService.DadosLeitura?.Analise?.ervas_no_radar ?? false,
PercentualErvasNoRadar = WeedWorkerService.DadosLeitura?.Analise?.percentual_ervas_no_radar ?? 0,
PercentualErvasTerreno = dadosAtu.PercentualErvasTerreno,
PressaoLinha_SP = pControle?.AtuPressaoLinha ?? 0,
PressaoLinha = dadosAtu.PressaoLinha,
PressaoLinhaCalc = dadosAtu.PressaoLinhaCalc,
PressaoAtualBomba = dadosAtu.BombaPressurizadora?._PressaoAtual ?? 0,
VazaoFluxoMLpSInstantanea = dadosAtu.VazaoFluxoMLpSInstantanea,
VazaoFluxoMLpSInstantaneaCorrigida = dadosAtu.VazaoFluxoMLpSInstantaneaCorrigida,
VazaoFluxoMLpSMedia = dadosAtu.VazaoMediaMLs,
VolumeVazaoML = dadosAtu.VolumeVazadoML,
BombaLigada = bombaLinha?.ComandoAtuar ?? false,
ComandoBomba = bombaLinha?.ComandoAtuar ?? false,
LeituraComandoBomba = bombaLinha?._EstadoLeitura == Estado.Ligado,
// Eu manteria os dois, mas tentaria fazer ambos apontarem para a leitura real final.
PotenciaBomba = FuncoesMatematicas.Clamp(bombaLinha?._PotenciaFinal ?? bombaLinha?._Potencia ?? 0, 0, 100),
LeituraPotenciaBomba = FuncoesMatematicas.Clamp(bombaLinha?._PotenciaFinal ?? bombaLinha?._Potencia ?? 0, 0, 100),
QtdBicosLigados = bombaLinha?._QtdBicosLigados ?? 0,
PotenciaFeedForward = bombaLinha?._PotenciaFeedForwared ?? 0,
PotenciaFinal = bombaLinha?._PotenciaFinal ?? 0,
PressaoSensor = bombaLinha?._PressaoSensor ?? 0,
PressaoSPControle = bombaLinha?._PressaoSPControle ?? 0,
PressaoSPForaDoMapa = bombaLinha?._PressaoSPForaDoMapa ?? false,
TempoPulverizadorAtuado = dadosAtu.TempoAtuado,
TempoBombaAtuada = dadosAtu.TempoAtuado,
BombaCavitada =
dadosAtu.Conectado &&
dadosAtu.PressaoLinha < (pControle?.AtuPressaoLinha ?? 0) &&
dadosAtu.PressaoLinha < VariaveisEquipamento.PressaoMinimaCavitacao &&
bombaLinha?._EstadoLeitura == Estado.Ligado &&
(bombaLinha?._PotenciaFinal ?? bombaLinha?._Potencia ?? 0) > 20,
ModoControleAgitador = pControle?.AtuAgitadorModo ?? ModoAgitadorCalda.SemAgitacao,
PotenciaAgitador = dadosAtu.AgitadorDeCalda?.PotenciaMediaAtiva ?? 0,
AnguloBarraEsquerda = dadosAtu.AnguloBarraEsquerda,
AnguloBarraDireita = dadosAtu.AnguloBarraDireita,
LPorMetro = reservatorio?.LPorMetro ?? 0,
LPorMinuto = reservatorio?.LPorMinuto ?? 0,
TempoEstimadoRestanteMinutos = reservatorio?.TempoEstimadoMinutosPulverizando ?? 0,
DistanciaEstimadaRestanteMetros = reservatorio?.DistanciaEstimadaRestantePulverizando_m ?? 0,
Iniciados =
dadosAtu.Sensores.Select(s => new { s.ID, s.Inicializado })
.Union(dadosAtu.BicosPulverizadores.Select(b => new { b.ID, b.Inicializado }))
.Union(dadosAtu.BombasPressurizadoras.Select(b => new { b.ID, b.Inicializado }))
.ToDictionary(x => x.ID, x => x.Inicializado),
Bicos = dadosAtu.BicosPulverizadores.Select(bico => new AtuBicoSensoriamentoLogModel()
{
ID = bico.ID,
Inicializado = bico.Inicializado,
Comandar = bico.Comandar,
Atuado = bico.ComandoAtuar,
MediaNivelFluxo = bico.VazaoMediaMLs,
Posicao = bico.Posicao,
StatusBico = bico._EstadoLeitura == Estado.Ligado,
Atuacoes = bico.Atuacoes,
TempoAtuado = bico.TempoAtuado,
AnguloAbertura = bico.AnguloAbertura,
AnguloControle = bico.AnguloControle
}).ToList()
};
}
}
public class AtuBicoSensoriamentoLogModel
{
public string ID { get; set; }
public int Posicao { get; set; }
public bool Atuado { get; set; }
public bool Comandar { get; set; }
public bool Inicializado { get; set; }
public bool StatusBico { get; set; }
public bool Comandar { get; set; }
public bool Atuado { get; set; }
public double MediaNivelFluxo { get; set; }
public int Posicao { get; set; }
public bool StatusBico { get; set; }
public int Atuacoes { get; set; }
public double TempoAtuado { get; set; }
public double AnguloAbertura { get; set; }
public double AnguloControle { get; set; }
public AtuBicoSensoriamentoLogModel Clone()
{
return new AtuBicoSensoriamentoLogModel()
{
ID = ID,
Inicializado = Inicializado,
Comandar = Comandar,
Atuado = Atuado,
MediaNivelFluxo = MediaNivelFluxo,
Posicao = Posicao,
StatusBico = StatusBico,
Atuacoes = Atuacoes,
TempoAtuado = TempoAtuado,
AnguloAbertura = AnguloAbertura,
AnguloControle = AnguloControle
};
}
}
public class CamSoloSensoriamentoLogModel

View File

@ -141,7 +141,8 @@ BombaPressurizadora_v2 sBMB_Linha(
Sentido::Horario,
&sPRS_Linha,
BicosPulverizadores,
QUANTIDADE_BICOS
QUANTIDADE_BICOS,
&sFLX_Linha
);
BombaPressurizadora_v2 sBMB_Agitador(
"BMBAGT",
@ -531,7 +532,7 @@ void enviarDadosSensores(uint8_t id_num, CanMessagePosicaoDados posicao) {
ComponenteCAN::ProcessarComponenteCAN(sBIC_06, {CanMessagePosicaoDados::Dados1}, todosIDs, id_num, enviarStatus, todosDados, posicao, EnviarDadosCAN);
ComponenteCAN::ProcessarComponenteCAN(sBIC_07, {CanMessagePosicaoDados::Dados1}, todosIDs, id_num, enviarStatus, todosDados, posicao, EnviarDadosCAN);
ComponenteCAN::ProcessarComponenteCAN(sBMB_Linha, {CanMessagePosicaoDados::Dados1}, todosIDs, id_num, enviarStatus, todosDados, posicao, EnviarDadosCAN);
ComponenteCAN::ProcessarComponenteCAN(sBMB_Linha, {CanMessagePosicaoDados::Dados1,CanMessagePosicaoDados::Dados2}, todosIDs, id_num, enviarStatus, todosDados, posicao, EnviarDadosCAN);
ComponenteCAN::ProcessarComponenteCAN(sBMB_Agitador, {CanMessagePosicaoDados::Dados1}, todosIDs, id_num, enviarStatus, todosDados, posicao, EnviarDadosCAN);

File diff suppressed because it is too large Load Diff

View File

@ -35,6 +35,10 @@ class SensorPressao_v2 : public ComponenteCAN {
double _Vmax = 4.5;
double _Pmax = 174.045;
double GanhoCalibracaoPressao = 1.1361506;
double OffsetCalibracaoPressao = -14.887795;
int leitura = 0;
double Tensao = 0.0;
double Pressao = 0.0;
@ -90,12 +94,16 @@ class SensorPressao_v2 : public ComponenteCAN {
double leituraFiltrada = filtro.updateEstimate(leitura);
Tensao = fmap(leituraFiltrada, 0.0, 4095.0, 0.0, 3300.0) / 1000.0;
Pressao = fmap(Tensao, _Vmin, _Vmax, 0.0, _Pmax);
double pressaoBruta = fmap(Tensao, _Vmin, _Vmax, 0.0, _Pmax);
Pressao = (pressaoBruta * GanhoCalibracaoPressao) + OffsetCalibracaoPressao;
if (Pressao < 0) Pressao = 0;
if (Pressao > _Pmax) Pressao = _Pmax;
}
std::vector<uint8_t> MontarMensagemCAN(CanMessagePosicaoDados posicao) {
std::vector<uint8_t> data;
data.push_back(static_cast<uint8_t>(posicao));