agrobot_base/AgroBase/AgroBase/Forms/Atuador/frmAtuCalibragem.cs

339 lines
15 KiB
C#
Raw Normal View History

2024-04-01 11:03:25 +00:00
using AgroBase.Comum;
using AgroBase.Models;
using AgroBase.Models.Modules;
using Microsoft.DirectX.PrivateImplementationDetails;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Windows.Forms.DataVisualization.Charting;
using static AgroBase.Models.Enuns;
namespace AgroBase.Forms.Atuador
{
public partial class frmAtuCalibragem : Form
{
Timer tmrLeitura = new Timer() { Interval = 1000 };
DispositivosService<AtuadorModel> DispAtu = (DispositivosService<AtuadorModel>)Variaveis.DispositivosConectados.FirstOrDefault(x => x.Dispositivo == T_Code.Atu);
CalibragemVazao _CalibragemVazao = new CalibragemVazao();
public frmAtuCalibragem()
{
InitializeComponent();
}
private void frmAtuCalibragem_Load(object sender, EventArgs e)
{
PopularBicos();
nudPressaoSP.Value = Convert.ToInt32(DispAtu.Dados.BombaPressurizadora.PressaoSP);
txtMMassaRef.Text = DispAtu.Dados._MassaRef.ToString();
txtMLeituraRef.Text = DispAtu.Dados._MassaLeituraRef.ToString();
txtPressaoVmin.Text = DispAtu.Dados._PressaoVmin.ToString();
txtPressaoVmax.Text = DispAtu.Dados._PressaoVmax.ToString();
txtMLRef.Text = DispAtu.Dados._FluxoMlRef.ToString();
txtPulsosRef.Text = DispAtu.Dados._FluxoPulsoRef.ToString();
txtVolume.Text = DispAtu.Dados.VolumeVazaoAferido.ToString();
grdSensoriamento.Rows.Clear();
grdSensoriamento.Columns.Clear();
grdSensoriamento.Columns.Add("clDado", "Dado");
grdSensoriamento.Columns.Add("clValor", "Valor");
grdSensoriamento.Rows.Add(new object[] { "Bomba Iniciada", "Não" });
grdSensoriamento.Rows.Add(new object[] { "Bomba Cmd Ligar", "Não" });
grdSensoriamento.Rows.Add(new object[] { "Bomba Ligada", "Não" });
grdSensoriamento.Rows.Add(new object[] { "Bomba Potencia", "0" });
grdSensoriamento.Rows.Add(new object[] { "Pressão", "0" });
grdSensoriamento.Rows.Add(new object[] { "Pressão Calc", "0" });
grdSensoriamento.Rows.Add(new object[] { "Vazão", "0" });
grdSensoriamento.Rows.Add(new object[] { "Massa", "0" });
grdSensoriamento.Rows.Add(new object[] { "Volume", "0" });
grdSensoriamento.Rows.Add(new object[] { "Percentual", "0" });
tmrLeitura.Tick += TmrLeitura_Tick;
tmrLeitura.Start();
}
private void frmAtuCalibragem_FormClosing(object sender, FormClosingEventArgs e)
{
tmrLeitura.Stop();
}
private void PopularBicos()
{
for (int i = 0; i < DispAtu.Dados.QuantidadeBicos; i++)
{
string ID = DispAtu.Dados.BicosPulverizadores[i].ID;
Label lblBico = new Label()
{
Name = "lbl_" + ID,
Location = new Point(0, 0),
Text = ID
};
Panel pnlBico = new Panel()
{
Name = "pnlB_" + ID,
Size = new Size(166, 166),
Location = new Point(30 + (i * 166), 0),
};
pnlBico.Paint -= pnlBico_Paint;
pnlBico.Paint += pnlBico_Paint;
Button btnDesligar = new Button()
{
Name = "btn0_" + ID,
Size = new Size(75, 27),
Location = new Point(5, 136),
Text = "Desligar"
};
btnDesligar.Click -= btn0_Click;
btnDesligar.Click += btn0_Click;
Button btnLigar = new Button()
{
Name = "btn1_" + ID,
Size = new Size(75, 27),
Location = new Point(86, 136),
Text = "Ligar"
};
btnLigar.Click -= btn1_Click;
btnLigar.Click += btn1_Click;
Label lblCmd = new Label()
{
Name = "lblCmd_" + ID,
Size = new Size(150, 20),
Location = new Point(5, 115),
Text = "Comando: Desligado"
};
pnlBico.Controls.Add(lblBico);
pnlBico.Controls.Add(btnDesligar);
pnlBico.Controls.Add(btnLigar);
pnlBico.Controls.Add(lblCmd);
pnlBico.Location = new Point(30 + (i * 166), 22);
pnlBicos.Controls.Add(pnlBico);
}
}
private void TmrLeitura_Tick(object sender, EventArgs e)
{
DispAtu = (DispositivosService<AtuadorModel>)Variaveis.DispositivosConectados.FirstOrDefault(x => x.Dispositivo == T_Code.Atu);
if (DispAtu != null)
{
lblConectado.Text = "Conectado: " + (DispAtu.Dados.Conectado ? "Sim" : "Não");
AtualizarGridSensores();
foreach (var pnlBico in pnlBicos.Controls.OfType<Panel>().Where(x => x.Name.Contains("pnlB_")))
{
pnlBico.Invalidate();
}
}
}
private void AtualizarGridSensores()
{
grdSensoriamento.Rows[0].Cells[1].Value = DispAtu.Dados.BombaPressurizadora.Inicializado;
grdSensoriamento.Rows[1].Cells[1].Value = DispAtu.Dados.BombaPressurizadora.BombaAtuada;
grdSensoriamento.Rows[2].Cells[1].Value = DispAtu.Dados.BombaPressurizadora.Ligado;
grdSensoriamento.Rows[3].Cells[1].Value = DispAtu.Dados.BombaPressurizadora.Potencia;
grdSensoriamento.Rows[4].Cells[1].Value = DispAtu.Dados.PressaoLinha.ToString("0.00000");
grdSensoriamento.Rows[5].Cells[1].Value = DispAtu.Dados.PressaoLinhaCalc.ToString("0.00000");
grdSensoriamento.Rows[6].Cells[1].Value = DispAtu.Dados.VazaoFluxoMLpS.ToString("0.00000");
grdSensoriamento.Rows[7].Cells[1].Value = DispAtu.Dados.MassaReservatorio.ToString("0.00000");
grdSensoriamento.Rows[8].Cells[1].Value = DispAtu.Dados.VolumeReservatorio.ToString("0.00000");
grdSensoriamento.Rows[9].Cells[1].Value = DispAtu.Dados.PercentualReservatorio.ToString("0.00");
}
private void EnviarProtocoloComandoBomba()
{
string Protocolo = DispAtu.Dados.BombaPressurizadora.ProtocoloComando();
DispAtu.AdicionarMensagemFila(DispAtu.Dados.Modulo_ID, Protocolo, true, true);
2024-04-01 11:03:25 +00:00
}
private void nudPressaoSP_ValueChanged(object sender, EventArgs e)
{
DispAtu.Dados.BombaPressurizadora.PressaoSP = Convert.ToInt32(((NumericUpDown)sender).Value);
EnviarProtocoloComandoBomba();
}
private void btnLigarBomba_Click(object sender, EventArgs e)
{
DispAtu.Dados.BombaPressurizadora.BombaAtuada = true;
EnviarProtocoloComandoBomba();
}
private void btnDesligarBomba_Click(object sender, EventArgs e)
{
DispAtu.Dados.BombaPressurizadora.BombaAtuada = false;
EnviarProtocoloComandoBomba();
}
private void pnlBico_Paint(object sender, PaintEventArgs e)
{
Panel pnl = (Panel)sender;
string ID = pnl.Name.Replace("pnlB_", "");
Graphics g = e.Graphics;
int circleDiameter = 50; // Diâmetro do círculo
int circleX = (pnl.Width - circleDiameter) / 2; // Posição X do círculo (centro horizontal)
int circleY = pnl.Height / 4; // Posição Y do círculo (mais próximo ao topo)
// Desenhar o círculo
if (DispAtu.Dados.BicosPulverizadores.First(x => x.ID == ID).StatusBico)
g.FillEllipse(Brushes.Green, circleX, circleY, circleDiameter, circleDiameter); // LED aceso (círculo preenchido)
else
g.DrawEllipse(Pens.Black, circleX, circleY, circleDiameter, circleDiameter); // LED apagado (círculo vazio)
}
private void btn0_Click(object sender, EventArgs e)
{
Button btn = (Button)sender;
string ID = btn.Name.Replace("btn0_", "");
var Bico = DispAtu.Dados.BicosPulverizadores.FirstOrDefault(x => x.ID == ID);
if (Bico != null)
{
Bico.Atuado = !DispAtu.Dados.AtuacaoNivelAlto;
string Protocolo = Bico.ProtocoloComando();
DispAtu.AdicionarMensagemFila(DispAtu.Dados.Modulo_ID, Protocolo, true, false);
2024-04-01 11:03:25 +00:00
pnlBicos.Controls.OfType<Panel>().First(x => x.Name == "pnlB_" + ID).Invalidate();
pnlBicos.Controls.OfType<Panel>().First(x => x.Name == "pnlB_" + ID).Controls.OfType<Label>().First(x => x.Name == "lblCmd_" + ID).Text = "Comando: Desligado";
}
}
private void btn1_Click(object sender, EventArgs e)
{
Button btn = (Button)sender;
string ID = btn.Name.Replace("btn1_", "");
var Bico = DispAtu.Dados.BicosPulverizadores.FirstOrDefault(x => x.ID == ID);
if (Bico != null)
{
Bico.Atuado = DispAtu.Dados.AtuacaoNivelAlto;
string Protocolo = Bico.ProtocoloComando();
DispAtu.AdicionarMensagemFila(DispAtu.Dados.Modulo_ID, Protocolo, true, false);
2024-04-01 11:03:25 +00:00
pnlBicos.Controls.OfType<Panel>().First(x => x.Name == "pnlB_" + ID).Invalidate();
pnlBicos.Controls.OfType<Panel>().First(x => x.Name == "pnlB_" + ID).Controls.OfType<Label>().First(x => x.Name == "lblCmd_" + ID).Text = "Comando: Ligado";
}
}
private void btnSalvar_Click(object sender, EventArgs e)
{
DispAtu.Dados.BombaPressurizadora.PressaoSP = Convert.ToDouble(nudPressaoSP.Value);
DispAtu.Dados._MassaRef = Convert.ToDouble(txtMMassaRef.Text);
DispAtu.Dados._MassaLeituraRef = Convert.ToDouble(txtMLeituraRef.Text);
DispAtu.Dados._PressaoVmin = Convert.ToDouble(txtPressaoVmin.Text);
DispAtu.Dados._PressaoVmax = Convert.ToDouble(txtPressaoVmax.Text);
DispAtu.Dados._FluxoMlRef = Convert.ToDouble(txtMLRef.Text);
DispAtu.Dados._FluxoPulsoRef = Convert.ToDouble(txtPulsosRef.Text);
DispAtu.Dados.VolumeVazaoAferido = Convert.ToDouble(txtVolume.Text);
}
private void btnCalibrarVazao_Click(object sender, EventArgs e)
{
if (btnCalibrarVazao.Text == "Calcular")
{
if (txtVolume.Text == "" || double.TryParse(txtVolume.Text, out double Volume) == false)
{
MessageBox.Show("Informe o volume obtido durante a calibragem!");
return;
}
_CalibragemVazao.VolumeComputado = Volume;
btnCalibrarVazao.Text = "Calibrar";
string Resultados =
"Valores iniciais" + Environment.NewLine +
"Massa = " + _CalibragemVazao.MassaInicial.ToString("0.0000") + " Kg" + Environment.NewLine +
"Pressão = " + _CalibragemVazao.PressoesAferidas.First().ToString("0.0000") + " psi" + Environment.NewLine +
Environment.NewLine +
"Medições" + Environment.NewLine +
"V = " + _CalibragemVazao.VolumeComputado.ToString("0.0000") + "mL" + Environment.NewLine +
"P = " + _CalibragemVazao.PressaoMedia.ToString("0.0000") + " psi" + Environment.NewLine +
"NP = " + _CalibragemVazao.QtdPulsos + Environment.NewLine +
"T = " + _CalibragemVazao.Periodo + " s" + Environment.NewLine +
"M = " + _CalibragemVazao.MassaFinal.ToString("0.0000") + " Kg" + Environment.NewLine +
Environment.NewLine +
"Cálculos" + Environment.NewLine +
"Massa Perdida = " + _CalibragemVazao.MassaPerdida.ToString("0.0000") + " g" + Environment.NewLine +
"d = " + _CalibragemVazao.d.ToString("0.0000") + Environment.NewLine +
"Q = " + _CalibragemVazao.Q.ToString("0.0000") + " mL/s" + Environment.NewLine +
"x = " + _CalibragemVazao.x.ToString("0.0000") + Environment.NewLine +
"Q2 = " + _CalibragemVazao.Q2.ToString("0.0000") + " mL" + Environment.NewLine +
""
;
Console.WriteLine(Resultados);
MessageBox.Show(Resultados, "Resultado da calibragem");
if (MessageBox.Show("Deseja aceitar os parâmetros de calibragem?", "Atualizar dados", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
{
txtMLRef.Text = _CalibragemVazao.VolumeComputado.ToString();
txtPulsosRef.Text = _CalibragemVazao.QtdPulsos.ToString();
DispAtu.Dados.DensidadeHerbicida = _CalibragemVazao.d;
btnSalvar_Click(sender, EventArgs.Empty);
}
}
else
{
btnCalibrarVazao.Enabled = false;
btnLigarBomba_Click(sender, e);
var tmrInicioCalibragemVazao = new Timer { Interval = 1000 };
tmrInicioCalibragemVazao.Tick += tmrInicioCalibragemVazao_Tick;
tmrInicioCalibragemVazao.Start();
}
}
private void tmrInicioCalibragemVazao_Tick(object sender, EventArgs e)
{
((Timer)sender).Stop();
var tmrCalibragemVazao = new Timer() { Interval = 500 };
_CalibragemVazao = new CalibragemVazao()
{
Calibrando = true,
MassaInicial = DispAtu.Dados.MassaReservatorio,
PressoesAferidas = new List<double>()
{
DispAtu.Dados.PressaoLinha,
}
};
tmrCalibragemVazao.Tick += tmrCalibragemVazao_Tick;
tmrCalibragemVazao.Start();
btn1_Click(new Button() { Name = "btn1_" + DispAtu.Dados.BicosPulverizadores.First(x => x.Inicializado).ID }, e);
}
private void tmrCalibragemVazao_Tick(object sender, EventArgs e)
{
_CalibragemVazao.QtdPulsos = DispAtu.Dados._LeituraPulsos;
_CalibragemVazao.Periodo = DispAtu.Dados._LeituraPeriodo;
_CalibragemVazao.PressoesAferidas.Add(DispAtu.Dados.PressaoLinha);
_CalibragemVazao.MassaFinal = DispAtu.Dados.MassaReservatorio;
if (DispAtu.Dados._LeituraPeriodo >= _CalibragemVazao.TempoCalibragem)
{
((Timer)sender).Stop();
btn0_Click(new Button() { Name = "btn0_" + DispAtu.Dados.BicosPulverizadores.First(x => x.Inicializado).ID }, e);
btnDesligarBomba_Click(sender, e);
_CalibragemVazao.Periodo = _CalibragemVazao.Periodo / 1000.0;
btnCalibrarVazao.Text = "Calcular";
btnCalibrarVazao.Enabled = true;
}
}
}
2024-04-01 11:03:25 +00:00
}