diff --git a/MP-IO/Controllers/IOBController.cs b/MP-IO/Controllers/IOBController.cs
index db25d901..144aec8b 100644
--- a/MP-IO/Controllers/IOBController.cs
+++ b/MP-IO/Controllers/IOBController.cs
@@ -346,7 +346,7 @@ namespace MP_IO.Controllers
}
///
/// Processa una chiamata POST per l'invio di un array Json di oggetti plcMemConf
- /// PUT: IOB/flogJson/SIMUL_03
+ /// PUT: IOB/saveConf/SIMUL_03
///
/// ID dell'IOB
///
@@ -388,6 +388,53 @@ namespace MP_IO.Controllers
return answ;
}
///
+ /// Processa una chiamata POST per l'invio di un array Json di oggetti di conf DataItems (es per MTC)
+ /// PUT: IOB/saveDataItems/SIMUL_03
+ ///
+ /// ID dell'IOB
+ ///
+ [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(content);
+ // se != null --> salvo!
+ if (currMemMap != null)
+ {
+ DataLayer.setIobMemMap(id, currMemMap);
+ answ = "OK";
+ }
+ }
+ catch
+ { }
+#endif
+ }
+ return answ;
+ }
+ ///
/// restituisce elenco parametri correnti come una List Json di oggetti objItem
/// GET: IOB/getObjItems/SIMUL_03
///
diff --git a/MapoDb/AlarmsArchive.cs b/MapoDb/AlarmsArchive.cs
new file mode 100644
index 00000000..2e2fae5a
--- /dev/null
+++ b/MapoDb/AlarmsArchive.cs
@@ -0,0 +1,74 @@
+using MapoSDK;
+using MongoDB.Driver;
+using System;
+using System.Collections.Generic;
+
+namespace MapoDb
+{
+ ///
+ /// Classe gestione ALLARMI coem eventi speciali (documenti registrati su MongoDb)
+ ///
+ 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");
+
+ }
+ ///
+ /// Singleton gestione istanza AlarmsManager
+ ///
+ public static AlarmsArchive man = new AlarmsArchive();
+ ///
+ /// Crea una registrazione incidente su MongoDB
+ ///
+ ///
+ ///
+ /// numero di minuti precedenti di dati FluxLog da includere
+ ///
+ public int createIncident(string idxMacchina, List 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");
+ var builderAlarmStat = Builders.Filter;
+ var filtThisYear = builderAlarmStat.Eq(u => u.year, anno);
+
+ var datiCorrenti = collAlarmStats.Find(filtThisYear);
+ var collAlarmEvents = database.GetCollection("AlarmEvents");
+
+ List lastFluxLog = new List();
+ 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;
+ }
+ }
+}
diff --git a/MapoDb/FluxArchive.cs b/MapoDb/FluxArchive.cs
index 351a78a7..5e91d4ba 100644
--- a/MapoDb/FluxArchive.cs
+++ b/MapoDb/FluxArchive.cs
@@ -138,7 +138,7 @@ namespace MapoDb
/// Tabelal dei dati RAW registrati
/// Data di riferimento
/// Periodo del campionamento desiderato (e passato coi dati che sono relativi a tale periodo...)
- protected List convertTable(DS_applicazione.FluxLogDataTable tabDati, DateTime tStamp, timeWindow periodo)
+ public List convertTable(DS_applicazione.FluxLogDataTable tabDati, DateTime tStamp, timeWindow periodo)
{
// init oggetti
List listaRecords = new List();
diff --git a/MapoDb/MapoDb.csproj b/MapoDb/MapoDb.csproj
index 150ef558..c1fb0fa8 100644
--- a/MapoDb/MapoDb.csproj
+++ b/MapoDb/MapoDb.csproj
@@ -120,6 +120,7 @@
+
DS_applicazione.xsd
diff --git a/MapoSDK/.editorconfig b/MapoSDK/.editorconfig
new file mode 100644
index 00000000..f07b59b1
--- /dev/null
+++ b/MapoSDK/.editorconfig
@@ -0,0 +1,4 @@
+[*.cs]
+
+# CA2227: Le proprietà delle raccolte devono essere di sola lettura
+dotnet_diagnostic.CA2227.severity = none
diff --git a/MapoSDK/Enums.cs b/MapoSDK/Enums.cs
index 17def9d2..1c49c2f6 100644
--- a/MapoSDK/Enums.cs
+++ b/MapoSDK/Enums.cs
@@ -62,6 +62,7 @@
///
public enum timeWindow
{
+ free,
hour,
day,
week,
diff --git a/MapoSDK/MapoSDK.csproj b/MapoSDK/MapoSDK.csproj
index af77f46a..7d1bba26 100644
--- a/MapoSDK/MapoSDK.csproj
+++ b/MapoSDK/MapoSDK.csproj
@@ -58,6 +58,7 @@
+
diff --git a/MapoSDK/Objects.cs b/MapoSDK/Objects.cs
index 3ea9750f..0c4a1f2d 100644
--- a/MapoSDK/Objects.cs
+++ b/MapoSDK/Objects.cs
@@ -439,6 +439,93 @@ namespace MapoSDK
///
public string message { get; set; } = "";
}
+ ///
+ /// Definizione classe evento allarme
+ ///
+ public class alarmEvent
+ {
+ ///
+ /// Anno di riferimento allarme (per chiave yyyy.n)
+ ///
+ public int yCurr { get; set; } = 0;
+ ///
+ /// Contatore incrementale univoco annuale (per chiave yyyy.n)
+ ///
+ public int yCounter { get; set; } = 0;
+ ///
+ /// Data riferimento campione in formato YMD = yyyyMMdd
+ ///
+ public int dateYMD { get; set; } = 0;
+ ///
+ /// Data-Ora inizio evento
+ ///
+ public DateTime started { get; set; } = DateTime.Now;
+ ///
+ /// Data-Ora inizio evento
+ ///
+ public DateTime ended { get; set; } = DateTime.Now;
+ ///
+ /// Lista delle condizioni di allarme attive ad inizio evento
+ ///
+ public List activeConditions { get; set; } = null;
+ ///
+ /// Elenco dei dati di tipo FluxLog nei minuti antecedenti l'evento
+ ///
+ public List blackBoxData { get; set; } = null;
+ }
+ ///
+ /// Definizione classe evento allarme
+ ///
+ public class alarmStats
+ {
+ ///
+ /// Anno riferimento
+ ///
+ public int year { get; set; } = 0;
+ ///
+ /// Valore Contatore univoco annuale raggiunto yyyy.n
+ ///
+ public int yCounter { get; set; } = 1;
+ ///
+ /// Valore cumulato complessivo degli allarmi registrati
+ ///
+ public double totalDuration { get; set; } = 0;
+ ///
+ /// Durata media annuale allarmi
+ ///
+ public double avgDuration
+ {
+ get
+ {
+ double answ = 0;
+ try
+ {
+ answ = totalDuration / yCounter;
+ }
+ catch
+ { }
+ return answ;
+ }
+ }
+ }
+ ///
+ /// Definizione allarme
+ ///
+ public class alarmData
+ {
+ ///
+ /// Codice univoco
+ ///
+ public string code { get; set; } = "";
+ ///
+ /// Descrizione
+ ///
+ public string description { get; set; } = "";
+ ///
+ /// Severity (0....1000, minimo...massimo)
+ ///
+ public int severity { get; set; } = 0;
+ }
#endregion