Abbozzata gestione rec dati allarmi (incidents)

This commit is contained in:
Samuele E. Locatelli
2019-11-23 12:08:12 +01:00
parent e3424f40a9
commit f570022a18
8 changed files with 217 additions and 2 deletions
+48 -1
View File
@@ -346,7 +346,7 @@ namespace MP_IO.Controllers
}
/// <summary>
/// Processa una chiamata POST per l'invio di un array Json di oggetti plcMemConf
/// PUT: IOB/flogJson/SIMUL_03
/// PUT: IOB/saveConf/SIMUL_03
/// </summary>
/// <param name="id">ID dell'IOB</param>
/// <returns></returns>
@@ -388,6 +388,53 @@ namespace MP_IO.Controllers
return answ;
}
/// <summary>
/// Processa una chiamata POST per l'invio di un array Json di oggetti di conf DataItems (es per MTC)
/// PUT: IOB/saveDataItems/SIMUL_03
/// </summary>
/// <param name="id">ID dell'IOB</param>
/// <returns></returns>
[HttpPost]
public string saveDataItems(string id)
{
string answ = "";
if (string.IsNullOrWhiteSpace(id))
{
answ = "Missing IOB";
}
else
{
// questa classe è derivata da Controller.Response... x cui recupero lo stream in altro modo...
string content = "";
System.Web.HttpContext.Current.Request.InputStream.Position = 0;
using (var reader = new StreamReader(Request.InputStream, System.Text.Encoding.UTF8, true, 4096, true))
{
content = reader.ReadToEnd();
}
// Rest
System.Web.HttpContext.Current.Request.InputStream.Position = 0;
#if false
// procedo a deserializzare in blocco l'oggetto...
plcMemMap currMemMap = null;
try
{
// deserializzo.
currMemMap = JsonConvert.DeserializeObject<plcMemMap>(content);
// se != null --> salvo!
if (currMemMap != null)
{
DataLayer.setIobMemMap(id, currMemMap);
answ = "OK";
}
}
catch
{ }
#endif
}
return answ;
}
/// <summary>
/// restituisce elenco parametri correnti come una List Json di oggetti objItem
/// GET: IOB/getObjItems/SIMUL_03
/// </summary>
+74
View File
@@ -0,0 +1,74 @@
using MapoSDK;
using MongoDB.Driver;
using System;
using System.Collections.Generic;
namespace MapoDb
{
/// <summary>
/// Classe gestione ALLARMI coem eventi speciali (documenti registrati su MongoDb)
/// </summary>
public class AlarmsArchive
{
string mdbConnString = "mongodb://W2019-MONGODB:27017";
//string mdbConnString = "mongodb://localhost:27017";
MongoClient client;
IMongoDatabase database;
public AlarmsArchive()
{
// rifare avvio con lettura da web.config...
client = new MongoClient(mdbConnString);
database = client.GetDatabase("MAPO");
}
/// <summary>
/// Singleton gestione istanza AlarmsManager
/// </summary>
public static AlarmsArchive man = new AlarmsArchive();
/// <summary>
/// Crea una registrazione incidente su MongoDB
/// </summary>
/// <param name="idxMacchina"></param>
/// <param name="elencoAllarmi"></param>
/// <param name="lastMinutes">numero di minuti precedenti di dati FluxLog da includere</param>
/// <returns></returns>
public int createIncident(string idxMacchina, List<alarmData> elencoAllarmi, int lastMinutes)
{
int answ = 0;
string currDateStr = "";
int startYMD = 0;
DateTime adesso = DateTime.Now;
int anno = adesso.Year;
currDateStr = adesso.ToString("yyyyMMdd");
int.TryParse(currDateStr, out startYMD);
// in primis recupero contatore allarmi correnti, lo incremento salvandolo e genero nuovo documento...
var collAlarmStats = database.GetCollection<alarmStats>("AlarmStats");
var builderAlarmStat = Builders<alarmStats>.Filter;
var filtThisYear = builderAlarmStat.Eq(u => u.year, anno);
var datiCorrenti = collAlarmStats.Find(filtThisYear);
var collAlarmEvents = database.GetCollection<alarmEvent>("AlarmEvents");
List<rawData> lastFluxLog = new List<rawData>();
DS_applicazione.FluxLogDataTable tabDati = DataLayer.obj.taFL.getFiltOrd(idxMacchina, adesso.AddMinutes(-lastMinutes), adesso, true);
if (tabDati.Count > 0)
{
// chiamo procedura x conversione
lastFluxLog = FluxArchive.man.convertTable(tabDati, adesso, timeWindow.free);
}
alarmEvent nuovoAllarme = new alarmEvent()
{
yCurr = anno,
yCounter = answ,
dateYMD = startYMD,
started = DateTime.Now,
blackBoxData = lastFluxLog,
activeConditions = elencoAllarmi
};
collAlarmEvents.InsertOne(nuovoAllarme);
return answ;
}
}
}
+1 -1
View File
@@ -138,7 +138,7 @@ namespace MapoDb
/// <param name="tabDati">Tabelal dei dati RAW registrati</param>
/// <param name="tStamp">Data di riferimento</param>
/// <param name="periodo">Periodo del campionamento desiderato (e passato coi dati che sono relativi a tale periodo...)</param>
protected List<rawData> convertTable(DS_applicazione.FluxLogDataTable tabDati, DateTime tStamp, timeWindow periodo)
public List<rawData> convertTable(DS_applicazione.FluxLogDataTable tabDati, DateTime tStamp, timeWindow periodo)
{
// init oggetti
List<rawData> listaRecords = new List<rawData>();
+1
View File
@@ -120,6 +120,7 @@
</Reference>
</ItemGroup>
<ItemGroup>
<Compile Include="AlarmsArchive.cs" />
<Compile Include="DataLayer.cs" />
<Compile Include="DS_applicazione.cs">
<DependentUpon>DS_applicazione.xsd</DependentUpon>
+4
View File
@@ -0,0 +1,4 @@
[*.cs]
# CA2227: Le proprietà delle raccolte devono essere di sola lettura
dotnet_diagnostic.CA2227.severity = none
+1
View File
@@ -62,6 +62,7 @@
/// </summary>
public enum timeWindow
{
free,
hour,
day,
week,
+1
View File
@@ -58,6 +58,7 @@
<Compile Include="Properties\AssemblyInfo.cs" />
</ItemGroup>
<ItemGroup>
<None Include=".editorconfig" />
<None Include="packages.config" />
</ItemGroup>
<ItemGroup>
+87
View File
@@ -439,6 +439,93 @@ namespace MapoSDK
/// </summary>
public string message { get; set; } = "";
}
/// <summary>
/// Definizione classe evento allarme
/// </summary>
public class alarmEvent
{
/// <summary>
/// Anno di riferimento allarme (per chiave yyyy.n)
/// </summary>
public int yCurr { get; set; } = 0;
/// <summary>
/// Contatore incrementale univoco annuale (per chiave yyyy.n)
/// </summary>
public int yCounter { get; set; } = 0;
/// <summary>
/// Data riferimento campione in formato YMD = yyyyMMdd
/// </summary>
public int dateYMD { get; set; } = 0;
/// <summary>
/// Data-Ora inizio evento
/// </summary>
public DateTime started { get; set; } = DateTime.Now;
/// <summary>
/// Data-Ora inizio evento
/// </summary>
public DateTime ended { get; set; } = DateTime.Now;
/// <summary>
/// Lista delle condizioni di allarme attive ad inizio evento
/// </summary>
public List<alarmData> activeConditions { get; set; } = null;
/// <summary>
/// Elenco dei dati di tipo FluxLog nei minuti antecedenti l'evento
/// </summary>
public List<rawData> blackBoxData { get; set; } = null;
}
/// <summary>
/// Definizione classe evento allarme
/// </summary>
public class alarmStats
{
/// <summary>
/// Anno riferimento
/// </summary>
public int year { get; set; } = 0;
/// <summary>
/// Valore Contatore univoco annuale raggiunto yyyy.n
/// </summary>
public int yCounter { get; set; } = 1;
/// <summary>
/// Valore cumulato complessivo degli allarmi registrati
/// </summary>
public double totalDuration { get; set; } = 0;
/// <summary>
/// Durata media annuale allarmi
/// </summary>
public double avgDuration
{
get
{
double answ = 0;
try
{
answ = totalDuration / yCounter;
}
catch
{ }
return answ;
}
}
}
/// <summary>
/// Definizione allarme
/// </summary>
public class alarmData
{
/// <summary>
/// Codice univoco
/// </summary>
public string code { get; set; } = "";
/// <summary>
/// Descrizione
/// </summary>
public string description { get; set; } = "";
/// <summary>
/// Severity (0....1000, minimo...massimo)
/// </summary>
public int severity { get; set; } = 0;
}
#endregion