using System;
namespace IOB_UT_NEXT
{
///
/// TCiclo management class
///
public class TCMan
{
#region Public Constructors
///
/// Classe gestione TCiclo
///
/// Fattore lambda x EWMA smooth
/// Massimo fattore ritardo TC x errore
/// Massimo incremento numPz x considerare calcolo TCiclo
public TCMan(double lambda, double maxDelayFactor, double maxIncrPz)
{
_lambda = lambda;
_maxDelayFactor = maxDelayFactor;
_maxIncrPz = maxIncrPz;
}
#endregion Public Constructors
#region Public Properties
///
/// Indica se sia attivo allarme per TCiclo sopra soglia
///
public bool alarmDelayTC
{
get
{
bool answ = false;
// solo se ho dei pezzi rilevati...
if (pzCountPLC > 0 && pzCountIOB > 0)
{
answ = (currTC >= limitTC && limitTC > 0);
}
return answ;
}
}
///
/// Valore TCiclo medio attuale (EWMA) in secondi
///
public double avgTC { get; set; } = 0;
///
/// TCiclo corrente
///
public double currTC
{
get
{
DateTime adesso = DateTime.Now;
return adesso.Subtract(lastObservedData).TotalSeconds;
}
}
///
/// Ultimo dato (incremento PzCount) registrato
///
public DateTime lastObservedData { get; set; } = DateTime.Now.AddMinutes(-60);
///
/// Ultimo TCiclo osservato in secondi
///
public double lastTC
{
get
{
return _lastTC;
}
}
///
/// Limite allarme per il TCiclo (come media TCiclo * maxDelayFactor)
///
///
public double limitTC
{
get
{
return avgTC * _maxDelayFactor;
}
}
///
/// Contapezzi IOB
///
public int pzCountIOB
{
get => _pzCountIOB;
set => _pzCountIOB = value;
}
///
/// Contapezzi PLC
///
public int pzCountPLC
{
get
{
return _pzCountPLC;
}
set
{
DateTime adesso = DateTime.Now;
int incrPz = value - _pzCountPLC;
if (incrPz > 0)
{
// calcolo lastTC...
_lastTC = adesso.Subtract(lastObservedData).TotalSeconds / incrPz;
// eseguo verifica x ricalcolo soglie...
bool validData = (incrPz) < _maxIncrPz;
if (validData)
{
avgTC = _lambda * lastTC + (1 - _lambda) * avgTC;
}
}
_pzCountPLC = value;
// aggiorno dato osservazione...
lastObservedData = adesso;
}
}
#endregion Public Properties
#region Private Fields
///
/// Fattore lambda (innovazione) per calcolo EWMA valore TCiclo corrente
///
private double _lambda = 0.4;
///
/// Ultimo TCiclo osservato in SECONDI
///
private double _lastTC = 0;
///
/// Fattore massimo ammesso di delay x il TCiclo
///
private double _maxDelayFactor = 1.2;
///
/// Incremento amssimo pezzi per cui fare calcolo del tempociclo attuale
///
private double _maxIncrPz = 2;
///
/// Contapezzi IOB
///
private int _pzCountIOB = 0;
///
/// Contapezzi PLC
///
private int _pzCountPLC = 0;
#endregion Private Fields
}
}