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(-1); /// /// 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; set; } = 0; /// /// 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 Protected Properties /// /// Fattore lambda (innovazione) per calcolo EWMA valore TCiclo corrente /// protected double _lambda { get; set; } = 0.4; /// /// Ultimo TCiclo osservato in SECONDI /// protected double _lastTC { get; set; } = 0; /// /// ULTIMO Contapezzi IOB VALIDO /// protected int _lastValidPzCountIOB { get; set; } = 0; /// /// ULTIMO Contapezzi PLC VALIDO /// protected int _lastValidPzCountPLC { get; set; } = 0; /// /// Fattore massimo ammesso di delay x il TCiclo /// protected double _maxDelayFactor { get; set; } = 1.2; /// /// Incremento amssimo pezzi per cui fare calcolo del tempociclo attuale /// protected double _maxIncrPz { get; set; } = 2; /// /// Contapezzi IOB /// protected int _pzCountIOB { get; set; } = 0; /// /// Contapezzi PLC /// protected int _pzCountPLC { get; set; } = 0; #endregion Protected Properties } }