From afc5b1dd4bf54bd18f5712e4912db055d469fe81 Mon Sep 17 00:00:00 2001 From: Samuele Locatelli Date: Fri, 10 Jul 2020 15:54:23 +0200 Subject: [PATCH] Fix delta e caching x ProdPanel --- .../DTOModels/ThProd/DTOThermoPanelProd.cs | 9 +- Thermo.Active.NC/NcAdapter.cs | 182 ++++++++++-------- 2 files changed, 111 insertions(+), 80 deletions(-) diff --git a/Thermo.Active.Model/DTOModels/ThProd/DTOThermoPanelProd.cs b/Thermo.Active.Model/DTOModels/ThProd/DTOThermoPanelProd.cs index 46ebe5b9..d70cb291 100644 --- a/Thermo.Active.Model/DTOModels/ThProd/DTOThermoPanelProd.cs +++ b/Thermo.Active.Model/DTOModels/ThProd/DTOThermoPanelProd.cs @@ -42,11 +42,10 @@ namespace Thermo.Active.Model.DTOModels.ThProd return false; if (LastTCiclo != item.LastTCiclo) return false; - // FIXME TODO rimettere quando NON sim - //if (!Enumerable.SequenceEqual(TS_Cadenza,item.TS_Cadenza)) - // return false; - //if (!Enumerable.SequenceEqual(TS_TCiclo, item.TS_TCiclo)) - // return false; + if (!Enumerable.SequenceEqual(TS_Cadenza, item.TS_Cadenza)) + return false; + if (!Enumerable.SequenceEqual(TS_TCiclo, item.TS_TCiclo)) + return false; return true; } diff --git a/Thermo.Active.NC/NcAdapter.cs b/Thermo.Active.NC/NcAdapter.cs index 3653d4e5..dfd8aaa7 100644 --- a/Thermo.Active.NC/NcAdapter.cs +++ b/Thermo.Active.NC/NcAdapter.cs @@ -221,6 +221,10 @@ namespace Thermo.Active.NC /// Last prod info from PLC /// protected static ThermoModels.ProdInfoModel lastProdInfoData = new ThermoModels.ProdInfoModel(); + /// + /// Ultimi dati prodPanel + /// + protected static DTOThermoPanelProd LastProdPanelData = new DTOThermoPanelProd(); #endregion @@ -1259,110 +1263,138 @@ namespace Thermo.Active.NC Dictionary TS_Cad = new Dictionary(); Dictionary TS_TC = new Dictionary(); CmsError libraryError = NO_ERROR; + bool dataChanged = false; int numTcOk = 0; // inizio da ncAdapter.lottoStart currentProdPanel.InizioProd = lottoStart; // dati ricetta da live currentProdPanel.NomeRicetta = NcFileAdapter.RecipeLiveData.RecipeName; - // parto dai dati di lastProdInfoData... - if (lastProdInfoData != null) + // se NON HO dati già letti --> cambiati devo rileggere + if (LastProdPanelData == null) { - currentProdPanel.NumDone = lastProdInfoData.NumDone; - currentProdPanel.NumTarget = lastProdInfoData.NumTarget; - currentProdPanel.LastTCiclo = lastProdInfoData.TimeCycleGross; - if (lastProdInfoData.TimeCycleGross > 0) - { - currentProdPanel.LastCadenza = (double)3600 / lastProdInfoData.TimeCycleGross; - } - // stima durata da pz fatti... - currentProdPanel.StimaDurata = (currentProdPanel.NumTarget - currentProdPanel.NumDone) * currentProdPanel.LastTCiclo; + dataChanged = true; } - - // dai parametri sistemo i setpoints - if (lastRecipe != null) + // se non sono variati dati di produzione --> li riutilizzo! + else { - if (lastRecipe.ContainsKey("pyrometer_pyrometer_setpoint")) + // verifico se siano ancora validi i dati precedenti... + if (lastProdInfoData == null) { - currentProdPanel.TempAct = lastRecipe["pyrometer_pyrometer_setpoint"].ValueAct; - currentProdPanel.TempSetpoint = lastRecipe["pyrometer_pyrometer_setpoint"].SetpointPLC; + dataChanged = true; + } + else + { + // confronto ultimo pezzo --> se diverso sono cambiati + dataChanged = (LastProdPanelData.NumDone != lastProdInfoData.NumDone); } } - // dal DB recupero i dati dei TC storici... cablato a last 30 x ora... - if (currentProdPanel.NumDone > 0) + if (dataChanged) { - libraryError = GetHistProdInfoData(out List prodInfoDataList, currentProdPanel.NumDone, numRecProdPanelGraph); - // se ci sono dati --> creo le 2 TS! - if (prodInfoDataList != null) + // parto dai dati di lastProdInfoData... + if (lastProdInfoData != null) { - foreach (var item in prodInfoDataList) + currentProdPanel.NumDone = lastProdInfoData.NumDone; + currentProdPanel.NumTarget = lastProdInfoData.NumTarget; + currentProdPanel.LastTCiclo = lastProdInfoData.TimeCycleGross; + if (lastProdInfoData.TimeCycleGross > 0) { - if (TS_TC.ContainsKey(item.NumDone)) + currentProdPanel.LastCadenza = (double)3600 / lastProdInfoData.TimeCycleGross; + } + // stima durata da pz fatti... + currentProdPanel.StimaDurata = (currentProdPanel.NumTarget - currentProdPanel.NumDone) * currentProdPanel.LastTCiclo; + } + // dai parametri sistemo i setpoints + if (lastRecipe != null) + { + if (lastRecipe.ContainsKey("pyrometer_pyrometer_setpoint")) + { + currentProdPanel.TempAct = lastRecipe["pyrometer_pyrometer_setpoint"].ValueAct; + currentProdPanel.TempSetpoint = lastRecipe["pyrometer_pyrometer_setpoint"].SetpointPLC; + } + } + // dal DB recupero i dati dei TC storici... cablato a last 30 x ora... + if (currentProdPanel.NumDone > 0) + { + libraryError = GetHistProdInfoData(out List prodInfoDataList, currentProdPanel.NumDone, numRecProdPanelGraph); + // se ci sono dati --> creo le 2 TS! + if (prodInfoDataList != null) + { + foreach (var item in prodInfoDataList) { - TS_TC[item.NumDone] = item.TimeCycleGross; - } - else - { - TS_TC.Add(item.NumDone, item.TimeCycleGross); - } - if (item.TimeCycleGross > 0) - { - if (TS_Cad.ContainsKey(item.NumDone)) + if (TS_TC.ContainsKey(item.NumDone)) { - TS_Cad[item.NumDone] = 3600 / item.TimeCycleGross; + TS_TC[item.NumDone] = item.TimeCycleGross; } else { - TS_Cad.Add(item.NumDone, 3600 / item.TimeCycleGross); + TS_TC.Add(item.NumDone, item.TimeCycleGross); } - numTcOk++; - } - } - // FIXME TODO: da levare post test... SE i TC sono zero (almeno 5)--> SIMULO - if (numTcOk == 0 || (numRecProdPanelGraph - numTcOk) > 5) - { - // calcolo primo/ultimo e divido... - DateTime fine = prodInfoDataList[0].DtEvent; - DateTime inizio = prodInfoDataList[prodInfoDataList.Count - 1].DtEvent; - double TCMedio = Math.Abs(fine.Subtract(inizio).TotalSeconds / prodInfoDataList.Count); - // simulo - var rand = new Random(); - List numList = new List(); - foreach (var item2fix in TS_TC) - { - numList.Add(item2fix.Key); - } - foreach (var numPz in numList) - { - TS_TC[numPz] = TCMedio + (rand.NextDouble() * 4 - 2); - if (TS_Cad.ContainsKey(numPz)) + if (item.TimeCycleGross > 0) { - TS_Cad[numPz] = 3600 / TS_TC[numPz]; - } - else - { - TS_Cad.Add(numPz, 3600 / TS_TC[numPz]); + if (TS_Cad.ContainsKey(item.NumDone)) + { + TS_Cad[item.NumDone] = 3600 / item.TimeCycleGross; + } + else + { + TS_Cad.Add(item.NumDone, 3600 / item.TimeCycleGross); + } + numTcOk++; } } + // FIXME TODO: da levare post test... SE i TC sono zero (almeno 5)--> SIMULO + if (numTcOk == 0 || (numRecProdPanelGraph - numTcOk) > 5) + { + // calcolo primo/ultimo e divido... + DateTime fine = prodInfoDataList[0].DtEvent; + DateTime inizio = prodInfoDataList[prodInfoDataList.Count - 1].DtEvent; + double TCMedio = Math.Abs(fine.Subtract(inizio).TotalSeconds / prodInfoDataList.Count); + // simulo + var rand = new Random(); + List numList = new List(); + foreach (var item2fix in TS_TC) + { + numList.Add(item2fix.Key); + } + foreach (var numPz in numList) + { + TS_TC[numPz] = TCMedio + (rand.NextDouble() * 4 - 2); + if (TS_Cad.ContainsKey(numPz)) + { + TS_Cad[numPz] = 3600 / TS_TC[numPz]; + } + else + { + TS_Cad.Add(numPz, 3600 / TS_TC[numPz]); + } + } + } + // accodo! + currentProdPanel.TS_Cadenza = TS_Cad; + currentProdPanel.TS_TCiclo = TS_TC; } - // accodo! - currentProdPanel.TS_Cadenza = TS_Cad; - currentProdPanel.TS_TCiclo = TS_TC; - } - // già che ci sono recupero prima record x prodStart... - libraryError = GetHistProdInfoData(out List prodInfoFirst, 1, 1); - // se ci sono dati --> fix start - if (prodInfoFirst != null) - { - try + // già che ci sono recupero prima record x prodStart... + libraryError = GetHistProdInfoData(out List prodInfoFirst, 1, 1); + // se ci sono dati --> fix start + if (prodInfoFirst != null) { - currentProdPanel.InizioProd = prodInfoFirst.FirstOrDefault().DtEvent; + try + { + currentProdPanel.InizioProd = prodInfoFirst.FirstOrDefault().DtEvent; + } + catch + { } } - catch - { } } + // salvo ultimi dati! + LastProdPanelData = currentProdPanel; + } + else + { + // uso ultimi dati + currentProdPanel = LastProdPanelData; } - return libraryError; }