corrigido comunicacao bld

This commit is contained in:
Diego Freitas 2024-11-21 07:35:26 -03:00
parent 7b21f50513
commit 5a10d30041
31 changed files with 29793 additions and 168 deletions

Binary file not shown.

View File

@ -174,7 +174,7 @@ namespace AgroBase
.Select(x => new ListViewItem() .Select(x => new ListViewItem()
{ {
Text = Text =
x.FirstOrDefault().PortaCOM + " - " + Enum.GetName(typeof(T_Code), x.Key) + " v" + x.FirstOrDefault().Versao + x.FirstOrDefault().Endereco + " - " + Enum.GetName(typeof(T_Code), x.Key) + " v" + x.FirstOrDefault().Versao +
(SerialService.DispositivosMultiplos.Contains(x.FirstOrDefault().Dispositivo) ? (" (" + string.Join(", ", x.Where(y => y.Conectado).Select(y => y.Mod_ID)) + ")") : (SerialService.DispositivosMultiplos.Contains(x.FirstOrDefault().Dispositivo) ? (" (" + string.Join(", ", x.Where(y => y.Conectado).Select(y => y.Mod_ID)) + ")") :

View File

@ -1,10 +1,8 @@
using System; using AgroBase.Services;
using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Text;
using System.Threading.Tasks;
using static AgroBase.Models.Enums; using static AgroBase.Models.Enums;
using static AgroBase.Services.BLD300RService;
namespace AgroBase.Models namespace AgroBase.Models
{ {
@ -74,14 +72,14 @@ namespace AgroBase.Models
{ {
get get
{ {
return Convert.ToInt32(ConvertByteArrayToInt(GetParametroValue(0x0056)) * Parametros.First(x => x.Registro == 0x0056).Escala); return Convert.ToInt32(ConvertByteArrayToInt(GetParametroValue(0x0056)) * ((parametros.Any(x => x.Registro == 0x0056) ? parametros.First(x => x.Registro == 0x0056).Escala : BLD300RService.Parametros.First(x => x.Registro == 0x0056).Escala)));
} }
} }
public int RPM public int RPM
{ {
get get
{ {
return Convert.ToInt32(ConvertByteArrayToInt(GetParametroValue(0x005F)) * Parametros.First(x => x.Registro == 0x005F).Escala); return Convert.ToInt32(ConvertByteArrayToInt(GetParametroValue(0x005F)) * ((parametros.Any(x => x.Registro == 0x005F) ? parametros.First(x => x.Registro == 0x005F).Escala : BLD300RService.Parametros.First(x => x.Registro == 0x005F).Escala)));
} }
} }
public bool Ativado public bool Ativado
@ -109,7 +107,11 @@ namespace AgroBase.Models
{ {
get get
{ {
var P_V = Parametros.First(x => x.Registro == 0x00C8); var P_V = parametros.FirstOrDefault(x => x.Registro == 0x00C8);
if (P_V == null)
{
return -1;
}
double tensao = ConvertByteArrayToFloat(P_V.Valor); double tensao = ConvertByteArrayToFloat(P_V.Valor);
return tensao; return tensao;
} }
@ -118,7 +120,11 @@ namespace AgroBase.Models
{ {
get get
{ {
var P_T = Parametros.First(x => x.Registro == 0x00d2); var P_T = parametros.FirstOrDefault(x => x.Registro == 0x00d2);
if (P_T == null)
{
return -1;
}
double temperatura = ConvertByteArrayToFloat(P_T.Valor); double temperatura = ConvertByteArrayToFloat(P_T.Valor);
return temperatura; return temperatura;
} }
@ -127,12 +133,16 @@ namespace AgroBase.Models
{ {
get get
{ {
var P_A = Parametros.First(x => x.Registro == 0x0096); var P_A = parametros.FirstOrDefault(x => x.Registro == 0x0096);
if (P_A == null)
{
return -1;
}
double corrente = ConvertByteArrayToFloat(P_A.Valor); double corrente = ConvertByteArrayToFloat(P_A.Valor);
return corrente; return corrente;
} }
} }
public List<BLDParametrosRequisitar> parametros { get; set; } public List<Services.BLD300RService.BLDParametrosRequisitar> parametros { get; set; }

View File

@ -234,5 +234,13 @@ namespace AgroBase.Models
ArquivoModelo3D = 14, ArquivoModelo3D = 14,
} }
public enum TipoConexao
{
Desconhecido = 0,
PortaCOM = 1,
USB = 2,
Ethernet = 3,
}
} }
} }

View File

@ -58,6 +58,7 @@ namespace AgroBase.Models
public bool AguardaResposta { get; set; } = false; public bool AguardaResposta { get; set; } = false;
public int TimeoutResposta { get; set; } = 1000; public int TimeoutResposta { get; set; } = 1000;
public bool Enviado { get; set; } = false; public bool Enviado { get; set; } = false;
public bool ErroEnvio { get; set; } = false;
} }
public enum ModosOperacao public enum ModosOperacao

View File

@ -109,7 +109,7 @@ namespace AgroBase.Services
Chave = "Enabled", Chave = "Enabled",
Descricao = "Verifica/Define o status do motor", Descricao = "Verifica/Define o status do motor",
Escala = 1, Escala = 1,
LeituraLoop = true, LeituraLoop = false,
LeituraGeral = true, LeituraGeral = true,
N_Registros = 0x0001, N_Registros = 0x0001,
Registro = 0x0066 Registro = 0x0066
@ -119,7 +119,7 @@ namespace AgroBase.Services
Chave = "Breaked", Chave = "Breaked",
Descricao = "Verifica/Define o status do freio do motor", Descricao = "Verifica/Define o status do freio do motor",
Escala = 1, Escala = 1,
LeituraLoop = true, LeituraLoop = false,
LeituraGeral = true, LeituraGeral = true,
N_Registros = 0x0001, N_Registros = 0x0001,
Registro = 0x006A Registro = 0x006A
@ -129,7 +129,7 @@ namespace AgroBase.Services
Chave = "Direction", Chave = "Direction",
Descricao = "Verifica/Define o sentido de giro do motor", Descricao = "Verifica/Define o sentido de giro do motor",
Escala = 1, Escala = 1,
LeituraLoop = true, LeituraLoop = false,
LeituraGeral = true, LeituraGeral = true,
N_Registros = 0x0001, N_Registros = 0x0001,
Registro = 0x006D Registro = 0x006D
@ -259,13 +259,18 @@ namespace AgroBase.Services
var comando = ModbusService.ComandoGetParametro(Addr, Parametro); var comando = ModbusService.ComandoGetParametro(Addr, Parametro);
if (!await EnviarComando(_ethernetService, comando)) bool envioBemSucedido = await EnviarComando(_ethernetService, comando);
if (!envioBemSucedido)
{ {
break; Console.WriteLine($"Falha ao enviar dados para o dispositivo de endereço {Addr}.");
continue;
} }
// Recebe a resposta via Ethernet // Recebe a resposta via Ethernet
var resposta = await _ethernetService.ReceiveDataAsync(7); var resposta = await _ethernetService.ReceiveDataAsync(7);
SerialService.MostrarComandoResposta(T_Code.Bld, comando, resposta);
DecifrarResposta(resposta, Parametro, Addr); DecifrarResposta(resposta, Parametro, Addr);
if (DadosLeitura.Any(x => x.Endereco == Addr && x.Iniciado)) if (DadosLeitura.Any(x => x.Endereco == Addr && x.Iniciado))
@ -308,19 +313,21 @@ namespace AgroBase.Services
{ {
// Envia o comando via Ethernet // Envia o comando via Ethernet
Comando.ErroEnvio = !await EnviarComando(_ethernetService, comando); Comando.ErroEnvio = !await EnviarComando(_ethernetService, comando);
Comando.Enviado = true; Comando.Enviado = !Comando.AguardaResposta;
// Recebe a resposta via Ethernet, independentemente de precisar processá-la ou não // Recebe a resposta via Ethernet, independentemente de precisar processá-la ou não
byte[] resposta = await _ethernetService.ReceiveDataAsync(7, 1000); // Timeout ajustável, aqui 1 segundo byte[] resposta = await _ethernetService.ReceiveDataAsync(7, Comando.TimeoutResposta); // Timeout ajustável, aqui 1 segundo
SerialService.MostrarComandoResposta(T_Code.Bld, comando, resposta);
if (Comando.AguardaResposta) if (Comando.AguardaResposta)
{ {
// Processa a resposta, pois é esperada // Processa a resposta, pois é esperada
bool Respondido = DecifrarResposta(resposta, Comando.Parametro, Comando.Endereco); bool Respondido = DecifrarResposta(resposta, Comando.Parametro, Comando.Endereco);
Comando.Enviado = Respondido;
if (!Respondido) if (!Respondido)
{ {
RegisrarErrosComunicacao(Comando.Endereco, $"Timeout ou erro ao receber resposta. GET={Comando.Get}, Parametro={Comando.Parametro.Chave}, Valor={Comando.Valor}"); RegisrarErrosComunicacao(Comando.Endereco, $"Timeout ou erro ao receber resposta. GET={Comando.Get}, Parametro={Comando.Parametro.Chave}, Valor={Comando.Valor}");
Comando.Enviado = false;
Comando.Momento = DateTime.Now.AddMilliseconds(500); // Retenta após um pequeno intervalo Comando.Momento = DateTime.Now.AddMilliseconds(500); // Retenta após um pequeno intervalo
} }
} }
@ -329,6 +336,8 @@ namespace AgroBase.Services
// Descarte da resposta, pois não era esperada // Descarte da resposta, pois não era esperada
Console.WriteLine($"Resposta descartada para comando que não aguardava resposta."); Console.WriteLine($"Resposta descartada para comando que não aguardava resposta.");
} }
//await Task.Delay(100);
} }
} }
catch (Exception ex) catch (Exception ex)
@ -342,30 +351,27 @@ namespace AgroBase.Services
private static void DefinirDispositivo(List<string> Mod_IDs) private static void DefinirDispositivo(List<string> Mod_IDs)
{ {
if (Iniciado) foreach (var Mod_ID in Mod_IDs)
{ {
foreach (var Mod_ID in Mod_IDs) var Modulo = Variaveis.OperacaoEmAndamento.DispMvd.Dados.Modulos.FirstOrDefault(x => x.Modulo_ID == Mod_ID);
byte Addr = Convert.ToByte(Modulo.MovMotor.Endereco.Replace("0x", ""), 16);
if (DadosLeitura.Any(x => x.Endereco == Addr && !x.Configurado))
{ {
var Modulo = Variaveis.OperacaoEmAndamento.DispMvd.Dados.Modulos.FirstOrDefault(x => x.Modulo_ID == Mod_ID); ConfigurarDriver(Addr);
byte Addr = Convert.ToByte(Modulo.MovMotor.Endereco.Replace("0x", ""), 16); }
if (DadosLeitura.Any(x => x.Endereco == Addr && !x.Configurado)) if (!SerialService.DispositivosMapeados.Any(x => x.Dispositivo == T_Code.Bld && x.Mod_ID == Mod_ID))
{
var leitura = DadosLeitura.FirstOrDefault(x => x.Endereco == Addr);
SerialService.DispositivosMapeados.Add(new SerialService.DispositivoDetalhesModel()
{ {
ConfigurarDriver(Addr); Endereco = _ethernetService != null ? _ethernetService._ipAddress : "N/A",
} Dispositivo = T_Code.Bld,
Erro = leitura.CodigoAlarme > 0,
if (!SerialService.DispositivosMapeados.Any(x => x.Dispositivo == T_Code.Bld && x.Mod_ID == Mod_ID)) Versao = leitura.Versao.ToString(),
{ Mod_ID = Mod_ID,
var leitura = DadosLeitura.FirstOrDefault(x => x.Endereco == Addr); });
SerialService.DispositivosMapeados.Add(new SerialService.DispositivoDetalhesModel()
{
PortaCOM = _ethernetService != null ? _ethernetService._ipAddress : "N/A",
Dispositivo = T_Code.Bld,
Erro = leitura.CodigoAlarme > 0,
Versao = leitura.Versao.ToString(),
Mod_ID = Mod_ID,
});
}
} }
} }
} }
@ -399,20 +405,36 @@ namespace AgroBase.Services
DadosLeitura.Add(Leitura); DadosLeitura.Add(Leitura);
} }
BLDParametrosRequisitar _parametro = Leitura.parametros.FirstOrDefault(x => x.Registro == Parametro.Registro);
if (_parametro == null)
{
_parametro = new BLDParametrosRequisitar()
{
Registro = Parametro.Registro,
Escala = Parametro.Escala,
Valor = null
};
Leitura.parametros.Add(_parametro);
}
if (resposta.Length > 3) if (resposta.Length > 3)
{ {
if (Parametros.Any(x => 0x03 == resposta[1])) // GET
if (resposta[1] == 0x03)
{ {
int num_registros = resposta[2]; int num_registros = resposta[2];
byte[] bytes_resposta = resposta.Skip(3).Take(num_registros).ToArray(); byte[] bytes_resposta = resposta.Skip(3).Take(num_registros).ToArray();
Parametro.Valor = bytes_resposta; Parametro.Valor = bytes_resposta;
_parametro.Valor = bytes_resposta;
Leitura.UltimoComandoRecebido = DateTime.Now; Leitura.UltimoComandoRecebido = DateTime.Now;
return true; return true;
} }
else if (Parametros.Any(x => 0x06 == resposta[1])) // SET
else if (resposta[1] == 0x06)
{ {
Parametro.Valor = resposta.Skip(4).Take(2).ToArray(); Parametro.Valor = resposta.Skip(4).Take(2).ToArray();
_parametro.Valor = resposta.Skip(4).Take(2).ToArray();
Leitura.UltimoComandoRecebido = DateTime.Now; Leitura.UltimoComandoRecebido = DateTime.Now;
return true; return true;
} }
@ -503,7 +525,7 @@ namespace AgroBase.Services
AguardaResposta = true, AguardaResposta = true,
Parametro = Parametro, Parametro = Parametro,
Get = true, Get = true,
TimeoutResposta = 300 TimeoutResposta = 500
}; };
AdicionarComandoNaFila(Comando); AdicionarComandoNaFila(Comando);
} }

