update x acquisizione logtable da SOITAAB
This commit is contained in:
@@ -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"
|
||||
}
|
||||
}
|
||||
@@ -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>
|
||||
|
||||
@@ -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)
|
||||
{
|
||||
|
||||
@@ -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)
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user