update x acquisizione logtable da SOITAAB

This commit is contained in:
Samuele E. Locatelli
2023-04-21 15:14:37 +02:00
parent a10d23b131
commit 789defb69d
5 changed files with 106 additions and 353 deletions
@@ -1,6 +1,5 @@
{
"mMapWrite": {
},
"mMapRead": {
//"TotMerceProcTonn": {
@@ -25,5 +24,9 @@
// "period": 60,
// "factor": 1
//}
},
"optKVP": {
"path-remBase": "C:\\Temp"
//"path-remBase": "\\\\ecs900\\Logs"
}
}
}
@@ -1,324 +0,0 @@
{
"mMapWrite": { },
"mMapRead": {
"StatoMacchina": {
"name": "StatoMacchina",
"description": "Stato della Macchina",
"memAddr": "40001",
"tipoMem": "Int",
"index": 1,
"size": 1,
"func": "MAX",
"period": 90,
"factor": 1,
"minVal": 0,
"maxVal": 10,
"unit": "#"
},
"ElencoAnomalie": {
"name": "ElencoAnomalie",
"description": "Elenco Anomalie",
"memAddr": "40002",
"tipoMem": "Int",
"index": 2,
"size": 1,
"func": "MAX",
"period": 90,
"factor": 1,
"minVal": 0,
"maxVal": 10,
"unit": "#"
},
"ElencoAttivita": {
"name": "ElencoAttivita",
"description": "Elenco Attivita",
"memAddr": "40003",
"tipoMem": "Int",
"index": 3,
"size": 1,
"func": "MAX",
"period": 90,
"factor": 1,
"minVal": 0,
"maxVal": 10,
"unit": "#"
},
"StatoRicircolo": {
"name": "StatoRicircolo",
"description": "Stato Ricircolo Serbatoi",
"memAddr": "40004",
"tipoMem": "Int",
"index": 4,
"size": 1,
"func": "MAX",
"period": 90,
"factor": 1,
"minVal": 0,
"maxVal": 10,
"unit": "#"
},
"NumAllarmi": {
"name": "NumAllarmi",
"description": "NUmero Allarmi Presenti",
"memAddr": "40005",
"tipoMem": "Int",
"index": 5,
"size": 1,
"func": "MAX",
"period": 90,
"factor": 1,
"minVal": 0,
"maxVal": 1000,
"unit": "#"
},
"NumAllarmiNR": {
"name": "NumAllarmiNR",
"description": "NUmero Allarmi Non Riconosciuti",
"memAddr": "40006",
"tipoMem": "Int",
"index": 6,
"size": 1,
"func": "MAX",
"period": 90,
"factor": 1,
"minVal": 0,
"maxVal": 1000,
"unit": "#"
},
"ModoPreparazione": {
"name": "ModoPreparazione",
"description": "Modo Preparazione Ricetta",
"memAddr": "40007",
"tipoMem": "Int",
"index": 7,
"size": 1,
"func": "MAX",
"period": 90,
"factor": 1,
"minVal": 0,
"maxVal": 10,
"unit": "#"
},
"NumRicette": {
"name": "NumRicette",
"description": "Numero Ricette in coda",
"memAddr": "40008",
"tipoMem": "Int",
"index": 8,
"size": 1,
"func": "MAX",
"period": 90,
"factor": 1,
"minVal": 0,
"maxVal": 1000,
"unit": "#"
},
"StatoImport": {
"name": "StatoImport",
"description": "Stato Importazione file ricette XML da esterno",
"memAddr": "40009",
"tipoMem": "Int",
"index": 9,
"size": 1,
"func": "MAX",
"period": 90,
"factor": 1,
"minVal": 0,
"maxVal": 10,
"unit": "#"
},
"LivSerb01": {
"name": "LivSerb01",
"description": "Livello Servatoio 01",
"memAddr": "40020",
"tipoMem": "Int",
"index": 20,
"size": 1,
"func": "MAX",
"period": 90,
"factor": 1,
"minVal": 0,
"maxVal": 1000,
"unit": "#"
},
"LivSerb02": {
"name": "LivSerb02",
"description": "Livello Servatoio 02",
"memAddr": "40021",
"tipoMem": "Int",
"index": 21,
"size": 1,
"func": "MAX",
"period": 90,
"factor": 1,
"minVal": 0,
"maxVal": 1000,
"unit": "#"
},
"LivSerb03": {
"name": "LivSerb03",
"description": "Livello Servatoio 03",
"memAddr": "40022",
"tipoMem": "Int",
"index": 22,
"size": 1,
"func": "MAX",
"period": 90,
"factor": 1,
"minVal": 0,
"maxVal": 1000,
"unit": "#"
},
"LivSerb04": {
"name": "LivSerb04",
"description": "Livello Servatoio 04",
"memAddr": "40023",
"tipoMem": "Int",
"index": 23,
"size": 1,
"func": "MAX",
"period": 90,
"factor": 1,
"minVal": 0,
"maxVal": 1000,
"unit": "#"
},
"LivSerb05": {
"name": "LivSerb05",
"description": "Livello Servatoio 05",
"memAddr": "40024",
"tipoMem": "Int",
"index": 24,
"size": 1,
"func": "MAX",
"period": 90,
"factor": 1,
"minVal": 0,
"maxVal": 1000,
"unit": "#"
},
"LivSerb06": {
"name": "LivSerb06",
"description": "Livello Servatoio 06",
"memAddr": "40025",
"tipoMem": "Int",
"index": 25,
"size": 1,
"func": "MAX",
"period": 90,
"factor": 1,
"minVal": 0,
"maxVal": 1000,
"unit": "#"
},
"LivSerb07": {
"name": "LivSerb07",
"description": "Livello Servatoio 07",
"memAddr": "40026",
"tipoMem": "Int",
"index": 26,
"size": 1,
"func": "MAX",
"period": 90,
"factor": 1,
"minVal": 0,
"maxVal": 1000,
"unit": "#"
},
"LivSerb08": {
"name": "LivSerb08",
"description": "Livello Servatoio 08",
"memAddr": "40027",
"tipoMem": "Int",
"index": 27,
"size": 1,
"func": "MAX",
"period": 90,
"factor": 1,
"minVal": 0,
"maxVal": 1000,
"unit": "#"
},
"LivSerb09": {
"name": "LivSerb09",
"description": "Livello Servatoio 09",
"memAddr": "40028",
"tipoMem": "Int",
"index": 28,
"size": 1,
"func": "MAX",
"period": 90,
"factor": 1,
"minVal": 0,
"maxVal": 1000,
"unit": "#"
},
"LivSerb10": {
"name": "LivSerb10",
"description": "Livello Servatoio 10",
"memAddr": "40029",
"tipoMem": "Int",
"index": 29,
"size": 1,
"func": "MAX",
"period": 90,
"factor": 1,
"minVal": 0,
"maxVal": 1000,
"unit": "#"
},
"LivSerb11": {
"name": "LivSerb11",
"description": "Livello Servatoio 11",
"memAddr": "40030",
"tipoMem": "Int",
"index": 30,
"size": 1,
"func": "MAX",
"period": 90,
"factor": 1,
"minVal": 0,
"maxVal": 1000,
"unit": "#"
},
"LivSerb12": {
"name": "LivSerb12",
"description": "Livello Servatoio 12",
"memAddr": "40031",
"tipoMem": "Int",
"index": 31,
"size": 1,
"func": "MAX",
"period": 90,
"factor": 1,
"minVal": 0,
"maxVal": 1000,
"unit": "#"
}
},
"optMemPar": {
"AlarmIntCond": "40000|1=2",
"ManualBitCond": "40002.1=1",
"EStopBitCond": "40002.0=1",
"WorkIntCond": "40000|1=3",
"VarInt2Translate": "40001,40007",
"VarBit2Translate": "40003"
},
"itemTranslation": {
"40001_0": "Stato non aggiornato per mancanza comunicazione da computer",
"40001_1": "Stato non aggiornato per mancanza comunicazione da PLC",
"40001_2": "Presenza di anomalie od attività che limitano il funzionamento",
"40001_3": "Macchina impegnata per attività normale in corso",
"40001_4": "Macchina libera e pronta al funzionamento",
"40003.0": "Posizione di dosaggio impegnata",
"40003.1": "Bidone con ricetta terminata od annullata da rimuovere da posizione di dosaggio",
"40003.2": "Ricetta in preparazione",
"40003.3": "Lavaggio valvole in corso",
"40003.4": "Avvio caricamento nuova ricetta in corso",
"40007_0": "Nessuno",
"40007_1": "Singola ricetta",
"40007_2": "Coda (modo non ancora avviato)",
"40007_3": "Coda (modo avviato)",
"40007_4": "Correzione"
}
}
-3
View File
@@ -337,9 +337,6 @@
<None Include="DATA\CONF\PIZ10.json" />
<None Include="DATA\CONF\PIZ10_alarm.json" />
<None Include="DATA\CONF\PIZ10_MBlock.json" />
<None Include="DATA\CONF\Tend_FIMAT_01__bck.json">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="DATA\CONF\Tend_FIMAT_01.ini">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
+98 -21
View File
@@ -6,8 +6,11 @@ using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Net.NetworkInformation;
using System.Security.AccessControl;
using System.Web.UI;
using static IOB_UT_NEXT.CustomObj;
namespace IOB_WIN_NEXT
@@ -16,10 +19,19 @@ namespace IOB_WIN_NEXT
/// Adapter specializzato per LANTEK e le chiamate tramite DB per i dati
/// - PODL (ordini MES --> MACCHINA)
/// - ProdLog (da FasiDaLantek)
/// - LOGFile macchina diretto...
/// </summary>
public class IobSqlServLantek : IobGeneric
{
#region Protected Fields
protected int vetoReadDbSec = 3;
protected int VetoSyncDbSec = 20;
#endregion Protected Fields
#region Public Constructors
/// <summary>
@@ -37,6 +49,13 @@ namespace IOB_WIN_NEXT
string VetoReadSec = getOptPar("VetoReadSec");
string VetoSyncSec = getOptPar("VetoSyncSec");
setupSpecialParams();
if (pathList.ContainsKey("path-remBase"))
{
logDirPath = pathList["path-remBase"];
}
getRemoteLog();
string connSyncState = $"data source={SyncStateServ};initial catalog={SyncStateDb};persist security info=True;user id={SyncStateUser};password={SyncStatePwd};MultipleActiveResultSets=True;App=IOB-WIN-NEXT";
// gestione command timeout da https://erikej.github.io/sqlclient/2020/10/26/sqlclient-commandtimeout-preview.html
@@ -61,6 +80,23 @@ namespace IOB_WIN_NEXT
#endregion Public Constructors
#region Protected Properties
protected DbController dbProxy { get; set; } = null;
/// <summary>
/// Stato di sync delle tab gestite
/// </summary>
protected List<SyncStateModel> elencoSyncState { get; set; } = new List<SyncStateModel>();
#endregion Protected Properties
#region Private Properties
private string logDirPath { get; set; } = "\\\\ecs900\\Logs";
#endregion Private Properties
#region Public Methods
/// <summary>
@@ -244,6 +280,7 @@ namespace IOB_WIN_NEXT
// recupero syncState
elencoSyncState = dbProxy.SyncStateGetAll();
// verifico SignLog e processo
bool acquireLog = getRemoteLog();
bool sentSignLog = processSignLogTable(adesso);
// verifico ProdData e processo
bool sentProdData = processProdDataTable(adesso);
@@ -336,25 +373,6 @@ namespace IOB_WIN_NEXT
#endregion Public Methods
#region Protected Fields
protected int vetoReadDbSec = 3;
protected int VetoSyncDbSec = 20;
#endregion Protected Fields
#region Protected Properties
protected DbController dbProxy { get; set; } = null;
/// <summary>
/// Stato di sync delle tab gestite
/// </summary>
protected List<SyncStateModel> elencoSyncState { get; set; } = new List<SyncStateModel>();
#endregion Protected Properties
#region Private Methods
/// <summary>
@@ -426,6 +444,46 @@ namespace IOB_WIN_NEXT
}
}
/// <summary>
/// Recupera file log da analizzare
/// </summary>
/// <returns></returns>
private bool getRemoteLog()
{
bool answ = false;
if (Directory.Exists(logDirPath))
{
string filePath = Path.Combine(logDirPath, $"Report-{DateTime.Today.Day}.txt");
bool hasDaily = File.Exists(filePath);
// cerco file quotidiano...
if (!hasDaily)
{
var fileList = Directory.GetFiles(logDirPath, "Report-*.txt");
DateTime lastMod = DateTime.Today.AddYears(-1);
foreach (var cFile in fileList)
{
var tempFile = Path.Combine(logDirPath, cFile);
var lwTime = File.GetLastWriteTime(tempFile);
if (lwTime >= lastMod)
{
lastMod = lwTime;
filePath = tempFile;
}
}
}
// leggo file
string rawVal = File.ReadAllText(Path.Combine(logDirPath, filePath));
if (!string.IsNullOrEmpty(rawVal))
{
// salvo in redis
string redKey = redisMan.redHash($"IOB:CurrData:{cIobConf.codIOB}:LogFile:Act");
redisMan.setRSV(redKey, rawVal);
answ = true;
}
}
return answ;
}
/// <summary>
/// Esegue processing + invio dati tab SignLog
/// </summary>
@@ -596,8 +654,27 @@ namespace IOB_WIN_NEXT
// verifica se ci siano dati da trasmettere (sui valori LastIdx)
if (currSignLogRead.LastIdx > currSignLogSent.LastIdx)
{
// recupero i dati dal DB...
var data2send = dbProxy.MachSigLogGetNew(currSignLogSent.LastIdx);
// init oggetto x processing
Dictionary<DateTime, int> sigLogFromFile = new Dictionary<DateTime, int>();
// recupero i dati dai logs files, attuale e nuovo...
string redKeyAct = redisMan.redHash($"IOB:CurrData:{cIobConf.codIOB}:LogFile:Act");
string redKeyLast = redisMan.redHash($"IOB:CurrData:{cIobConf.codIOB}:LogFile:Last");
string fileAct = redisMan.getRSV(redKeyAct);
string fileLast = redisMan.getRSV(redKeyLast);
// confronto con i dati dell'ultimo LOG FILE processato
int lenghtAct = fileAct.Length;
int lenghtLast = fileLast.Length;
if (lenghtAct > 0 && lenghtAct > lenghtLast)
{
// prendo SOLAMENTE le righe nuove
// processo le righe nuove trasformandole in un elenco data/codice evento
// salvo in last il valore di act...
redisMan.setRSV(redKeyLast, fileAct);
}
List<MachSigLogModel> data2send = dbProxy.MachSigLogGetNew(currSignLogSent.LastIdx);
// se ho dati preparo invio
if (data2send != null && data2send.Count > 0)
{
+3 -3
View File
@@ -366,7 +366,7 @@ namespace IOB_WIN_NEXT
sw.Start();
elencoSyncState = dbProxy.SyncStateDoExportAll();
sw.Stop();
DateTime adesso= DateTime.Now;
DateTime adesso = DateTime.Now;
lastReadPLC = adesso;
lgInfo($"DB: esecuzione task dbProxy.SyncStateDoExportAll() in {sw.ElapsedMilliseconds} ms");
@@ -436,7 +436,7 @@ namespace IOB_WIN_NEXT
bool fatto = false;
string tabNameIn = "FluxLog";
string tabNameOut = "FluxLogToMes";
// cerco info sui SignLog (ToMes e letti)
// cerco info sui FluxLog (ToMes e letti)
var currFluxLogRead = elencoSyncState.FirstOrDefault(x => x.TableName == tabNameIn);
// se nullo inizializzo
if (currFluxLogRead == null)
@@ -617,7 +617,7 @@ namespace IOB_WIN_NEXT
if (currSignLogRead.LastIdx > currSignLogSent.LastIdx)
{
// recupero i dati dal DB...
var data2send = dbProxy.MachSigLogGetNew(currSignLogSent.LastIdx);
List<MachSigLogModel> data2send = dbProxy.MachSigLogGetNew(currSignLogSent.LastIdx);
// se ho dati preparo invio
if (data2send != null && data2send.Count > 0)
{