ajustes na inicializacao do atuador e calibragem inicial
This commit is contained in:
parent
8eee8e5012
commit
f5e8ba1fef
|
|
@ -1,5 +1,6 @@
|
||||||
using AgroBase.Services;
|
using AgroBase.Services;
|
||||||
using AgroBase.Services.Operadores;
|
using AgroBase.Services.Operadores;
|
||||||
|
using Newtonsoft.Json;
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Diagnostics;
|
using System.Diagnostics;
|
||||||
|
|
@ -66,6 +67,7 @@ namespace AgroBase.Models.Modules
|
||||||
public AtuadorMensagemJsonModel DadosLeitura { get; set; } = new AtuadorMensagemJsonModel();
|
public AtuadorMensagemJsonModel DadosLeitura { get; set; } = new AtuadorMensagemJsonModel();
|
||||||
public AtuHandler _AtuHandler = new AtuHandler();
|
public AtuHandler _AtuHandler = new AtuHandler();
|
||||||
|
|
||||||
|
[JsonIgnore]
|
||||||
public AtuadorBombaModel BombaPressurizadora
|
public AtuadorBombaModel BombaPressurizadora
|
||||||
{
|
{
|
||||||
get
|
get
|
||||||
|
|
@ -74,6 +76,7 @@ namespace AgroBase.Models.Modules
|
||||||
return Bomba;
|
return Bomba;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
[JsonIgnore]
|
||||||
public AtuadorBombaModel AgitadorDeCalda
|
public AtuadorBombaModel AgitadorDeCalda
|
||||||
{
|
{
|
||||||
get
|
get
|
||||||
|
|
@ -83,6 +86,7 @@ namespace AgroBase.Models.Modules
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[JsonIgnore]
|
||||||
public SensorModel SensorMassaReservatorio
|
public SensorModel SensorMassaReservatorio
|
||||||
{
|
{
|
||||||
get
|
get
|
||||||
|
|
@ -91,6 +95,7 @@ namespace AgroBase.Models.Modules
|
||||||
return sMAS;
|
return sMAS;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
[JsonIgnore]
|
||||||
private SensorModel SensorAnguloBarraEsquerda
|
private SensorModel SensorAnguloBarraEsquerda
|
||||||
{
|
{
|
||||||
get
|
get
|
||||||
|
|
@ -99,6 +104,7 @@ namespace AgroBase.Models.Modules
|
||||||
return sMAG;
|
return sMAG;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
[JsonIgnore]
|
||||||
private SensorModel SensorAnguloBarraDireita
|
private SensorModel SensorAnguloBarraDireita
|
||||||
{
|
{
|
||||||
get
|
get
|
||||||
|
|
@ -112,6 +118,7 @@ namespace AgroBase.Models.Modules
|
||||||
|
|
||||||
#region VAZAO
|
#region VAZAO
|
||||||
|
|
||||||
|
[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");
|
||||||
|
|
||||||
public double VazaoMaximaSensor_LMin { get; set; } = 20.0;
|
public double VazaoMaximaSensor_LMin { get; set; } = 20.0;
|
||||||
|
|
@ -164,6 +171,8 @@ namespace AgroBase.Models.Modules
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
#region PRESSAO
|
#region PRESSAO
|
||||||
|
|
||||||
|
[JsonIgnore]
|
||||||
private SensorModel SensorPressaoLinha
|
private SensorModel SensorPressaoLinha
|
||||||
{
|
{
|
||||||
get
|
get
|
||||||
|
|
@ -1004,8 +1013,8 @@ namespace AgroBase.Models.Modules
|
||||||
Descricao = "Angulo Barra Esquerda",
|
Descricao = "Angulo Barra Esquerda",
|
||||||
ID_Num = 41,
|
ID_Num = 41,
|
||||||
Componente = S_Code.sMAG,
|
Componente = S_Code.sMAG,
|
||||||
Aferir = true,
|
Aferir = false,
|
||||||
Mandatorio = true,
|
Mandatorio = false,
|
||||||
Funcoes = new List<FuncoesPinout>()
|
Funcoes = new List<FuncoesPinout>()
|
||||||
{
|
{
|
||||||
FuncoesPinout.I2C,
|
FuncoesPinout.I2C,
|
||||||
|
|
@ -1059,8 +1068,8 @@ namespace AgroBase.Models.Modules
|
||||||
Descricao = "Angulo Barra Direita",
|
Descricao = "Angulo Barra Direita",
|
||||||
ID_Num = 42,
|
ID_Num = 42,
|
||||||
Componente = S_Code.sMAG,
|
Componente = S_Code.sMAG,
|
||||||
Aferir = true,
|
Aferir = false,
|
||||||
Mandatorio = true,
|
Mandatorio = false,
|
||||||
Funcoes = new List<FuncoesPinout>()
|
Funcoes = new List<FuncoesPinout>()
|
||||||
{
|
{
|
||||||
FuncoesPinout.I2C,
|
FuncoesPinout.I2C,
|
||||||
|
|
@ -1311,6 +1320,7 @@ namespace AgroBase.Models.Modules
|
||||||
Dados.BombasPressurizadoras.ForEach(x => x.Funcoes = x.Funcoes.Distinct().ToList());
|
Dados.BombasPressurizadoras.ForEach(x => x.Funcoes = x.Funcoes.Distinct().ToList());
|
||||||
|
|
||||||
ReiniciarLeituras(Dados);
|
ReiniciarLeituras(Dados);
|
||||||
|
PrepararAtuadorParaOperacao(Dados);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void ReiniciarLeituras(AtuadorModel Dados)
|
public void ReiniciarLeituras(AtuadorModel Dados)
|
||||||
|
|
@ -1376,6 +1386,34 @@ namespace AgroBase.Models.Modules
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void PrepararAtuadorParaOperacao(AtuadorModel Dados)
|
||||||
|
{
|
||||||
|
var dadosAtuador = Dados;
|
||||||
|
var controle = Variaveis.OperacaoEmAndamento.Parametros?.Controle;
|
||||||
|
|
||||||
|
if (dadosAtuador == null || controle == null)
|
||||||
|
return;
|
||||||
|
|
||||||
|
var bomba = dadosAtuador.BombaPressurizadora;
|
||||||
|
|
||||||
|
if (bomba != null)
|
||||||
|
{
|
||||||
|
bomba.ComandoAtuar = false;
|
||||||
|
bomba.PotenciaSP = 100;
|
||||||
|
bomba.PressaoSP = controle.AtuPressaoLinha;
|
||||||
|
bomba.Controle.Modo = controle.AtuModoControle;
|
||||||
|
}
|
||||||
|
|
||||||
|
var agitador = dadosAtuador.AgitadorDeCalda;
|
||||||
|
|
||||||
|
if (agitador != null)
|
||||||
|
{
|
||||||
|
agitador.ComandoAtuar = false;
|
||||||
|
agitador.PotenciaSP = 0;
|
||||||
|
agitador.PressaoSP = -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public async Task<bool> VerificaDispositivoConectado()
|
public async Task<bool> VerificaDispositivoConectado()
|
||||||
{
|
{
|
||||||
if (!CanManager.CanService.IsConnected) return false;
|
if (!CanManager.CanService.IsConnected) return false;
|
||||||
|
|
@ -1850,109 +1888,47 @@ namespace AgroBase.Models.Modules
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void EnviarComandoFisicoBico(
|
private void EnviarComandoFisicoBico(AtuadorBicoModel bico, bool status, double angulo)
|
||||||
AtuadorBicoModel bico,
|
|
||||||
bool status,
|
|
||||||
double angulo)
|
|
||||||
{
|
{
|
||||||
var dispAtu =
|
var dispAtu = Variaveis.OperacaoEmAndamento?.DispAtu;
|
||||||
Variaveis.OperacaoEmAndamento?.DispAtu;
|
|
||||||
|
|
||||||
if (
|
if (dispAtu?.Dados?.Conectado != true || bico == null)
|
||||||
dispAtu?.Dados?.Conectado != true ||
|
|
||||||
bico == null
|
|
||||||
)
|
|
||||||
{
|
|
||||||
return;
|
return;
|
||||||
}
|
|
||||||
|
|
||||||
byte anguloByte =
|
byte anguloByte = (byte)Math.Round(FuncoesMatematicas.Clamp(angulo, 0, 255));
|
||||||
(byte)Math.Round(
|
|
||||||
FuncoesMatematicas.Clamp(
|
|
||||||
angulo,
|
|
||||||
0,
|
|
||||||
255
|
|
||||||
)
|
|
||||||
);
|
|
||||||
|
|
||||||
byte[] data =
|
byte[] data =
|
||||||
{
|
{
|
||||||
(byte)(
|
(byte)(status ? Estado.Ligado : Estado.Desligado),
|
||||||
status
|
anguloByte
|
||||||
? Estado.Ligado
|
};
|
||||||
: Estado.Desligado
|
|
||||||
),
|
|
||||||
anguloByte
|
|
||||||
};
|
|
||||||
|
|
||||||
dispAtu.AdicionarMensagemFila(
|
dispAtu.AdicionarMensagemFila(bico.ID_Num, CanMessagePosicaoDados.Command1, CanMessagePosicaoDados.Command1, data, false);
|
||||||
bico.ID_Num,
|
|
||||||
CanMessagePosicaoDados.Command1,
|
|
||||||
CanMessagePosicaoDados.Command1,
|
|
||||||
data,
|
|
||||||
false
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void EnviarComandoFisicoBomba(
|
private void EnviarComandoFisicoBomba(AtuadorBombaModel bomba, bool status, double potencia, double pressao)
|
||||||
AtuadorBombaModel bomba,
|
|
||||||
bool status,
|
|
||||||
double potencia,
|
|
||||||
double pressao)
|
|
||||||
{
|
{
|
||||||
var dispAtu =
|
var dispAtu = Variaveis.OperacaoEmAndamento?.DispAtu;
|
||||||
Variaveis.OperacaoEmAndamento?.DispAtu;
|
|
||||||
|
|
||||||
if (
|
if (dispAtu?.Dados?.Conectado != true || bomba == null)
|
||||||
dispAtu?.Dados?.Conectado != true ||
|
|
||||||
bomba == null
|
|
||||||
)
|
|
||||||
{
|
|
||||||
return;
|
return;
|
||||||
}
|
|
||||||
|
|
||||||
byte potenciaByte =
|
byte potenciaByte = (byte)Math.Round(FuncoesMatematicas.Clamp(potencia, 0, 100));
|
||||||
(byte)Math.Round(
|
|
||||||
FuncoesMatematicas.Clamp(
|
|
||||||
potencia,
|
|
||||||
0,
|
|
||||||
100
|
|
||||||
)
|
|
||||||
);
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* -1 é usado para indicar ausência de sensor
|
* -1 é usado para indicar ausência de sensor
|
||||||
* de pressão. No protocolo atual, representa 255.
|
* de pressão. No protocolo atual, representa 255.
|
||||||
*/
|
*/
|
||||||
byte pressaoByte =
|
byte pressaoByte = pressao < 0 ? byte.MaxValue : (byte)Math.Round(FuncoesMatematicas.Clamp(pressao, 0, 255));
|
||||||
pressao < 0
|
|
||||||
? byte.MaxValue
|
|
||||||
: (byte)Math.Round(
|
|
||||||
FuncoesMatematicas.Clamp(
|
|
||||||
pressao,
|
|
||||||
0,
|
|
||||||
255
|
|
||||||
)
|
|
||||||
);
|
|
||||||
|
|
||||||
byte[] data =
|
byte[] data =
|
||||||
{
|
{
|
||||||
(byte)(
|
(byte)(status ? Estado.Ligado : Estado.Desligado),
|
||||||
status
|
potenciaByte,
|
||||||
? Estado.Ligado
|
pressaoByte
|
||||||
: Estado.Desligado
|
};
|
||||||
),
|
|
||||||
potenciaByte,
|
|
||||||
pressaoByte
|
|
||||||
};
|
|
||||||
|
|
||||||
dispAtu.AdicionarMensagemFila(
|
dispAtu.AdicionarMensagemFila(bomba.ID_Num, CanMessagePosicaoDados.Command1, CanMessagePosicaoDados.Command1, data, false);
|
||||||
bomba.ID_Num,
|
|
||||||
CanMessagePosicaoDados.Command1,
|
|
||||||
CanMessagePosicaoDados.Command1,
|
|
||||||
data,
|
|
||||||
false
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -2095,7 +2071,7 @@ namespace AgroBase.Models.Modules
|
||||||
}
|
}
|
||||||
if (t.IsCompleted)
|
if (t.IsCompleted)
|
||||||
{
|
{
|
||||||
var calAtu = Variaveis.OperacaoEmAndamento.ModsCalibragem[T_Code.Atu];
|
var calAtu = Variaveis.OperacaoEmAndamento.ModsCalibragem[Dispositivo];
|
||||||
var v = calAtu.Select(x => $"{x.Key} " + (x.Value ? "Sim" : "Não"));
|
var v = calAtu.Select(x => $"{x.Key} " + (x.Value ? "Sim" : "Não"));
|
||||||
Variaveis.MostrarLog($"[AtuadorModel] [RealizarCalibragemAsync] Task de referenciamento do módulo {Modulo_ID} finalizada: " + string.Join(", ", v));
|
Variaveis.MostrarLog($"[AtuadorModel] [RealizarCalibragemAsync] Task de referenciamento do módulo {Modulo_ID} finalizada: " + string.Join(", ", v));
|
||||||
Variaveis.OperacaoEmAndamento.Sensoriamento.InserirLog(Dispositivo, StatusModulo.Operante, 100, $"Task de referenciamento do módulo {Modulo_ID} finalizada: " + string.Join(", ", v));
|
Variaveis.OperacaoEmAndamento.Sensoriamento.InserirLog(Dispositivo, StatusModulo.Operante, 100, $"Task de referenciamento do módulo {Modulo_ID} finalizada: " + string.Join(", ", v));
|
||||||
|
|
@ -2172,7 +2148,7 @@ 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.funcao == FuncoesPinout.EstadoLeitura)?.atual?.valor ?? 0);
|
||||||
public int _AnguloBicoLeitura => ValoresLeituras?.FirstOrDefault(x => x.funcao == FuncoesPinout.ServoAnguloLeitura)?.atual? .valor ?? 0;
|
public double _AnguloBicoLeitura => ValoresLeituras?.FirstOrDefault(x => x.funcao == FuncoesPinout.ServoAnguloLeitura)?.atual? .valor ?? 0;
|
||||||
|
|
||||||
|
|
||||||
public (CanMessagePosicaoDados, byte[]) ProtocoloConfiguracao(PinoutDataModel pinout, bool conectar)
|
public (CanMessagePosicaoDados, byte[]) ProtocoloConfiguracao(PinoutDataModel pinout, bool conectar)
|
||||||
|
|
|
||||||
|
|
@ -1184,27 +1184,27 @@ namespace AgroBase.Models
|
||||||
Variaveis.OperacaoEmAndamento.Sensoriamento.UltimoRegistroLog = DateTime.Now;
|
Variaveis.OperacaoEmAndamento.Sensoriamento.UltimoRegistroLog = DateTime.Now;
|
||||||
tmrLogs?.Start();
|
tmrLogs?.Start();
|
||||||
|
|
||||||
Iniciado = true;
|
Variaveis.OperacaoEmAndamento.Iniciado = true;
|
||||||
Simulando = false;
|
Variaveis.OperacaoEmAndamento.Simulando = false;
|
||||||
Treinando = false;
|
Variaveis.OperacaoEmAndamento.Treinando = false;
|
||||||
Emergencia = false;
|
Variaveis.OperacaoEmAndamento.Emergencia = false;
|
||||||
Pausa = false;
|
Variaveis.OperacaoEmAndamento.Pausa = false;
|
||||||
DataInicio = DateTime.Now;
|
Variaveis.OperacaoEmAndamento.DataInicio = DateTime.Now;
|
||||||
DataFim = DateTime.MinValue;
|
Variaveis.OperacaoEmAndamento.DataFim = DateTime.MinValue;
|
||||||
idxLog = 0;
|
Variaveis.OperacaoEmAndamento.idxLog = 0;
|
||||||
|
|
||||||
ID = DataInicio.ToString("dd_MM_yyyy_HH_mm_ss") + "_" + (Parametros?.Modo ?? ModoOperacao.NaoDefinido).ToString();
|
Variaveis.OperacaoEmAndamento.ID = DataInicio.ToString("dd_MM_yyyy_HH_mm_ss") + "_" + (Parametros?.Modo ?? ModoOperacao.NaoDefinido).ToString();
|
||||||
Directory.CreateDirectory(Variaveis.CaminhoOperacoes + ID + "/");
|
Directory.CreateDirectory(Variaveis.CaminhoOperacoes + ID + "/");
|
||||||
|
|
||||||
SalvarOperacao();
|
SalvarOperacao();
|
||||||
|
|
||||||
Sensoriamento.AtualizarDados();
|
Variaveis.OperacaoEmAndamento.Sensoriamento.AtualizarDados();
|
||||||
|
|
||||||
DispMvd?.Dados?.ReiniciarLeituras(DispMvd?.Dados);
|
Variaveis.OperacaoEmAndamento.DispMvd?.Dados?.ReiniciarLeituras(DispMvd?.Dados);
|
||||||
DispAtu?.Dados?.ReiniciarLeituras(DispAtu?.Dados);
|
Variaveis.OperacaoEmAndamento.DispAtu?.Dados?.ReiniciarLeituras(DispAtu?.Dados);
|
||||||
DispSen?.Dados?.ReiniciarLeituras(DispSen?.Dados);
|
Variaveis.OperacaoEmAndamento.DispSen?.Dados?.ReiniciarLeituras(DispSen?.Dados);
|
||||||
|
|
||||||
ModsCalibragem = new Dictionary<T_Code, Dictionary<string, bool>>()
|
Variaveis.OperacaoEmAndamento.ModsCalibragem = new Dictionary<T_Code, Dictionary<string, bool>>()
|
||||||
{
|
{
|
||||||
{ T_Code.Mov, new Dictionary<string, bool>() { } },
|
{ T_Code.Mov, new Dictionary<string, bool>() { } },
|
||||||
{ T_Code.Dir, new Dictionary<string, bool>() { } },
|
{ T_Code.Dir, new Dictionary<string, bool>() { } },
|
||||||
|
|
@ -1215,19 +1215,19 @@ namespace AgroBase.Models
|
||||||
WeedWorkerService.ReiniciarLeituraAnalise();
|
WeedWorkerService.ReiniciarLeituraAnalise();
|
||||||
VisualWorkerService.ReiniciarLeituraAnalise();
|
VisualWorkerService.ReiniciarLeituraAnalise();
|
||||||
|
|
||||||
Controle.Reiniciar();
|
Variaveis.OperacaoEmAndamento.Controle.Reiniciar();
|
||||||
ControleAnterior.Reiniciar();
|
Variaveis.OperacaoEmAndamento.ControleAnterior.Reiniciar();
|
||||||
|
|
||||||
double distanciaPercorrida = DispMvd?.Dados?.DistanciaPercorridaTotal ?? 0;
|
double distanciaPercorrida = DispMvd?.Dados?.DistanciaPercorridaTotal ?? 0;
|
||||||
double tempoAtuado = DispAtu?.Dados?.TempoAtuado ?? 0;
|
double tempoAtuado = DispAtu?.Dados?.TempoAtuado ?? 0;
|
||||||
DispSen?.Dados?.ContadorCarga?.AtualizarConsumo(distanciaPercorrida);
|
Variaveis.OperacaoEmAndamento.DispSen?.Dados?.ContadorCarga?.AtualizarConsumo(distanciaPercorrida);
|
||||||
DispSen?.Dados?.ContadorCarga?.IniciarOperacao(distanciaPercorrida);
|
Variaveis.OperacaoEmAndamento.DispSen?.Dados?.ContadorCarga?.IniciarOperacao(distanciaPercorrida);
|
||||||
DispAtu?.Dados?.ContadorCarga?.IniciarOperacao(distanciaPercorrida, tempoAtuado);
|
Variaveis.OperacaoEmAndamento.DispAtu?.Dados?.ContadorCarga?.IniciarOperacao(distanciaPercorrida, tempoAtuado);
|
||||||
|
|
||||||
GPSTrajetoria = new List<GPSModel>();
|
Variaveis.OperacaoEmAndamento.GPSTrajetoria = new List<GPSModel>();
|
||||||
|
|
||||||
Trajetoria?.ProjetarTrajetoriaFixa();
|
Variaveis.OperacaoEmAndamento.Trajetoria?.ProjetarTrajetoriaFixa();
|
||||||
Trajetoria.VerificacaoInicialMeioRuaConcluida = false;
|
Variaveis.OperacaoEmAndamento.Trajetoria.VerificacaoInicialMeioRuaConcluida = false;
|
||||||
RedisService.Publish(CmdKey.ManagerWorkerRx, JsonConvert.SerializeObject(new { cmd = ManagerWorkerCommandType.IniciarMPC }));
|
RedisService.Publish(CmdKey.ManagerWorkerRx, JsonConvert.SerializeObject(new { cmd = ManagerWorkerCommandType.IniciarMPC }));
|
||||||
|
|
||||||
await RealizarCalibragemInicialAsync(true);
|
await RealizarCalibragemInicialAsync(true);
|
||||||
|
|
|
||||||
|
|
@ -699,7 +699,7 @@ namespace AgroBase.Models.Operacoes
|
||||||
Posicao = x.Posicao,
|
Posicao = x.Posicao,
|
||||||
AnguloAbertura = x.AnguloAbertura,
|
AnguloAbertura = x.AnguloAbertura,
|
||||||
ComandoAngulo = (int)x.AnguloControle,
|
ComandoAngulo = (int)x.AnguloControle,
|
||||||
LeituraAngulo = x._AnguloBicoLeitura,
|
LeituraAngulo = (int)x._AnguloBicoLeitura,
|
||||||
ComandoEstado = x.ComandoAtuar,
|
ComandoEstado = x.ComandoAtuar,
|
||||||
LeituraEstado = x._EstadoLeitura == Estado.Ligado,
|
LeituraEstado = x._EstadoLeitura == Estado.Ligado,
|
||||||
VazaoMediaMLs = x.VazaoMediaMLs,
|
VazaoMediaMLs = x.VazaoMediaMLs,
|
||||||
|
|
|
||||||
|
|
@ -474,7 +474,7 @@ namespace AgroBase.Models
|
||||||
public static double DistanciaEntreBicosCm { get; set; } = 50;
|
public static double DistanciaEntreBicosCm { get; set; } = 50;
|
||||||
public static double DensidadeHerbicida { get; set; } = 1.0;
|
public static double DensidadeHerbicida { get; set; } = 1.0;
|
||||||
public static double CapacidadeReservatorio { get; set; } = 60;
|
public static double CapacidadeReservatorio { get; set; } = 60;
|
||||||
public static double PressaoMinimaCavitacao { get; set; } = 30.0;
|
public static double PressaoMinimaCavitacao { get; set; } = 10.0;
|
||||||
public static double ReducaoDirecional { get; set; } = 20.0;
|
public static double ReducaoDirecional { get; set; } = 20.0;
|
||||||
public static double PercentualVelMin
|
public static double PercentualVelMin
|
||||||
{
|
{
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue