ajustado controle de pressão da bomba pid
This commit is contained in:
parent
915f14679d
commit
f3cca4c54f
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
@ -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");
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -440,6 +440,8 @@ namespace AgroBase.Models.Modules
|
|||
PotenciaSP,
|
||||
ModoControleBomba,
|
||||
Botao,
|
||||
MalhaFechada,
|
||||
PressaoSPExtra,
|
||||
}
|
||||
|
||||
public static class PinoutUtils
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
|
@ -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));
|
||||
|
|
|
|||
Loading…
Reference in New Issue