agrobot_base/AgroBase/AgroBase/Services/UltrasonicA05Service.cs

150 lines
4.4 KiB
C#

using AgroBase.Forms;
using AgroBase.Models;
using System;
using System.Collections.Generic;
using System.IO.Ports;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using static AgroBase.Models.Enums;
using System.Windows.Forms;
namespace AgroBase.Services
{
public class UltrasonicA05Service
{
public static bool Iniciado { get; set; }
public static int TaxaAmostragem { get; set; } = 500;
public static byte slaveAddress = 0x01;
public static UltrasonicA05Model DadosLeitura = new UltrasonicA05Model();
public static async Task<bool> VerificaPortaA05(SerialPort porta)
{
ModbusService.DefinirPortaCOM(porta);
var Comando = new ModbusComandoModel()
{
Dispositivo = T_Code.A05,
Endereco = slaveAddress,
Comando = ComandoAquisicaoDados(),
Verificacao = true,
TamanhoEsperado = 11,
TimeoutResposta = 1000,
};
ModbusService.AdicionarComandoNaFila(Comando);
while (Comando.RespondidoEm == DateTime.MinValue)
{
await Task.Delay(200);
}
Iniciado = DecifrarRespostaAquisicao(Comando.Resposta);
if (Iniciado)
{
DefinirDispositivo();
return Iniciado;
}
if (!ModbusService.Iniciado)
{
ModbusService.LimparDadosPorta();
}
return false;
}
private static void DefinirDispositivo()
{
if (Iniciado)
{
SerialService.DispositivosMapeados.Add(new SerialService.DispositivoDetalhesModel()
{
PortaCOM = ModbusService._PortaModbus.PortName,
Dispositivo = T_Code.A05,
Erro = !Iniciado,
Versao = "1"
});
}
}
public static byte[] ComandoAquisicaoDados()
{
byte functionCode = 0x03;
byte startAddress = 0x0001;
byte firstRegister = 0x0006;
byte numOfRegisters = 0x0004;
List<byte> command = new List<byte>() { slaveAddress, functionCode, startAddress, firstRegister, 0x00, numOfRegisters };
byte[] crc = ModbusService.Crc16(command.ToArray()); // Supondo que você tenha a implementação do CRC16
command.AddRange(crc);
return command.ToArray();
}
public static bool DecifrarRespostaAquisicao(byte[] resposta)
{
try
{
if (resposta == null || !resposta.Any())
{
return false;
}
if (resposta.Length >= 18)
{
resposta = resposta.Skip(5).ToArray();
}
if (resposta[1] == 0x03)
{
int numBytes = resposta[2];
if (numBytes == 8) // Se o número de bytes de dados for 8
{
// Decifrar os valores dos sensores
int u1 = (resposta[3] << 8) + resposta[4];
int u2 = (resposta[5] << 8) + resposta[6];
int u3 = (resposta[7] << 8) + resposta[8];
int u4 = (resposta[9] << 8) + resposta[10];
UltrasonicA05Model modelo = new UltrasonicA05Model()
{
Momento = DateTime.Now,
Endereco = resposta[0],
U1 = u1,
U2 = u2,
U3 = u3,
U4 = u4
};
DadosLeitura = modelo;
return true;
}
else
{
Console.WriteLine("Número de bytes de dados não esperado.");
}
}
else
{
Console.WriteLine("Resposta inválida ou código de função incorreto.");
}
return false;
}
catch (Exception ex)
{
Console.WriteLine("Erro ao decifrar a resposta: " + ex.Message);
}
return false;
}
}
}