Files
mapo-mono/MachineSim/Simulator.cs
T
2022-03-07 17:43:20 +01:00

218 lines
6.7 KiB
C#

using MathNet.Numerics.Distributions;
using MP.MONO.Core.DTO;
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace MachineSim
{
/// <summary>
/// Definizione parametri simulati
/// </summary>
public class Simulator
{
protected string basePath = "";
protected string paramFileName = "SimParams.json";
protected List<SimDisplayDataDTO>? currSimPar = new List<SimDisplayDataDTO>();
public Simulator(string _basePath)
{
basePath = _basePath;
setupConfig();
}
private void setupConfig()
{
string fullPath = Path.Combine(basePath, paramFileName);
if (File.Exists(fullPath))
{
var rawData = File.ReadAllText(fullPath);
if (!string.IsNullOrEmpty(rawData))
{
currSimPar = JsonConvert.DeserializeObject<List<SimDisplayDataDTO>>(rawData);
}
}
}
/// <summary>
/// Calcola prox valore simulato dati i parametri rand configurati
/// </summary>
/// <param name="CurrVal"></param>
/// <param name="MinVal"></param>
/// <param name="MaxVal"></param>
/// <param name="sMean"></param>
/// <param name="sStd"></param>
/// <returns></returns>
public double getNext(double CurrVal, double MinVal, double MaxVal, double sMean, double sStd)
{
double innov = Normal.Sample(sMean, sStd);
CurrVal += innov;
// verifico estremi...
CurrVal = CurrVal > MaxVal ? MaxVal : CurrVal;
CurrVal = CurrVal < MinVal ? MinVal : CurrVal;
return CurrVal;
}
public List<DisplayDataDTO> MachineGetParameters()
{
List<DisplayDataDTO> answ = new List<DisplayDataDTO>();
// genero a partire dall'elenco configurato da simulare...
answ = currSimPar.Select(i => new DisplayDataDTO()
{
IsNumeric = i.IsNumeric,
MaxVal = i.MaxVal,
MinVal = i.MinVal,
Order = i.Order,
Title = i.Title,
Type = i.Type,
ValueNum = getNext(i.ValueNum, i.MinVal, i.MaxVal, i.SimMean, i.SimStd),
DisplFormat = i.DisplFormat
//Value = $"{getNext(i.ValueNum, i.MinVal, i.MaxVal, i.SimMean, i.SimStd):N3}",
}).ToList();
foreach (var item in answ)
{
item.Value = $"{item.ValueNum.ToString(item.DisplFormat)}";
}
// !!!FIXME TODO... è fake...
#if false
var currVal = rand.NextDouble();
DisplayDataDTO displ01 = new DisplayDataDTO()
{
Order = 0,
Title = "OEE",
ValueNum = currVal,
IsNumeric = true,
Value = currVal.ToString("P1"),
Type = "OEE-75-90"
};
answ.Add(displ01);
currVal = rand.NextDouble();
DisplayDataDTO displ02 = new DisplayDataDTO()
{
Order = 0,
Title = "Avail",
ValueNum = currVal,
IsNumeric = true,
Value = currVal.ToString("P1"),
Type = "AVAIL-50-80"
};
answ.Add(displ02);
currVal = rand.NextDouble();
DisplayDataDTO displ03 = new DisplayDataDTO()
{
Order = 0,
Title = "Order fulfill",
ValueNum = currVal,
IsNumeric = true,
Value = currVal.ToString("P1"),
Type = "ORDER"
};
answ.Add(displ03);
double minTCiclo = stdCycle * rand.NextDouble();
TimeSpan durTCycle = TimeSpan.FromMinutes(minTCiclo);
DisplayDataDTO displ04 = new DisplayDataDTO()
{
Order = 0,
Title = "Cycle time",
ValueNum = 0,
IsNumeric = false,
Value = $"{durTCycle.Hours:00}:{durTCycle.Minutes:00}:{durTCycle.Seconds:00}",
Type = "TCycle"
};
answ.Add(displ04);
#endif
#if false
Random rand = new Random();
int stdCycle = 5;
double currVal = 0;
currVal = rand.Next(10, 120) * 100;
DisplayDataDTO displ01 = new DisplayDataDTO()
{
Order = 0,
Title = "SPEED",
ValueNum = currVal,
IsNumeric = true,
Value = currVal.ToString("N0"),
Type = "SPEED-5000-10000"
};
answ.Add(displ01);
currVal = rand.Next(10, 100) * 100;
DisplayDataDTO displ02 = new DisplayDataDTO()
{
Order = 0,
Title = "FEED",
ValueNum = currVal,
IsNumeric = true,
Value = currVal.ToString("N0"),
Type = "FEED-3000-5000"
};
answ.Add(displ02);
currVal = rand.NextDouble() * 1.2;
DisplayDataDTO displ03 = new DisplayDataDTO()
{
Order = 0,
Title = "SPINDLE LOAD",
ValueNum = currVal,
IsNumeric = true,
Value = currVal.ToString("P0"),
Type = "LOAD"
};
answ.Add(displ03);
currVal = rand.NextDouble() * 5000;
DisplayDataDTO displ04 = new DisplayDataDTO()
{
Order = 0,
Title = "X POS",
ValueNum = currVal,
IsNumeric = true,
Value = currVal.ToString("N1"),
Type = "POS"
};
answ.Add(displ04);
currVal = rand.NextDouble() * 10000;
DisplayDataDTO displ05 = new DisplayDataDTO()
{
Order = 0,
Title = "Y POS",
ValueNum = currVal,
IsNumeric = true,
Value = currVal.ToString("N1"),
Type = "POS"
};
answ.Add(displ05);
currVal = rand.NextDouble() * -3000;
DisplayDataDTO displ06 = new DisplayDataDTO()
{
Order = 0,
Title = "Z POS",
ValueNum = currVal,
IsNumeric = true,
Value = currVal.ToString("N1"),
Type = "POS"
};
answ.Add(displ06);
#endif
return answ;
}
}
}