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.chbSonarAtivado = new System.Windows.Forms.CheckBox();
|
||||||
this.lblPressao = new System.Windows.Forms.Label();
|
this.lblPressao = new System.Windows.Forms.Label();
|
||||||
this.chbImuAtivado = new System.Windows.Forms.CheckBox();
|
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();
|
((System.ComponentModel.ISupportInitialize)(this.chartGraficos)).BeginInit();
|
||||||
this.tabControl1.SuspendLayout();
|
this.tabControl1.SuspendLayout();
|
||||||
this.tabMapa.SuspendLayout();
|
this.tabMapa.SuspendLayout();
|
||||||
|
|
@ -500,6 +502,8 @@
|
||||||
//
|
//
|
||||||
// groupBox2
|
// groupBox2
|
||||||
//
|
//
|
||||||
|
this.groupBox2.Controls.Add(this.lblVazaoInstantanea);
|
||||||
|
this.groupBox2.Controls.Add(this.lblPressaoBomba);
|
||||||
this.groupBox2.Controls.Add(this.label7);
|
this.groupBox2.Controls.Add(this.label7);
|
||||||
this.groupBox2.Controls.Add(this.nudPotenciaBombaMax);
|
this.groupBox2.Controls.Add(this.nudPotenciaBombaMax);
|
||||||
this.groupBox2.Controls.Add(this.label6);
|
this.groupBox2.Controls.Add(this.label6);
|
||||||
|
|
@ -949,6 +953,30 @@
|
||||||
this.chbImuAtivado.UseVisualStyleBackColor = true;
|
this.chbImuAtivado.UseVisualStyleBackColor = true;
|
||||||
this.chbImuAtivado.CheckedChanged += new System.EventHandler(this.chbImuAtivado_CheckedChanged);
|
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
|
// frmOperacaoManual
|
||||||
//
|
//
|
||||||
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
|
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
|
||||||
|
|
@ -1088,5 +1116,7 @@
|
||||||
private System.Windows.Forms.Label label7;
|
private System.Windows.Forms.Label label7;
|
||||||
private System.Windows.Forms.NumericUpDown nudPotenciaBombaMax;
|
private System.Windows.Forms.NumericUpDown nudPotenciaBombaMax;
|
||||||
private System.Windows.Forms.CheckBox chbImuAtivado;
|
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";
|
lblRPM.Text = _Sensoriamento.Movimentacao.RPMMedio.ToString("0") + " rpm";
|
||||||
lblVelocidade.Text = (_Sensoriamento.Movimentacao.VelocidadeMedia * 3.6).ToString("0.00");
|
lblVelocidade.Text = (_Sensoriamento.Movimentacao.VelocidadeMedia * 3.6).ToString("0.00");
|
||||||
lblPressao.Text = $"{(_Sensoriamento.Atuador.PressaoLinha):F0} psi";
|
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;
|
bool atuadorAtivado = Variaveis.OperacaoEmAndamento.DispAtu.Dados.Conectado;
|
||||||
chbPulverizador.Enabled = atuadorAtivado;
|
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[29].Cells[1].Value = (_Atuador?.PressaoLinha ?? 0).ToString("0.00");
|
||||||
gridDados.Rows[30].Cells[1].Value = (_Atuador?.LeituraPotenciaBomba ?? 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[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[32].Cells[1].Value = $"{_Atuador?.VazaoFluxoMLpSInstantanea ?? 0:0.000} ({_Atuador?.VazaoFluxoMLpSInstantaneaCorrigida ?? 0:0.000})";
|
||||||
gridDados.Rows[33].Cells[1].Value = $"{_Atuador?.VazaoMedia ?? 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[34].Cells[1].Value = (_Atuador?.VolumeVazaoML ?? 0).ToString("0.00");
|
||||||
gridDados.Rows[35].Cells[1].Value = (_Atuador?.AnguloBarraEsquerda ?? 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[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");
|
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]
|
[JsonIgnore]
|
||||||
private SensorModel SensorFluxoLinha => Sensores.FirstOrDefault(x => x.Componente == S_Code.sFLX && x.ID == "FLXLN");
|
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 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;
|
public double VazaoFluxoMLpSInstantaneaCorrigida => VazaoFluxoMLpSInstantanea * FatorCalibracaoFluxo;
|
||||||
|
|
||||||
|
|
@ -188,12 +188,12 @@ namespace AgroBase.Models.Modules
|
||||||
public double _PressaoVmin { get; set; } = 0.0;
|
public double _PressaoVmin { get; set; } = 0.0;
|
||||||
public double _PressaoVmax { get; set; } = 4.5;
|
public double _PressaoVmax { get; set; } = 4.5;
|
||||||
public double _PressaoMax { get; set; } = 174.045; // 1,2 MPa
|
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
|
public double PressaoLinhaCalc
|
||||||
{
|
{
|
||||||
get
|
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 tensao = FuncoesMatematicas.Map(_LeituraPressao, 0, 4095, 0, 3300) / 1000.0;
|
||||||
double pressao = FuncoesMatematicas.Map(tensao, _PressaoVmin, _PressaoVmax, 0, _PressaoMax);
|
double pressao = FuncoesMatematicas.Map(tensao, _PressaoVmin, _PressaoVmax, 0, _PressaoMax);
|
||||||
return pressao;
|
return pressao;
|
||||||
|
|
@ -231,22 +231,15 @@ namespace AgroBase.Models.Modules
|
||||||
{
|
{
|
||||||
var sensor = SensorFluxoLinha;
|
var sensor = SensorFluxoLinha;
|
||||||
|
|
||||||
if (sensor == null ||
|
if (sensor == null || !sensor.Inicializado || sensor.ValoresLeituras == null)
|
||||||
!sensor.Inicializado ||
|
|
||||||
sensor.ValoresLeituras == null)
|
|
||||||
{
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
|
||||||
|
|
||||||
double maximaMLs =
|
double maximaMLs =
|
||||||
VazaoMaximaSensor_LMin *
|
VazaoMaximaSensor_LMin *
|
||||||
1000.0 /
|
1000.0 /
|
||||||
60.0;
|
60.0;
|
||||||
|
|
||||||
var leituraFluxo =
|
var leituraFluxo = sensor.ValoresLeituras.FirstOrDefault(x => x.posicao == CanMessagePosicaoDados.Dados1 && x.funcao == FuncoesPinout.Fluxo);
|
||||||
sensor.ValoresLeituras.FirstOrDefault(
|
|
||||||
x => x.funcao == FuncoesPinout.Fluxo
|
|
||||||
);
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* IMPORTANTE:
|
* IMPORTANTE:
|
||||||
|
|
@ -262,10 +255,7 @@ namespace AgroBase.Models.Modules
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
vazaoMLs =
|
vazaoMLs = Convert.ToDouble(leituraFluxo.atual.valor);
|
||||||
Convert.ToDouble(
|
|
||||||
leituraFluxo.atual.valor
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
catch
|
catch
|
||||||
{
|
{
|
||||||
|
|
@ -279,8 +269,10 @@ namespace AgroBase.Models.Modules
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
double vazaoCorrigidaMLs = vazaoMLs * FatorCalibracaoFluxo;
|
||||||
|
|
||||||
return FuncoesMatematicas.Clamp(
|
return FuncoesMatematicas.Clamp(
|
||||||
vazaoMLs,
|
vazaoCorrigidaMLs,
|
||||||
0.0,
|
0.0,
|
||||||
maximaMLs
|
maximaMLs
|
||||||
);
|
);
|
||||||
|
|
@ -290,32 +282,19 @@ namespace AgroBase.Models.Modules
|
||||||
* Fallback por pulso:
|
* Fallback por pulso:
|
||||||
* aqui sim a fórmula calcula q em L/min e depois converte para mL/s.
|
* aqui sim a fórmula calcula q em L/min e depois converte para mL/s.
|
||||||
*/
|
*/
|
||||||
var leituraPulsos =
|
var leituraPulsos = sensor.ValoresLeituras.FirstOrDefault(x => x.posicao == CanMessagePosicaoDados.Dados1 && x.funcao == FuncoesPinout.QtdPulsos);
|
||||||
sensor.ValoresLeituras.FirstOrDefault(
|
var leituraPeriodo = sensor.ValoresLeituras.FirstOrDefault(x => x.posicao == CanMessagePosicaoDados.Dados1 && x.funcao == FuncoesPinout.Periodo);
|
||||||
x => x.funcao == FuncoesPinout.QtdPulsos
|
|
||||||
);
|
|
||||||
|
|
||||||
var leituraPeriodo =
|
if (!LeituraSensorRecente(leituraPulsos, agora) || !LeituraSensorRecente(leituraPeriodo, agora))
|
||||||
sensor.ValoresLeituras.FirstOrDefault(
|
|
||||||
x => x.funcao == FuncoesPinout.Periodo
|
|
||||||
);
|
|
||||||
|
|
||||||
if (!LeituraSensorRecente(leituraPulsos, agora) ||
|
|
||||||
!LeituraSensorRecente(leituraPeriodo, agora))
|
|
||||||
{
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
|
||||||
|
|
||||||
double calculadaMLs =
|
double calculadaMLs =
|
||||||
VazaoFluxoMLpSInstantaneaCalc;
|
VazaoFluxoMLpSInstantaneaCalc;
|
||||||
|
|
||||||
if (double.IsNaN(calculadaMLs) ||
|
if (double.IsNaN(calculadaMLs) || double.IsInfinity(calculadaMLs) || calculadaMLs < 0)
|
||||||
double.IsInfinity(calculadaMLs) ||
|
|
||||||
calculadaMLs < 0)
|
|
||||||
{
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
|
||||||
|
|
||||||
return FuncoesMatematicas.Clamp(
|
return FuncoesMatematicas.Clamp(
|
||||||
calculadaMLs,
|
calculadaMLs,
|
||||||
0.0,
|
0.0,
|
||||||
|
|
@ -325,44 +304,27 @@ namespace AgroBase.Models.Modules
|
||||||
|
|
||||||
private double ObterPotenciaAtualConfiavelPct(AtuadorBombaModel bomba, DateTime agora)
|
private double ObterPotenciaAtualConfiavelPct(AtuadorBombaModel bomba, DateTime agora)
|
||||||
{
|
{
|
||||||
if (bomba == null ||
|
if (bomba == null || !bomba.Inicializado || bomba.ValoresLeituras == null)
|
||||||
!bomba.Inicializado ||
|
|
||||||
bomba.ValoresLeituras == null)
|
|
||||||
{
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
|
||||||
|
|
||||||
var leituraPotencia =
|
var leituraPotencia = bomba.ValoresLeituras.FirstOrDefault(x => x.posicao == CanMessagePosicaoDados.Dados1 && x.funcao == FuncoesPinout.Potencia);
|
||||||
bomba.ValoresLeituras.FirstOrDefault(
|
|
||||||
x => x.funcao == FuncoesPinout.Potencia
|
|
||||||
);
|
|
||||||
|
|
||||||
if (!LeituraSensorRecente(
|
if (!LeituraSensorRecente(leituraPotencia, agora))
|
||||||
leituraPotencia,
|
|
||||||
agora))
|
|
||||||
{
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
|
||||||
|
|
||||||
double potencia;
|
double potencia;
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
potencia =
|
potencia = Convert.ToDouble(leituraPotencia.atual.valor);
|
||||||
Convert.ToDouble(
|
|
||||||
leituraPotencia.atual.valor
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
catch
|
catch
|
||||||
{
|
{
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (double.IsNaN(potencia) ||
|
if (double.IsNaN(potencia) || double.IsInfinity(potencia))
|
||||||
double.IsInfinity(potencia))
|
|
||||||
{
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
|
||||||
|
|
||||||
return FuncoesMatematicas.Clamp(
|
return FuncoesMatematicas.Clamp(
|
||||||
potencia,
|
potencia,
|
||||||
|
|
@ -1168,6 +1130,13 @@ namespace AgroBase.Models.Modules
|
||||||
posicao = CanMessagePosicaoDados.Status,
|
posicao = CanMessagePosicaoDados.Status,
|
||||||
indice = 0,
|
indice = 0,
|
||||||
},
|
},
|
||||||
|
new SensorValoresLeituraModel()
|
||||||
|
{
|
||||||
|
funcao = FuncoesPinout.MalhaFechada,
|
||||||
|
posicao = CanMessagePosicaoDados.Status,
|
||||||
|
indice = 1,
|
||||||
|
},
|
||||||
|
|
||||||
new SensorValoresLeituraModel()
|
new SensorValoresLeituraModel()
|
||||||
{
|
{
|
||||||
funcao = FuncoesPinout.EstadoLeitura,
|
funcao = FuncoesPinout.EstadoLeitura,
|
||||||
|
|
@ -1203,7 +1172,44 @@ namespace AgroBase.Models.Modules
|
||||||
funcao = FuncoesPinout.ModoControleBomba,
|
funcao = FuncoesPinout.ModoControleBomba,
|
||||||
posicao = CanMessagePosicaoDados.Dados1,
|
posicao = CanMessagePosicaoDados.Dados1,
|
||||||
indice = 5,
|
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()
|
Controle = new AtuadorBombaModel.BombaModoControleModel()
|
||||||
{
|
{
|
||||||
|
|
@ -1237,6 +1243,13 @@ namespace AgroBase.Models.Modules
|
||||||
posicao = CanMessagePosicaoDados.Status,
|
posicao = CanMessagePosicaoDados.Status,
|
||||||
indice = 0,
|
indice = 0,
|
||||||
},
|
},
|
||||||
|
new SensorValoresLeituraModel()
|
||||||
|
{
|
||||||
|
funcao = FuncoesPinout.MalhaFechada,
|
||||||
|
posicao = CanMessagePosicaoDados.Status,
|
||||||
|
indice = 1,
|
||||||
|
},
|
||||||
|
|
||||||
new SensorValoresLeituraModel()
|
new SensorValoresLeituraModel()
|
||||||
{
|
{
|
||||||
funcao = FuncoesPinout.EstadoLeitura,
|
funcao = FuncoesPinout.EstadoLeitura,
|
||||||
|
|
@ -2256,7 +2269,7 @@ namespace AgroBase.Models.Modules
|
||||||
var sensor = Sensores.FirstOrDefault(x => x.ID_Num == id_num);
|
var sensor = Sensores.FirstOrDefault(x => x.ID_Num == id_num);
|
||||||
if (sensor == null) return;
|
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)
|
if (sensor.ID_Num == SensorAnguloBarraEsquerda.ID_Num)
|
||||||
AnguloBarraEsquerda = angulo;
|
AnguloBarraEsquerda = angulo;
|
||||||
else if (sensor.ID_Num == SensorAnguloBarraDireita.ID_Num)
|
else if (sensor.ID_Num == SensorAnguloBarraDireita.ID_Num)
|
||||||
|
|
@ -2302,8 +2315,8 @@ namespace AgroBase.Models.Modules
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
public List<SensorValoresLeituraModel> ValoresLeituras { get; set; }
|
public List<SensorValoresLeituraModel> ValoresLeituras { get; set; }
|
||||||
public Estado _EstadoLeitura => (Estado)(ValoresLeituras?.FirstOrDefault(x => x.funcao == FuncoesPinout.EstadoLeitura)?.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.funcao == FuncoesPinout.ServoAnguloLeitura)?.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 DateTime UltimoComandoEnviado { get; set; } = DateTime.MinValue;
|
||||||
public bool UltimoStatusDesejado { get; set; } = false;
|
public bool UltimoStatusDesejado { get; set; } = false;
|
||||||
|
|
@ -2517,12 +2530,19 @@ namespace AgroBase.Models.Modules
|
||||||
}
|
}
|
||||||
public List<SensorValoresLeituraModel> ValoresLeituras { get; set; }
|
public List<SensorValoresLeituraModel> ValoresLeituras { get; set; }
|
||||||
public BombaModoControleModel Controle { get; set; }
|
public BombaModoControleModel Controle { get; set; }
|
||||||
public Estado _EstadoLeitura => ValoresLeituras?.FirstOrDefault(x => x.funcao == FuncoesPinout.EstadoLeitura)?.atual?.valor ?? Estado.Desligado;
|
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.funcao == FuncoesPinout.Potencia)?.atual?.valor ?? 0;
|
public double _Potencia => ValoresLeituras?.FirstOrDefault(x => x.posicao == CanMessagePosicaoDados.Dados1 && x.funcao == FuncoesPinout.Potencia)?.atual?.valor ?? 0;
|
||||||
public bool _BombaLigada => _Potencia > 0;
|
public bool _BombaLigada => _Potencia > 0;
|
||||||
public double _PressaoSP => ValoresLeituras?.FirstOrDefault(x => x.funcao == FuncoesPinout.PressaoSP)?.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.funcao == FuncoesPinout.PotenciaSP)?.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.funcao == FuncoesPinout.Pressao)?.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; }
|
public int Atuacoes { get; set; }
|
||||||
|
|
@ -2623,10 +2643,10 @@ namespace AgroBase.Models.Modules
|
||||||
{
|
{
|
||||||
public ModoControleBomba Modo { get; set; } = ModoControleBomba.OnOff;
|
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 Kp { get; set; } = 0.08;
|
||||||
public double Ki { get; set; } = 0.2;
|
public double Ki { get; set; } = 0.008;
|
||||||
public double Kd { get; set; } = 0.0;
|
public double Kd { get; set; } = 0.0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -3060,20 +3080,66 @@ namespace AgroBase.Models.Modules
|
||||||
{
|
{
|
||||||
case CanMessagePosicaoDados.Status:
|
case CanMessagePosicaoDados.Status:
|
||||||
{
|
{
|
||||||
bool Iniciado = data[2] == 1;
|
bool iniciado = data.Length > 2 && data[2] == 1;
|
||||||
bool MalhaFechada = data[3] == 1;
|
bool malhaFechada = data.Length > 3 && data[3] == 1;
|
||||||
AtualizarDados(ID_Num, posicao, componente, new List<dynamic>() { Iniciado });
|
AtualizarDados(
|
||||||
|
ID_Num,
|
||||||
|
posicao,
|
||||||
|
componente,
|
||||||
|
new List<dynamic>() {
|
||||||
|
iniciado,
|
||||||
|
malhaFechada,
|
||||||
|
}
|
||||||
|
);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case CanMessagePosicaoDados.Dados1:
|
case CanMessagePosicaoDados.Dados1:
|
||||||
{
|
{
|
||||||
Estado estado = (Estado)data[2];
|
Estado estado = data.Length > 2 ? (Estado)data[2] : Estado.Desligado;
|
||||||
int potenciaSp = data[3];
|
int potenciaSp = data.Length > 3 ? data[3] : 0;
|
||||||
int percentualPotencia = data[4];
|
int percentualPotencia = data.Length > 4 ? data[4] : 0;
|
||||||
int pressaoSp = data[5];
|
int pressaoSp = data.Length > 5 ? data[5] : 0;
|
||||||
int pressaoAtual = data[6];
|
int pressaoAtual = data.Length > 6 ? data[6] : 0;
|
||||||
ModoControleBomba modo = (ModoControleBomba)data[7];
|
ModoControleBomba modo = data.Length > 7 ? (ModoControleBomba)data[7] : ModoControleBomba.OnOff;
|
||||||
AtualizarDados(ID_Num, posicao, componente, new List<dynamic>() { estado, potenciaSp, percentualPotencia, pressaoSp, pressaoAtual, modo });
|
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;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -440,6 +440,8 @@ namespace AgroBase.Models.Modules
|
||||||
PotenciaSP,
|
PotenciaSP,
|
||||||
ModoControleBomba,
|
ModoControleBomba,
|
||||||
Botao,
|
Botao,
|
||||||
|
MalhaFechada,
|
||||||
|
PressaoSPExtra,
|
||||||
}
|
}
|
||||||
|
|
||||||
public static class PinoutUtils
|
public static class PinoutUtils
|
||||||
|
|
|
||||||
|
|
@ -3022,41 +3022,7 @@ namespace AgroBase.Models
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
AtuSensoriamentoLogModel logAtu = new AtuSensoriamentoLogModel()
|
var logAtu = AtuSensoriamentoLogModel.MontarLogAtuador(Agora);
|
||||||
{
|
|
||||||
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,
|
|
||||||
};
|
|
||||||
SalvarLogLine(T_Code.Atu.ToString(), logAtu);
|
SalvarLogLine(T_Code.Atu.ToString(), logAtu);
|
||||||
|
|
||||||
var senLeitura = Variaveis.OperacaoEmAndamento.DispSen.Dados;
|
var senLeitura = Variaveis.OperacaoEmAndamento.DispSen.Dados;
|
||||||
|
|
@ -3640,7 +3606,7 @@ namespace AgroBase.Models
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
public ModuloIMUModel IMU { get; set; }
|
public ModuloIMUModel IMU { get; set; }
|
||||||
public OperacaoSensoriamentoLogAtuModel Atuador { get; set; }
|
public AtuSensoriamentoLogModel Atuador { get; set; }
|
||||||
public OperacaoSensoriamentoLogMovModel Movimentacao { get; set; }
|
public OperacaoSensoriamentoLogMovModel Movimentacao { get; set; }
|
||||||
public OperacaoSensoriamentoLogDirModel Direcional { get; set; }
|
public OperacaoSensoriamentoLogDirModel Direcional { get; set; }
|
||||||
public OperacaoSensoriamentoLogBateriaModel Bateria { 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;
|
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 dadosIMU = sIMU != null && imu_iniciado ? sIMU.Clone() : new ModuloIMUModel();
|
||||||
|
|
||||||
var bombaLinha = _DispAtu?.Dados?.BombaPressurizadora;
|
var logAtu = AtuSensoriamentoLogModel.MontarLogAtuador(DateTime.Now);
|
||||||
var dadosAtuador = _DispAtu != null ? new OperacaoSensoriamentoLogAtuModel()
|
var dadosAtuador = logAtu.Clone();
|
||||||
{
|
|
||||||
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 dadosMovimentacao = _DispMvd != null ? new OperacaoSensoriamentoLogMovModel()
|
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 class OperacaoSensoriamentoLogMovModel
|
||||||
{
|
{
|
||||||
public double VelocidadeMedia { get; set; }
|
public double VelocidadeMedia { get; set; }
|
||||||
|
|
@ -4366,41 +4207,315 @@ namespace AgroBase.Models
|
||||||
public class AtuSensoriamentoLogModel
|
public class AtuSensoriamentoLogModel
|
||||||
{
|
{
|
||||||
public DateTime Momento { get; set; }
|
public DateTime Momento { get; set; }
|
||||||
|
|
||||||
|
// Conexão / saúde geral
|
||||||
public bool Inicializado { get; set; }
|
public bool Inicializado { get; set; }
|
||||||
|
public bool ConexaoAtiva { get; set; }
|
||||||
public int QualidadeWifi { get; set; }
|
public int QualidadeWifi { get; set; }
|
||||||
public int LatenciaLoop { 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 MassaReservatorio { get; set; }
|
||||||
public double PressaoLinha_SP { get; set; }
|
|
||||||
public double PressaoLinha { get; set; }
|
|
||||||
public double VolumeReservatorio { get; set; }
|
public double VolumeReservatorio { get; set; }
|
||||||
public double PercentualReservatorio { get; set; }
|
public double PercentualReservatorio { get; set; }
|
||||||
|
|
||||||
|
public double HerbicidaConsumido { get; set; }
|
||||||
|
public double HerbicidaConsumidoOperacao { get; set; }
|
||||||
public double PercentualHerbicidaConsumido { get; set; }
|
public double PercentualHerbicidaConsumido { get; set; }
|
||||||
public double PercentualHerbicidaConsumidoOperacao { get; set; }
|
public double PercentualHerbicidaConsumidoOperacao { get; set; }
|
||||||
|
|
||||||
public double HerbicidaPorAtuacao { get; set; }
|
public double HerbicidaPorAtuacao { get; set; }
|
||||||
public double PotenciaBomba { get; set; }
|
public double HerbicidaPorErva { get; set; }
|
||||||
public bool BombaLigada { 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 VazaoFluxoMLpSInstantanea { get; set; }
|
||||||
|
public double VazaoFluxoMLpSInstantaneaCorrigida { get; set; }
|
||||||
public double VazaoFluxoMLpSMedia { get; set; }
|
public double VazaoFluxoMLpSMedia { get; set; }
|
||||||
|
|
||||||
public double VolumeVazaoML { 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 double TempoPulverizadorAtuado { get; set; }
|
||||||
public List<AtuBicoSensoriamentoLogModel> Bicos { get; set; }
|
public double TempoBombaAtuada { get; set; }
|
||||||
public DateTime UltimoComandoRespondido { 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 class AtuBicoSensoriamentoLogModel
|
||||||
{
|
{
|
||||||
public string ID { get; set; }
|
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 Inicializado { get; set; }
|
||||||
public bool StatusBico { get; set; }
|
public bool Comandar { get; set; }
|
||||||
|
public bool Atuado { get; set; }
|
||||||
public double MediaNivelFluxo { get; set; }
|
public double MediaNivelFluxo { get; set; }
|
||||||
|
public int Posicao { get; set; }
|
||||||
|
public bool StatusBico { get; set; }
|
||||||
public int Atuacoes { get; set; }
|
public int Atuacoes { get; set; }
|
||||||
public double TempoAtuado { get; set; }
|
public double TempoAtuado { get; set; }
|
||||||
public double AnguloAbertura { get; set; }
|
public double AnguloAbertura { get; set; }
|
||||||
public double AnguloControle { 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
|
public class CamSoloSensoriamentoLogModel
|
||||||
|
|
|
||||||
|
|
@ -141,7 +141,8 @@ BombaPressurizadora_v2 sBMB_Linha(
|
||||||
Sentido::Horario,
|
Sentido::Horario,
|
||||||
&sPRS_Linha,
|
&sPRS_Linha,
|
||||||
BicosPulverizadores,
|
BicosPulverizadores,
|
||||||
QUANTIDADE_BICOS
|
QUANTIDADE_BICOS,
|
||||||
|
&sFLX_Linha
|
||||||
);
|
);
|
||||||
BombaPressurizadora_v2 sBMB_Agitador(
|
BombaPressurizadora_v2 sBMB_Agitador(
|
||||||
"BMBAGT",
|
"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_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(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);
|
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 _Vmax = 4.5;
|
||||||
double _Pmax = 174.045;
|
double _Pmax = 174.045;
|
||||||
|
|
||||||
|
double GanhoCalibracaoPressao = 1.1361506;
|
||||||
|
double OffsetCalibracaoPressao = -14.887795;
|
||||||
|
|
||||||
|
|
||||||
int leitura = 0;
|
int leitura = 0;
|
||||||
double Tensao = 0.0;
|
double Tensao = 0.0;
|
||||||
double Pressao = 0.0;
|
double Pressao = 0.0;
|
||||||
|
|
@ -90,12 +94,16 @@ class SensorPressao_v2 : public ComponenteCAN {
|
||||||
double leituraFiltrada = filtro.updateEstimate(leitura);
|
double leituraFiltrada = filtro.updateEstimate(leitura);
|
||||||
|
|
||||||
Tensao = fmap(leituraFiltrada, 0.0, 4095.0, 0.0, 3300.0) / 1000.0;
|
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 < 0) Pressao = 0;
|
||||||
if (Pressao > _Pmax) Pressao = _Pmax;
|
if (Pressao > _Pmax) Pressao = _Pmax;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
std::vector<uint8_t> MontarMensagemCAN(CanMessagePosicaoDados posicao) {
|
std::vector<uint8_t> MontarMensagemCAN(CanMessagePosicaoDados posicao) {
|
||||||
std::vector<uint8_t> data;
|
std::vector<uint8_t> data;
|
||||||
data.push_back(static_cast<uint8_t>(posicao));
|
data.push_back(static_cast<uint8_t>(posicao));
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue