Fix delta e caching x ProdPanel

This commit is contained in:
Samuele Locatelli
2020-07-10 15:54:23 +02:00
parent f7c3a7158b
commit afc5b1dd4b
2 changed files with 111 additions and 80 deletions
@@ -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;
}
+107 -75
View File
@@ -221,6 +221,10 @@ namespace Thermo.Active.NC
/// Last prod info from PLC
/// </summary>
protected static ThermoModels.ProdInfoModel lastProdInfoData = new ThermoModels.ProdInfoModel();
/// <summary>
/// Ultimi dati prodPanel
/// </summary>
protected static DTOThermoPanelProd LastProdPanelData = new DTOThermoPanelProd();
#endregion
@@ -1259,110 +1263,138 @@ namespace Thermo.Active.NC
Dictionary<int, double> TS_Cad = new Dictionary<int, double>();
Dictionary<int, double> TS_TC = new Dictionary<int, double>();
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<ThermoModels.ProdInfoModel> 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<ThermoModels.ProdInfoModel> 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<int> numList = new List<int>();
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<int> numList = new List<int>();
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<ThermoModels.ProdInfoModel> 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<ThermoModels.ProdInfoModel> 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;
}