View File

@ -83,9 +83,9 @@ namespace AgroBase.Comum
var DispositivosTipo = SerialService.DispositivosMapeados.Where(x => x.Dispositivo == Dispositivo).ToList(); var DispositivosTipo = SerialService.DispositivosMapeados.Where(x => x.Dispositivo == Dispositivo).ToList();
for (int i = 0; i < DispositivosTipo.Count(); i++) for (int i = 0; i < DispositivosTipo.Count(); i++)
{ {
if (!cmbPorta.Items.Contains(DispositivosTipo[i].PortaCOM)) if (!cmbPorta.Items.Contains(DispositivosTipo[i].Endereco))
{ {
string PortaCom = DispositivosTipo[i].PortaCOM; string PortaCom = DispositivosTipo[i].Endereco;
var _Porta = new SerialPort() { PortName = PortaCom, BaudRate = 115200 }; var _Porta = new SerialPort() { PortName = PortaCom, BaudRate = 115200 };
try try
{ {

View File

@ -118,6 +118,7 @@ public class EthernetService
{ {
try try
{ {
await FlushBufferAsync(); // Limpa o buffer antes de enviar
await _networkStream.WriteAsync(data, 0, data.Length); await _networkStream.WriteAsync(data, 0, data.Length);
await _networkStream.FlushAsync(); await _networkStream.FlushAsync();
return true; return true;
@ -138,7 +139,6 @@ public class EthernetService
public async Task<byte[]> ReceiveDataAsync(int expectedLength, int timeoutMilliseconds = 1000) public async Task<byte[]> ReceiveDataAsync(int expectedLength, int timeoutMilliseconds = 1000)
{ {
var buffer = new byte[expectedLength]; var buffer = new byte[expectedLength];
try try
{ {
var readTask = _networkStream.ReadAsync(buffer, 0, expectedLength); // Tarefa de leitura sem o token var readTask = _networkStream.ReadAsync(buffer, 0, expectedLength); // Tarefa de leitura sem o token
@ -165,6 +165,26 @@ public class EthernetService
} }
} }
public async Task FlushBufferAsync()
{
try
{
if (_networkStream.DataAvailable) // Verifica se há dados pendentes no buffer
{
var tempBuffer = new byte[1024]; // Buffer temporário para leitura
while (_networkStream.DataAvailable)
{
await _networkStream.ReadAsync(tempBuffer, 0, tempBuffer.Length);
}
Console.WriteLine("Buffer limpo.");
}
}
catch (Exception ex)
{
Console.WriteLine($"Erro ao limpar buffer: {ex.Message}");
}
}
// Método para verificar a conexão (pode ser usado para um "heartbeat") // Método para verificar a conexão (pode ser usado para um "heartbeat")
public async Task<bool> CheckConnectionAsync() public async Task<bool> CheckConnectionAsync()
{ {

View File

@ -67,7 +67,7 @@ namespace AgroBase.Services
{ {
SerialService.DispositivosMapeados.Add(new SerialService.DispositivoDetalhesModel() SerialService.DispositivosMapeados.Add(new SerialService.DispositivoDetalhesModel()
{ {
PortaCOM = PortaGPS.PortName, Endereco = PortaGPS.PortName,
Dispositivo = T_Code.Gps, Dispositivo = T_Code.Gps,
Erro = !Iniciado, Erro = !Iniciado,
Versao = "1", Versao = "1",

View File

@ -195,7 +195,7 @@ namespace AgroBase.Services
{ {
SerialService.DispositivosMapeados.Add(new SerialService.DispositivoDetalhesModel() SerialService.DispositivosMapeados.Add(new SerialService.DispositivoDetalhesModel()
{ {
PortaCOM = "USB", Endereco = "USB",
Dispositivo = T_Code.Knt, Dispositivo = T_Code.Knt,
Erro = !Iniciado, Erro = !Iniciado,
Versao = "1", Versao = "1",

View File

@ -215,7 +215,7 @@ namespace AgroBase.Services
{ {
SerialService.DispositivosMapeados.Add(new SerialService.DispositivoDetalhesModel() SerialService.DispositivosMapeados.Add(new SerialService.DispositivoDetalhesModel()
{ {
PortaCOM = _PortaLoRa.PortName, Endereco = _PortaLoRa.PortName,
Dispositivo = T_Code.Lra, Dispositivo = T_Code.Lra,
Erro = !Iniciado, Erro = !Iniciado,
Versao = "220" Versao = "220"

View File

@ -4,7 +4,6 @@ using System.Collections;
using System.Collections.Generic; using System.Collections.Generic;
using System.IO; using System.IO;
using System.Linq; using System.Linq;
using System.Threading;
using System.Threading.Tasks; using System.Threading.Tasks;
using System.Windows.Forms; using System.Windows.Forms;
using static AgroBase.Models.Enums; using static AgroBase.Models.Enums;
@ -98,21 +97,20 @@ namespace AgroBase.Services
DataSended = Convert.ToByte("43"); DataSended = Convert.ToByte("43");
// Envia comando relevante para verificar o dispositivo // Envia comando relevante para verificar o dispositivo
bool envioBemSucedido = await SendRelevantData(Addr, QueryCommand[DataSended]); (bool envioBemSucedido, byte[] comando) = await SendRelevantData(Addr, QueryCommand[DataSended]);
if (!envioBemSucedido) if (!envioBemSucedido)
{ {
Console.WriteLine($"Falha ao enviar dados para o dispositivo de endereço {Addr}."); Console.WriteLine($"Falha ao enviar dados para o dispositivo de endereço {Addr}.");
continue; continue;
} }
var resposta = await _ethernetService.ReceiveDataAsync(11);
await ProcessarDadosRecebidosAsync(); SerialService.MostrarComandoResposta(T_Code.Mks, comando, resposta);
DecifrarResposta(resposta);
// Aguarda resposta do dispositivo com controle de timeout if (DadosLeitura.Any(x => x.Endereco == Addr && x.Iniciado))
bool respondido = DadosLeitura.Any(x => x.Endereco == Addr && x.Iniciado);
if (respondido)
{ {
Mod_IDs.Add(Modulo.Modulo_ID); Mod_IDs.Add(Modulo.Modulo_ID);
} }
@ -172,7 +170,7 @@ namespace AgroBase.Services
{ {
SerialService.DispositivosMapeados.Add(new SerialService.DispositivoDetalhesModel() SerialService.DispositivosMapeados.Add(new SerialService.DispositivoDetalhesModel()
{ {
PortaCOM = _ethernetService != null ? _ethernetService._ipAddress : "N/A", Endereco = _ethernetService != null ? _ethernetService._ipAddress : "N/A",
Dispositivo = T_Code.Mks, Dispositivo = T_Code.Mks,
Erro = (Leitura.Mensagem ?? "") != "", Erro = (Leitura.Mensagem ?? "") != "",
Versao = (Leitura.FV ?? "").ToString(), Versao = (Leitura.FV ?? "").ToString(),
@ -202,12 +200,12 @@ namespace AgroBase.Services
return; return;
} }
TaxaAmostragem = Referenciando ? 200 : 1000; TaxaAmostragem = 1000;
if (Referenciando) if (Referenciando)
{ {
AdicionarComandoNaFila(MontarComandoRequisicaoPulsos(AddrRef)); //AdicionarComandoNaFila(MontarComandoRequisicaoPulsos(AddrRef));
AdicionarComandoNaFila(MontarComandoRequisicaoIO(AddrRef)); //AdicionarComandoNaFila(MontarComandoRequisicaoIO(AddrRef));
} }
else if (Variaveis.OperacaoEmAndamento.DispMvd != null) else if (Variaveis.OperacaoEmAndamento.DispMvd != null)
{ {
@ -511,74 +509,67 @@ namespace AgroBase.Services
public static async Task EnviarComandoControle(MKS057ComandoModel Comando) public static async Task EnviarComandoControle(MKS057ComandoModel Comando)
{ {
byte Addr = Comando.Endereco;
// Configura parâmetros de controle localmente antes de enviar o comando
if (!Comando.Get)
{
if (!_Angulo.ContainsKey(Addr))
{
_Angulo.Add(Addr, "0");
}
if (!_Velocidade.ContainsKey(Addr))
{
_Velocidade.Add(Addr, "0");
}
if (!_Sentido.ContainsKey(Addr))
{
_Sentido.Add(Addr, Comando._Sentido);
}
_Angulo[Addr] = ConverterAnguloParaValor(Comando.Angulo).ToString();
_Velocidade[Addr] = Comando.Velocidade.ToString();
_ModoControle = Comando.ModoControle;
_Sentido[Addr] = Comando._Sentido;
}
DataSended = Comando.Comando;
// Envia o comando via Ethernet
bool sucessoEnvio = await SendRelevantData(Addr, QueryCommand[DataSended]);
Comando.Enviado = sucessoEnvio;
if (!sucessoEnvio)
{
RegisrarErrosComunicacao(Addr, "Erro ao enviar dados via Ethernet");
return;
}
await ProcessarDadosRecebidosAsync();
Respondido = !Comando.AguardaResposta;
// Se o comando não aguarda resposta, finaliza aqui
if (Respondido)
{
return;
}
// Configura o token de cancelamento para controlar o timeout de resposta
var cts = new CancellationTokenSource();
cts.CancelAfter(Comando.TimeoutResposta);
try try
{ {
while (!Respondido && !cts.Token.IsCancellationRequested) byte Addr = Comando.Endereco;
// Configura parâmetros de controle localmente antes de enviar o comando
if (!Comando.Get)
{ {
await Task.Delay(100, cts.Token); if (!_Angulo.ContainsKey(Addr))
{
_Angulo.Add(Addr, "0");
}
if (!_Velocidade.ContainsKey(Addr))
{
_Velocidade.Add(Addr, "0");
}
if (!_Sentido.ContainsKey(Addr))
{
_Sentido.Add(Addr, Comando._Sentido);
}
_Angulo[Addr] = ConverterAnguloParaValor(Comando.Angulo).ToString();
_Velocidade[Addr] = Comando.Velocidade.ToString();
_ModoControle = Comando.ModoControle;
_Sentido[Addr] = Comando._Sentido;
} }
if (!Respondido) DataSended = Comando.Comando;
// Envia o comando via Ethernet
(bool sucessoEnvio, byte[] comando) = await SendRelevantData(Addr, QueryCommand[DataSended]);
Comando.ErroEnvio = !sucessoEnvio;
Comando.Enviado = !Comando.AguardaResposta;
// Recebe a resposta via Ethernet, independentemente de precisar processá-la ou não
byte[] resposta = await _ethernetService.ReceiveDataAsync(7, Comando.TimeoutResposta); // Timeout ajustável, aqui 1 segundo
SerialService.MostrarComandoResposta(T_Code.Bld, comando, resposta);
if (Comando.AguardaResposta)
{ {
RegisrarErrosComunicacao(Addr, $"Timeout ao receber resposta. GET={Comando.Get}, Parametro={Comando.Comando}"); // Processa a resposta, pois é esperada
Comando.Enviado = false; bool Respondido = DecifrarResposta(resposta);
Comando.Momento = DateTime.Now.AddMilliseconds(500); Comando.Enviado = Respondido;
if (!Respondido)
{
RegisrarErrosComunicacao(Addr, $"Timeout ao receber resposta. GET={Comando.Get}, Parametro={Comando.Comando}");
Comando.Momento = DateTime.Now.AddMilliseconds(500);
}
}
else
{
// Descarte da resposta, pois não era esperada
Console.WriteLine($"Resposta descartada para comando que não aguardava resposta.");
} }
} }
catch (TaskCanceledException) catch (Exception ex)
{ {
RegisrarErrosComunicacao(Addr, "Timeout atingido durante a espera pela resposta do comando"); // Log de erro
RegisrarErrosComunicacao(Comando.Endereco, $"Erro ao enviar comando: {ex.Message}");
Comando.Enviado = false; Comando.Enviado = false;
Comando.Momento = DateTime.Now.AddMilliseconds(500);
} }
} }
@ -661,56 +652,41 @@ namespace AgroBase.Services
#region METODOS PRINCIPAIS #region METODOS PRINCIPAIS
private static async Task<bool> WriteByteToEthernetAsync(byte[] data, byte start, byte length) private static async Task<(bool, byte[])> WriteByteToEthernetAsync(byte[] data, byte start, byte length)
{ {
byte Addr = data[1]; byte Addr = data[1];
if (_ethernetService == null || !_ethernetService.IsConnected) if (_ethernetService == null || !_ethernetService.IsConnected)
{ {
RegisrarErrosComunicacao(Addr, "Conexão Ethernet não está definida ou não está conectada"); RegisrarErrosComunicacao(Addr, "Conexão Ethernet não está definida ou não está conectada");
return false; return (false, data);
} }
try try
{ {
bool sucesso = await _ethernetService.SendDataAsync(data.Skip(start).Take(length).ToArray()); bool sucesso = await _ethernetService.SendDataAsync(data.Skip(start).Take(length).ToArray());
if (sucesso) return (sucesso, data);
{
txDisplay(data);
}
else
{
RegisrarErrosComunicacao(Addr, "Erro ao enviar dados via Ethernet");
}
return sucesso;
} }
catch catch
{ {
RegisrarErrosComunicacao(Addr, "Erro ao enviar dados para o dispositivo via Ethernet"); RegisrarErrosComunicacao(Addr, "Erro ao enviar dados para o dispositivo via Ethernet");
return false; return (false, data);
} }
} }
private static async Task ProcessarDadosRecebidosAsync() private static bool DecifrarResposta(byte[] resposta)
{ {
if (_ethernetService != null && _ethernetService.IsConnected) SerialBuffer_RX = new byte[11];
{
SerialBuffer_RX = new byte[11];
var resposta = await _ethernetService.ReceiveDataAsync(SerialBuffer_RX.Length, 10000);
Console.WriteLine("resposta: " + resposta?.ToString()); if (resposta != null && resposta.Length > 0 && resposta.Length <= SerialBuffer_RX.Length)
if (resposta != null && resposta.Length > 0 && resposta.Length <= SerialBuffer_RX.Length)
{
SerialBuffer_RX = resposta; // Armazena a resposta recebida
Data_Number = resposta.Length;
Text_display();
}
}
else
{ {
Console.WriteLine("Ethernet não está conectada ou o serviço não está definido."); SerialBuffer_RX = resposta; // Armazena a resposta recebida
Data_Number = resposta.Length;
Text_display();
return true;
} }
return false;
} }
private static void Text_display() private static void Text_display()
@ -1376,7 +1352,7 @@ namespace AgroBase.Services
} }
private static async Task<bool> SendRelevantData(byte Addr, int data) // Verifica o tipo de dados e envia private static async Task<(bool, byte[])> SendRelevantData(byte Addr, int data) // Verifica o tipo de dados e envia
{ {
ushort SpeedText; ushort SpeedText;
ushort SpeedText2; ushort SpeedText2;
@ -2305,7 +2281,7 @@ namespace AgroBase.Services
catch catch
{ {
MessageBox.Show("Erro ao gravar parametros de limite"); MessageBox.Show("Erro ao gravar parametros de limite");
return false; return (false, Buffer);
} }
} }
@ -2320,10 +2296,10 @@ namespace AgroBase.Services
else else
{ {
MessageBox.Show("Endereço selecionado é inválido"); MessageBox.Show("Endereço selecionado é inválido");
return false; return (false, Buffer);
} }
return true; return (true, Buffer);
} }
#endregion #endregion

View File

@ -85,7 +85,7 @@ namespace AgroBase.Services
{ {
SerialService.DispositivosMapeados.Add(new SerialService.DispositivoDetalhesModel() SerialService.DispositivosMapeados.Add(new SerialService.DispositivoDetalhesModel()
{ {
PortaCOM = ModbusService._PortaModbus.PortName, Endereco = ModbusService._PortaModbus.PortName,
Dispositivo = T_Code.Pzm, Dispositivo = T_Code.Pzm,
Erro = !Iniciado, Erro = !Iniciado,
Versao = "17" Versao = "17"

View File

@ -1,5 +1,6 @@
using AgroBase.Forms; using AgroBase.Forms;
using AgroBase.Models; using AgroBase.Models;
using OpenCvSharp.Internal.Vectors;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.IO.Ports; using System.IO.Ports;
@ -29,7 +30,29 @@ namespace AgroBase.Services
public class DispositivoDetalhesModel public class DispositivoDetalhesModel
{ {
public string PortaCOM { get; set; } public string Endereco { get; set; }
public TipoConexao Tipo
{
get
{
if (Endereco.Contains("USB"))
{
return TipoConexao.USB;
}
else if (Endereco.Contains("COM"))
{
return TipoConexao.PortaCOM;
}
else if (Endereco.Contains("."))
{
return TipoConexao.Ethernet;
}
else
{
return TipoConexao.Desconhecido;
}
}
}
public T_Code Dispositivo { get; set; } public T_Code Dispositivo { get; set; }
public bool Erro { get; set; } public bool Erro { get; set; }
public string Versao { get; set; } public string Versao { get; set; }
@ -76,7 +99,7 @@ namespace AgroBase.Services
} }
else else
{ {
IDispositivosService dispositivoService = Variaveis.DispositivosConectados.FirstOrDefault(x => x.Dispositivo == Dispositivo && x._Porta.PortName == PortaCOM); IDispositivosService dispositivoService = Variaveis.DispositivosConectados.FirstOrDefault(x => x.Dispositivo == Dispositivo && x._Porta.PortName == Endereco);
if (dispositivoService != null) if (dispositivoService != null)
{ {
if (!dispositivoService._Porta.IsOpen) if (!dispositivoService._Porta.IsOpen)
@ -263,7 +286,7 @@ namespace AgroBase.Services
var dispositivosMapeados = DispositivosMapeados.ToList(); var dispositivosMapeados = DispositivosMapeados.ToList();
var Portas = SerialPort.GetPortNames(); var Portas = SerialPort.GetPortNames();
var PortasNaoMapeadas = Portas.Where(x => !dispositivosMapeados.Select(y => y.PortaCOM).Contains(x)).ToList(); var PortasNaoMapeadas = Portas.Where(x => !dispositivosMapeados.Select(y => y.Endereco).Contains(x)).ToList();
List<string> PortasSemResposta = new List<string>(); List<string> PortasSemResposta = new List<string>();
for (int i = 0; i < PortasNaoMapeadas.Count(); i++) for (int i = 0; i < PortasNaoMapeadas.Count(); i++)
@ -385,7 +408,7 @@ namespace AgroBase.Services
await ProcurarDispositivosEthernet(); await ProcurarDispositivosEthernet();
} }
var DispositivosRemovidos = dispositivosMapeados.Where(x => x.PortaCOM != "USB" && !Portas.Contains(x.PortaCOM)).ToList(); var DispositivosRemovidos = dispositivosMapeados.Where(x => x.Tipo == TipoConexao.PortaCOM && !Portas.Contains(x.Endereco)).ToList();
foreach (var Dispositivo in DispositivosRemovidos) foreach (var Dispositivo in DispositivosRemovidos)
{ {
DispositivosMapeados.Remove(Dispositivo); DispositivosMapeados.Remove(Dispositivo);
@ -465,7 +488,7 @@ namespace AgroBase.Services
{ {
DispositivosMapeados.Add(new DispositivoDetalhesModel() DispositivosMapeados.Add(new DispositivoDetalhesModel()
{ {
PortaCOM = Porta.PortName, Endereco = Porta.PortName,
Dispositivo = Dispositivo, Dispositivo = Dispositivo,
Erro = Verificacao == F_Code.Err, Erro = Verificacao == F_Code.Err,
Versao = Versao, Versao = Versao,
@ -590,7 +613,7 @@ namespace AgroBase.Services
return false; return false;
} }
if (DispositivosMapeados.Any(x => x.Dispositivo == T_Code.Mvd) && porta.PortName != DispositivosMapeados.First(x => x.Dispositivo == T_Code.Mvd).PortaCOM) if (DispositivosMapeados.Any(x => x.Dispositivo == T_Code.Mvd) && porta.PortName != DispositivosMapeados.First(x => x.Dispositivo == T_Code.Mvd).Endereco)
{ {
return false; return false;
} }
@ -888,5 +911,14 @@ namespace AgroBase.Services
} }
} }
public static void MostrarComandoResposta(T_Code tipo, byte[] comando, byte[] resposta)
{
bool showCommands = true;
if (showCommands)
{
Console.WriteLine(tipo.ToString() + " - TX: " + string.Join(" ", comando.Select(x => x.ToString("x"))) + ", RX: " + string.Join(" ", (resposta != null ? resposta : new byte[] { }).Select(x => x.ToString("x"))));
}
}
} }
} }

View File

@ -59,7 +59,7 @@ namespace AgroBase.Services
{ {
SerialService.DispositivosMapeados.Add(new SerialService.DispositivoDetalhesModel() SerialService.DispositivosMapeados.Add(new SerialService.DispositivoDetalhesModel()
{ {
PortaCOM = ModbusService._PortaModbus.PortName, Endereco = ModbusService._PortaModbus.PortName,
Dispositivo = T_Code.A05, Dispositivo = T_Code.A05,
Erro = !Iniciado, Erro = !Iniciado,
Versao = "1" Versao = "1"

View File

@ -100,7 +100,7 @@ namespace AgroBase.Services
{ {
SerialService.DispositivosMapeados.Add(new SerialService.DispositivoDetalhesModel() SerialService.DispositivosMapeados.Add(new SerialService.DispositivoDetalhesModel()
{ {
PortaCOM = ModbusService._PortaModbus.PortName, Endereco = ModbusService._PortaModbus.PortName,
Dispositivo = T_Code.Wit, Dispositivo = T_Code.Wit,
Erro = !Iniciado, Erro = !Iniciado,
Versao = DadosLeitura.Versao, Versao = DadosLeitura.Versao,

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

View File

@ -25,7 +25,7 @@
<meta name="viewport" content="width=device-width, <meta name="viewport" content="width=device-width,
initial-scale=1.0, maximum-scale=1.0, user-scalable=no" /> initial-scale=1.0, maximum-scale=1.0, user-scalable=no" />
<style> <style>
#map_bb24316082a755985574b8eccdf68f8d { #map_fa1fb12b82d67d7b576b4a6c72021b43 {
position: relative; position: relative;
width: 100.0%; width: 100.0%;
height: 100.0%; height: 100.0%;
@ -39,14 +39,14 @@
<body> <body>
<div class="folium-map" id="map_bb24316082a755985574b8eccdf68f8d" ></div> <div class="folium-map" id="map_fa1fb12b82d67d7b576b4a6c72021b43" ></div>
</body> </body>
<script> <script>
var map_bb24316082a755985574b8eccdf68f8d = L.map( var map_fa1fb12b82d67d7b576b4a6c72021b43 = L.map(
"map_bb24316082a755985574b8eccdf68f8d", "map_fa1fb12b82d67d7b576b4a6c72021b43",
{ {
center: [0.0, 0.0], center: [0.0, 0.0],
crs: L.CRS.EPSG3857, crs: L.CRS.EPSG3857,
@ -60,13 +60,13 @@
var tile_layer_ba7df28846484ea0aeeca5cdafc6169c = L.tileLayer( var tile_layer_fc2a48162ee97dadb749ec5c9d4585d1 = L.tileLayer(
"https://tile.openstreetmap.org/{z}/{x}/{y}.png", "https://tile.openstreetmap.org/{z}/{x}/{y}.png",
{"attribution": "\u0026copy; \u003ca href=\"https://www.openstreetmap.org/copyright\"\u003eOpenStreetMap\u003c/a\u003e contributors", "detectRetina": false, "maxNativeZoom": 19, "maxZoom": 19, "minZoom": 0, "noWrap": false, "opacity": 1, "subdomains": "abc", "tms": false} {"attribution": "\u0026copy; \u003ca href=\"https://www.openstreetmap.org/copyright\"\u003eOpenStreetMap\u003c/a\u003e contributors", "detectRetina": false, "maxNativeZoom": 19, "maxZoom": 19, "minZoom": 0, "noWrap": false, "opacity": 1, "subdomains": "abc", "tms": false}
); );
tile_layer_ba7df28846484ea0aeeca5cdafc6169c.addTo(map_bb24316082a755985574b8eccdf68f8d); tile_layer_fc2a48162ee97dadb749ec5c9d4585d1.addTo(map_fa1fb12b82d67d7b576b4a6c72021b43);
</script> </script>
@ -87,7 +87,7 @@
} }
trajeto_json_add({"features": []}); trajeto_json_add({"features": []});
trajeto_json.addTo(map_bb24316082a755985574b8eccdf68f8d); trajeto_json.addTo(map_fa1fb12b82d67d7b576b4a6c72021b43);
function adicionarGeometria(novaGeometria) { function adicionarGeometria(novaGeometria) {
trajeto_json.addData(novaGeometria); trajeto_json.addData(novaGeometria);
@ -145,7 +145,7 @@
var marcadorDinamico = L.marker([0, 0], { var marcadorDinamico = L.marker([0, 0], {
icon: customIcon icon: customIcon
}).addTo(map_bb24316082a755985574b8eccdf68f8d); }).addTo(map_fa1fb12b82d67d7b576b4a6c72021b43);
// Conectar ao broker MQTT // Conectar ao broker MQTT
const client = mqtt.connect('ws://localhost:9001'); // Use wss para conexão segura const client = mqtt.connect('ws://localhost:9001'); // Use wss para conexão segura
@ -183,7 +183,7 @@
marcadorDinamico.setRotationAngle(angulo); marcadorDinamico.setRotationAngle(angulo);
adicionarCoordenada("Tj", [novaLongitude, novaLatitude]); adicionarCoordenada("Tj", [novaLongitude, novaLatitude]);
map_bb24316082a755985574b8eccdf68f8d.setView(novaPosicao, map_bb24316082a755985574b8eccdf68f8d.getZoom()); map_fa1fb12b82d67d7b576b4a6c72021b43.setView(novaPosicao, map_fa1fb12b82d67d7b576b4a6c72021b43.getZoom());
}); });
function calcularOrientacao(P1latitude, P1longitude, P2latitude, P2longitude) { function calcularOrientacao(P1latitude, P1longitude, P2latitude, P2longitude) {