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 } }