diff --git a/IOB-UT/IOB-UT.csproj b/IOB-UT/IOB-UT.csproj
index d9666530..54c5d7aa 100644
--- a/IOB-UT/IOB-UT.csproj
+++ b/IOB-UT/IOB-UT.csproj
@@ -99,6 +99,7 @@
+
Component
diff --git a/IOB-UT/TCMan.cs b/IOB-UT/TCMan.cs
new file mode 100644
index 00000000..3c570ebf
--- /dev/null
+++ b/IOB-UT/TCMan.cs
@@ -0,0 +1,141 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+
+namespace IOB_UT
+{
+ ///
+ /// TCiclo management class
+ ///
+ public class TCMan
+ {
+ #region private obj
+
+ ///
+ /// Ultimo TCiclo osservato
+ ///
+ protected double _lastTC { get; set; } = 0;
+
+ ///
+ /// Contapezzi CNC
+ ///
+ protected int _pzCountCNC { get; set; } = 0;
+
+ ///
+ /// Contapezzi IOB
+ ///
+ protected int _pzCountIOB { get; set; } = 0;
+
+ ///
+ /// Fattore lambda (innovazione) per calcolo EWMA valore TCiclo corrente
+ ///
+ protected double lambda { get; set; } = 0.4;
+
+ ///
+ /// Fattore massimo ammesso di delay x il TCiclo
+ ///
+ protected double maxDelayFactor { get; set; } = 1.5;
+
+ ///
+ /// Incremento amssimo pezzi per cui fare calcolo del tempociclo attuale
+ ///
+ protected double maxIncrPz { get; set; } = 2;
+
+ #endregion private obj
+
+ #region contapezzi e TCiclo
+
+ ///
+ /// Classe gestione TCiclo
+ ///
+ /// Fattore lambda x EWMA smooth
+ /// Massimo fattore ritardo TC x errore
+ /// Massimo incremento numPz x considerare calcolo TCiclo
+ public TCMan(double lambdaWeight, double maxDelayTcFact, double maxIncrPzCount)
+ {
+ lambda = lambdaWeight;
+ maxDelayFactor = maxDelayTcFact;
+ maxIncrPz = maxIncrPzCount;
+ }
+
+ ///
+ /// Indica se sia attivo allarme per TCiclo sopra soglia
+ ///
+ public bool alarmDelayTC
+ {
+ get
+ {
+ return lastTC >= limitTC;
+ }
+ }
+
+ ///
+ /// Valore TCiclo medio attuale (EWMA)
+ ///
+ public double avgTC { get; set; } = 0;
+
+ ///
+ /// Ultimo dato (incremento PzCount) registrato
+ ///
+ public DateTime lastObservedData { get; set; } = DateTime.Now.AddHours(-1);
+
+ ///
+ /// Ultimo TCiclo osservato
+ ///
+ public double lastTC
+ {
+ get
+ {
+ return _lastTC;
+ }
+ }
+
+ ///
+ /// Limite allarme per il TCiclo (come media TCiclo * maxDelayFactor)
+ ///
+ ///
+ public double limitTC
+ {
+ get
+ {
+ return avgTC * maxDelayFactor;
+ }
+ }
+
+ ///
+ /// Contapezzi CNC
+ ///
+ public int pzCountCNC
+ {
+ get
+ {
+ return _pzCountCNC;
+ }
+ set
+ {
+ DateTime adesso = DateTime.Now;
+ int incrPz = value - _pzCountCNC;
+ 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;
+ }
+ }
+ _pzCountCNC = value;
+ }
+ }
+
+ ///
+ /// Contapezzi IOB
+ ///
+ public int pzCountIOB { get; set; } = 0;
+
+ #endregion contapezzi e TCiclo
+ }
+}
\ No newline at end of file