150 lines
4.4 KiB
C#
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;
|
|
}
|
|
|
|
|
|
}
|
|
}
|