modifica oggetto gestione contatori istantanei con mediana (POI da testare se va bene va esteso a altri counters...)

This commit is contained in:
Samuele E. Locatelli
2017-07-24 15:12:53 +02:00
parent 36ea850027
commit 8bb0eb2031
4 changed files with 145 additions and 21 deletions
+117
View File
@@ -6,6 +6,7 @@ using System.Data;
using System.IO;
using System.Linq;
using NLog;
using AForge.Math;
namespace MTC
{
@@ -357,7 +358,123 @@ namespace MTC
}
}
/// <summary>
/// Classe gestione valori campionati su periodo
/// </summary>
public class sampleVect
{
/// <summary>
/// Dimensione finestra di campionamento (secondi)
/// </summary>
protected int windSize;
/// <summary>
/// vettore valori temporali della serie
/// </summary>
protected List<DateTime> lTime;
/// <summary>
/// vettore valoti puntuali della serie
/// </summary>
protected List<int> lVal;
/// <summary>
/// Inizializzo l'oggetto
/// </summary>
public sampleVect()
{
// init valori default...
windSize = baseUtils.CRI("countWindSize") > 0 ? baseUtils.CRI("countWindSize") : 60;
}
/// <summary>
/// Conteggio elementi
/// </summary>
protected int numElem
{
get
{
return lTime.Count;
}
}
/// <summary>
/// Verifica ampiezza finestra valori First-Last
/// </summary>
protected double flWindSize
{
get
{
double answ = 0;
if (numElem > 1)
{
answ = lTime.Last().Subtract(lTime[0]).TotalSeconds;
}
return answ;
}
}
/// <summary>
/// Verifica ampiezza finestra valori Second-Last
/// </summary>
protected double slWindSize
{
get
{
double answ = 0;
if (numElem > 2) // altrimenti SE non ne ho almeno 3 NON posso avere secondo/ultimo...
{
answ = lTime.Last().Subtract(lTime[1]).TotalSeconds;
}
return answ;
}
}
/// <summary>
/// Aggiunge un valore alla serie ed eventualmente elimina i valori superflui a garantirne una finestra temporale valida
/// </summary>
/// <param name="tempo"></param>
/// <param name="valore"></param>
public void addValue(DateTime tempo, int valore)
{
lTime.Add(tempo);
lVal.Add(valore);
// verifico se siano da accorciare le serie... ovvero i 2 intervalli ENTRAMBI sono superiori al periodo minimo (in tal caso riduco..
while (flWindSize > windSize && slWindSize > windSize)
{
// elimino i 2 valori + vecchi
lTime.RemoveAt(0);
lVal.RemoveAt(0);
// ora ricontrollo...
}
}
/// <summary>
/// Calcola il valore mediano...
/// </summary>
public double vcMedian
{
get
{
double answ = 0;
// restituisce la mediana SE valida, altrimenti null...
if (numElem > 1 && flWindSize > windSize)
{
try
{
// calcolo mediana!
answ = Statistics.Median(lVal.ToArray());
}
catch
{ }
}
return answ;
}
}
/// <summary>
/// Verifica se la vc sia valida (ovvero almeno 2 valori e intervallo > window richiesta)
/// </summary>
public bool vcValid
{
get
{
return (flWindSize > windSize && numElem > 1);
}
}
}
public static class TimingData
{
+2
View File
@@ -1,5 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<packages>
<package id="AForge" version="2.2.5" targetFramework="net452" />
<package id="AForge.Math" version="2.2.5" targetFramework="net452" />
<package id="NLog" version="4.4.4" targetFramework="net452" />
<package id="NLog.Config" version="4.4.4" targetFramework="net452" />
<package id="NLog.Schema" version="4.4.4" targetFramework="net452" />
+24 -19
View File
@@ -788,7 +788,7 @@ namespace MTC_Adapter
/// <summary>
/// Vettore ISTANTANEO dei contatori generici
/// </summary>
public uint[] istCounters;
public sampleVect[] istCounters;
/// <summary>
/// Vettore ISTANTANEO dei contatori del numero movimenti Slitta Magazzino
/// </summary>
@@ -1445,7 +1445,7 @@ namespace MTC_Adapter
// ora inizializzo l'insieme degli events dei COUNTERS generici...
mCounters = new Event[numCounters];
currCounters = new uint[numCounters];
istCounters = new uint[numCounters];
istCounters = new sampleVect[numCounters];
int idx = 0;
foreach (otherData item in maintData)
{
@@ -3353,7 +3353,8 @@ namespace MTC_Adapter
}
if (numero > 0)
{
istCounters[numero - 1] = tabDatiMtz[i];
//istCounters[numero - 1] = tabDatiMtz[i];
istCounters[numero - 1].addValue(DateTime.Now, Convert.ToInt32(tabDatiMtz[i]));
}
}
else if (maintData[i].varName.StartsWith("Path_"))
@@ -4553,27 +4554,31 @@ namespace MTC_Adapter
StringBuilder sb = new StringBuilder();
for (int i = 0; i < mCounters.Length; i++)
{
delta = istCounters[i] - currCounters[i];
// controllo delta < 50% max...
if (delta < uint.MaxValue / 2)
// procedo solo SE HO FINESTRA VALIDA...
if (istCounters[i].vcValid)
{
//processo comunque sempre...
uint contTot = updateValUIntByIncr(i, delta, "Counter_{0:000}");
// passo valore totale all'adapter
mCounters[i].Value = contTot;
// controllo valore riferimento...
if (delta > 0)
delta = Convert.ToUInt32(istCounters[i].vcMedian) - currCounters[i];
// controllo delta < 50% max...
if (delta < uint.MaxValue / 2)
{
// segnalo necessità salvataggio!
needSave = true;
//processo comunque sempre...
uint contTot = updateValUIntByIncr(i, delta, "Counter_{0:000}");
// passo valore totale all'adapter
mCounters[i].Value = contTot;
// controllo valore riferimento...
if (delta > 0)
{
// segnalo necessità salvataggio!
needSave = true;
}
// ...aggiorno valore riferimento...
currCounters[i] = Convert.ToUInt32(istCounters[i].vcMedian);
}
// ...aggiorno valore riferimento...
currCounters[i] = istCounters[i];
sb.AppendLine(mCounters[i].ToString().Replace("|", " | "));
}
sb.AppendLine(mCounters[i].ToString().Replace("|", " | "));
// salvo su maschera...
parentForm.dataMonitor_2 += sb.ToString();
}
// salvo su maschera...
parentForm.dataMonitor_2 += sb.ToString();
return needSave;
}
/// <summary>
+2 -2
View File
@@ -15,8 +15,8 @@
<add key="waitEndCycle" value="0"/><!--ms attesa dopo ogni ciclo lettura...--><!--30 sec-->
<!--num cicli PRIMA di leggere davvero GCode x rallentare-->
<add key="contChkGCod" value="2"/>
<!--gestione FINESTRA coda counter in minuti (inizia a fornire dati DOPO che è piena la coda x la finestra richiesta e la tiene di quella durata max...)-->
<add key="queWindow" value="1"/>
<!--gestione FINESTRA campionamento x counter in secondi (dati validi dati DOPO che è piena la coda x la finestra richiesta, mantenuta a quella durata...)-->
<add key="countWindSize" value="30"/>
<!--parametri gestione watchdog-->
<add key="maxAdapterLockSec" value="5"/>
<!--AREA CONF IP FANUC-->