Fix delta e caching x ProdPanel
This commit is contained in:
@@ -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
@@ -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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user