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 { /// /// Definizione parametri simulati /// public class Simulator { protected string basePath = ""; protected string paramFileName = "SimParams.json"; protected List? currSimPar = new List(); 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>(rawData); } } } /// /// Calcola prox valore simulato dati i parametri rand configurati /// /// /// /// /// /// /// 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 MachineGetParameters() { List answ = new List(); // 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; } } }