From bbf02de499cda725a213a69aa751db515d8690b8 Mon Sep 17 00:00:00 2001 From: Samuele Locatelli Date: Mon, 14 Jul 2025 14:47:04 +0200 Subject: [PATCH] Update gestione track dati (riduzione num tracciamenti attivi) --- IOB-UT-NEXT/Config/Base/FluxLogDto.cs | 2 +- IOB-UT-NEXT/DataQueue.cs | 5 +- IOB-UT-NEXT/Iob/BaseObj.cs | 86 +++++++++++++++++---------- IOB-UT-NEXT/IobWinStatus.cs | 8 +-- IOB-WIN-FORM/Iob/Generic.Protected.cs | 46 +++++++------- IOB-WIN-FORM/Iob/Generic.Public.cs | 15 ++--- IOB-WIN-FORM/Iob/PingWatchDog.cs | 14 +---- IOB-WIN-SHELLY/Iob/ShellyClient.cs | 18 ++---- 8 files changed, 97 insertions(+), 97 deletions(-) diff --git a/IOB-UT-NEXT/Config/Base/FluxLogDto.cs b/IOB-UT-NEXT/Config/Base/FluxLogDto.cs index add4604d..12af62ef 100644 --- a/IOB-UT-NEXT/Config/Base/FluxLogDto.cs +++ b/IOB-UT-NEXT/Config/Base/FluxLogDto.cs @@ -96,7 +96,7 @@ namespace IOB_UT_NEXT.Config.Base /// /// Valore soglia x registrare eventi FluxLog TrackData /// - public int TrackDataThreshold { get; set; } = 10; + public int TrackDataThreshold { get; set; } = 20; /// /// Durata (in secondi) del veto ad invio snapshot (per evitare doppi click e doppio snapshot/dossier) diff --git a/IOB-UT-NEXT/DataQueue.cs b/IOB-UT-NEXT/DataQueue.cs index 9c72204b..1dfed082 100644 --- a/IOB-UT-NEXT/DataQueue.cs +++ b/IOB-UT-NEXT/DataQueue.cs @@ -18,11 +18,12 @@ namespace IOB_UT_NEXT #region Public Constructors - public DataQueue(string codIOB, string qName, bool useRedis) + public DataQueue(string codIOB, string qName, bool useRedis, RedisIobCache redisCacheMan) { UseRedis = useRedis; CodIOB = codIOB; QueueName = qName; + redisMan = redisCacheMan; KeyName = redisMan.redHash($"IOB:QUEUE:{CodIOB}:{QueueName}"); } @@ -131,7 +132,7 @@ namespace IOB_UT_NEXT /// /// Oggetto connessione REDIS /// - private RedisIobCache redisMan { get; set; } = new RedisIobCache(); + private RedisIobCache redisMan; // { get; set; } = new RedisIobCache(); #endregion Private Properties } diff --git a/IOB-UT-NEXT/Iob/BaseObj.cs b/IOB-UT-NEXT/Iob/BaseObj.cs index 22c100da..ff619dc9 100644 --- a/IOB-UT-NEXT/Iob/BaseObj.cs +++ b/IOB-UT-NEXT/Iob/BaseObj.cs @@ -55,11 +55,6 @@ namespace IOB_UT_NEXT.Iob public IobConfiguration cIobConf; #endif - /// - /// Configurazione gerarchica completa (v 4.x.x.x) - /// - public IobConfTree IOBConfFull; - /// /// Conteggio ATTUALE ore macchina IN LAVORO /// @@ -135,6 +130,11 @@ namespace IOB_UT_NEXT.Iob /// public bool hasBigEndian = false; + /// + /// Configurazione gerarchica completa (v 4.x.x.x) + /// + public IobConfTree IOBConfFull; + /// /// dataOra ultima verifica CNC disconnesso... /// @@ -200,6 +200,11 @@ namespace IOB_UT_NEXT.Iob /// public bool needRefreshPzCount = true; + /// + /// Coda degli esiti di ping x calcolo stato macchina + /// + public DataQueue PingQueue; + /// /// Determina se utilizzare blocchi di memoria IOT contigui (e quindi processing /// "monoblocco" semplificato"= @@ -209,33 +214,33 @@ namespace IOB_UT_NEXT.Iob /// /// Coda valori ALLARMI ove gestiti... /// - public DataQueue QueueAlarm = new DataQueue("000", "QueueAlarm", false); + public DataQueue QueueAlarm;// = new DataQueue("000", "QueueAlarm", false); /// /// Oggetto della coda degli elementi letti di tipo FluxLog (e non ancora trasmessi) /// - public DataQueue QueueFLog = new DataQueue("000", "QueueFLog", false); + public DataQueue QueueFLog;// = new DataQueue("000", "QueueFLog", false); /// /// Oggetto della coda degli elementi letti (e non ancora trasmessi) /// - public DataQueue QueueIN = new DataQueue("000", "QueueIN", false); + public DataQueue QueueIN;// = new DataQueue("000", "QueueIN", false); /// /// Coda valori MESSAGGI/EVENTI (da non sottocampionare come samples)... /// - public DataQueue QueueMessages = new DataQueue("000", "QueueMessages", false); + public DataQueue QueueMessages;// = new DataQueue("000", "QueueMessages", false); /// /// Oggetto della coda degli elementi di tipo RawTransf (e non ancora trasmessi) /// NB: sono salvati serializzati come stringhe /// - public DataQueue QueueRawTransf = new DataQueue("000", "QueueRawTransf", false); + public DataQueue QueueRawTransf;// = new DataQueue("000", "QueueRawTransf", false); /// /// Coda valori LOG UTENTE (da non sottocampionare come samples)... /// - public DataQueue QueueULog = new DataQueue("000", "QueueULog", false); + public DataQueue QueueULog;// = new DataQueue("000", "QueueULog", false); /// /// alias booleano false = R @@ -493,43 +498,42 @@ namespace IOB_UT_NEXT.Iob #region Protected Fields - /// - /// wrapper di log - /// - private static readonly Logger lg = LogManager.GetCurrentClassLogger(); - - //protected static Logger lg = LogManager.GetCurrentClassLogger(); - /// /// Valore di attesa (random) dopo ogni invio x evitare congestione send... /// protected static int urlRandWait = 0; - /// - /// Abilitazione invio conf macchine - /// - protected bool enabSendMachineConf = true; - - /// - /// Indica se resettare allarmi all'avvio e inviare il reset appena parte adapter - /// - protected bool resetAlarmOnStart = false; - /// /// Disabilitazione gestione ODL (lettura e gestione) /// protected bool disableOdl = false; + //protected static Logger lg = LogManager.GetCurrentClassLogger(); + /// + /// Abilitazione invio conf macchine + /// + protected bool enabSendMachineConf = true; + /// /// Ultimo LOG registrazione avvio (x ridurre log notturni...) /// protected DateTime lastLogStartup = DateTime.Today.AddHours(-1); + /// + /// Dimensione coda di ping x valutazione + /// + protected int maxQueuePing = 11; + /// /// Tempo minimo ammissibile di risposta (es x errori ModBus che risponde troppo in fretta) in millisec /// protected int minRespTimeMs = 5; + /// + /// Indica se resettare allarmi all'avvio e inviare il reset appena parte adapter + /// + protected bool resetAlarmOnStart = false; + /// /// Veto per registrazione completa log di startup (minuti) /// @@ -616,12 +620,34 @@ namespace IOB_UT_NEXT.Iob return doVeto; } + /// + /// Setup di tutti gli oggetti Queue, ma solo alcuni hanno coda REDIS (quelli senza sono "sacrificabili" + /// + protected void SetupQueue() + { + string codIob = IOBConfFull.General.FilenameIOB; + bool useRedis = IOBConfFull.General.EnabRedisQue; + QueueAlarm = new DataQueue(codIob, "QueueAlarm", false, redisMan); + // valutare se portare di nuovo in redis... + QueueIN = new DataQueue(codIob, "QueueIN", useRedis, redisMan); + QueueFLog = new DataQueue(codIob, "QueueFLog", useRedis, redisMan); + QueueMessages = new DataQueue(codIob, "QueueMessages", false, redisMan); + QueueRawTransf = new DataQueue(codIob, "QueueRawTransf", false, redisMan); + QueueULog = new DataQueue(codIob, "QueueULog", false, redisMan); + PingQueue = new DataQueue(codIob, "PingQueue", false, redisMan); + } + #endregion Protected Methods - #region Private Properties + #region Private Fields + + /// + /// wrapper di log + /// + private static readonly Logger lg = LogManager.GetCurrentClassLogger(); private static Random rnd = new Random(); - #endregion Private Properties + #endregion Private Fields } } \ No newline at end of file diff --git a/IOB-UT-NEXT/IobWinStatus.cs b/IOB-UT-NEXT/IobWinStatus.cs index 041d7b8e..ac431f28 100644 --- a/IOB-UT-NEXT/IobWinStatus.cs +++ b/IOB-UT-NEXT/IobWinStatus.cs @@ -58,7 +58,7 @@ namespace IOB_UT_NEXT /// /// Valore minimo da considerare come delta secondi x indicare variazione sui dati temporali /// - public int minDeltaSec { get; set; } = 5; + public int minDeltaSec { get; set; } = 15; /// /// Status del SINGOLO IOB @@ -126,13 +126,13 @@ namespace IOB_UT_NEXT if (online != item.online) return false; - // controllo se sia ALMENO 10 sec... + // controllo se sia ALMENO 15 sec... if (lastUpdate != item.lastUpdate) { if (lastUpdate.Subtract(item.lastUpdate).TotalSeconds > minDeltaSec) return false; } - // controllo se sia ALMENO 3 sec... + // controllo se sia ALMENO 15 sec... if (lastDataIn != item.lastDataIn) { if (lastDataIn.Subtract(item.lastDataIn).TotalSeconds > minDeltaSec) @@ -141,7 +141,7 @@ namespace IOB_UT_NEXT // controllo se sia ALMENO 5 sec... if (lastDataOut != item.lastDataOut) { - if (lastDataOut.Subtract(item.lastDataOut).TotalSeconds > minDeltaSec) + if (lastDataOut.Subtract(item.lastDataOut).TotalSeconds > minDeltaSec / 3) return false; } if (semIn != item.semIn) diff --git a/IOB-WIN-FORM/Iob/Generic.Protected.cs b/IOB-WIN-FORM/Iob/Generic.Protected.cs index 0a0d602e..c97de8b6 100644 --- a/IOB-WIN-FORM/Iob/Generic.Protected.cs +++ b/IOB-WIN-FORM/Iob/Generic.Protected.cs @@ -3633,7 +3633,7 @@ namespace IOB_WIN_FORM.Iob /// /// Dim pacchetto (numero byte scambiati/ricevuti) /// Dim minima x registrare info - protected void trackExchData(long byteSize, long val2rec = 256) + protected void trackExchData(long byteSize, long val2rec = 512) { // accumulo counter byte currByteCount += byteSize; @@ -3652,7 +3652,7 @@ namespace IOB_WIN_FORM.Iob /// Track dati ricevuti generici (serializzando) /// /// - protected void trackExchDataRaw(object genObj, long val2rec = 256) + protected void trackExchDataRaw(object genObj, long val2rec = 512) { try { @@ -4531,7 +4531,7 @@ namespace IOB_WIN_FORM.Iob TrackDayStatsCount.Add(key, 1); } // dettaglio รจ insieme key_val - string detKey = $"{key}|{value}"; + string detKey = $"{key}:{value}"; if (TrackDayStatsCount.ContainsKey(detKey)) { TrackDayStatsCount[detKey]++; @@ -4568,6 +4568,7 @@ namespace IOB_WIN_FORM.Iob // se ho --> processo! if (numOver > 0) { + // scadenza: 1 mese DateTime scadHash = DateTime.Today.AddMonths(1); // salvo statistiche Day rKey = $"{redisMan.redIobTrackKey}:DayStats:{LastDayCurr}"; @@ -4576,20 +4577,20 @@ namespace IOB_WIN_FORM.Iob // traccio con scadenza 1 mese da oggi pareto chiamate giornaliere redisMan.redIncrHashCount(rKey, item.Key, scadHash, item.Value); } - // salvo statistiche Detail, scadenza 15 gg - scadHash = DateTime.Today.AddDays(15); + // salvo statistiche Detail, scadenza 10 gg + scadHash = DateTime.Today.AddDays(10); foreach (var item in TrackDetStatsCount) { // separo statistiche... - var kvp = item.Key.Split('|'); + var kvp = item.Key.Split(':'); if (kvp.Count() > 1) { rKey = $"{redisMan.redIobTrackKey}:DetailStats:{LastDayCurr}:{kvp[0]}"; redisMan.redIncrHashCount(rKey, kvp[1], scadHash, item.Value); } } - // salvo dizionario valori dettaglio... scadenza 5 gg - scadHash = DateTime.Today.AddDays(5); + // salvo dizionario valori dettaglio... scadenza 3 gg + scadHash = DateTime.Today.AddDays(3); foreach (var item in TrackDetValsCount) { rKey = $"{redisMan.redIobTrackKey}:DataLog:{LastDayCurr}:{item.Key}"; @@ -5147,18 +5148,15 @@ namespace IOB_WIN_FORM.Iob // svuoto code se richiesto if (resetQueue) { - QueueAlarm = new DataQueue(IOBConfFull.General.CodIOB, "QueueAlarm", IOBConfFull.General.EnabRedisQue); - //QueueAlarm = new ConcurrentQueue(); - QueueIN = new DataQueue(IOBConfFull.General.CodIOB, "QueueIN", IOBConfFull.General.EnabRedisQue); - //QueueIN = new ConcurrentQueue(); - QueueFLog = new DataQueue(IOBConfFull.General.CodIOB, "QueueFLog", IOBConfFull.General.EnabRedisQue); - //QueueFLog = new ConcurrentQueue(); - QueueMessages = new DataQueue(IOBConfFull.General.CodIOB, "QueueMessages", IOBConfFull.General.EnabRedisQue); - //QueueMessages = new ConcurrentQueue(); - QueueRawTransf = new DataQueue(IOBConfFull.General.CodIOB, "QueueRawTransf", IOBConfFull.General.EnabRedisQue); - //QueueRawTransf = new ConcurrentQueue(); - QueueULog = new DataQueue(IOBConfFull.General.CodIOB, "QueueULog", IOBConfFull.General.EnabRedisQue); - //QueueULog = new ConcurrentQueue(); + string codIob = IOBConfFull.General.FilenameIOB; + bool useRedis = IOBConfFull.General.EnabRedisQue; + QueueAlarm = new DataQueue(codIob, "QueueAlarm", false, redisMan); + QueueIN = new DataQueue(codIob, "QueueIN", useRedis, redisMan); + QueueFLog = new DataQueue(codIob, "QueueFLog", useRedis, redisMan); + QueueMessages = new DataQueue(codIob, "QueueMessages", false, redisMan); + QueueRawTransf = new DataQueue(codIob, "QueueRawTransf", false, redisMan); + QueueULog = new DataQueue(codIob, "QueueULog", false, redisMan); + PingQueue = new DataQueue(codIob, "PingQueue", false, redisMan); } // imposto contatori blink a zero... i_counters = new int[32]; @@ -5291,8 +5289,7 @@ namespace IOB_WIN_FORM.Iob // invio sendDataBlock(urlType.FLog, listaValori); // svuoto! - QueueFLog = new DataQueue(IOBConfFull.General.CodIOB, "QueueFLog", IOBConfFull.General.EnabRedisQue); - //QueueFLog = new ConcurrentQueue(); + QueueFLog = new DataQueue(IOBConfFull.General.FilenameIOB, "QueueFLog", IOBConfFull.General.EnabRedisQue, redisMan); lastWatchDog = DateTime.Now; } } @@ -5363,8 +5360,7 @@ namespace IOB_WIN_FORM.Iob if (fatto) { // svuoto se ha okReport! - QueueRawTransf = new DataQueue(IOBConfFull.General.CodIOB, "QueueRawTransf", IOBConfFull.General.EnabRedisQue); - //QueueRawTransf = new ConcurrentQueue(); + QueueRawTransf = new DataQueue(IOBConfFull.General.FilenameIOB, "QueueRawTransf", false, redisMan); } } } @@ -5425,7 +5421,7 @@ namespace IOB_WIN_FORM.Iob // invio sendDataBlock(urlType.ULog, listaValori); // svuoto! - QueueULog = new DataQueue(IOBConfFull.General.CodIOB, "QueueULog", IOBConfFull.General.EnabRedisQue); + QueueULog = new DataQueue(IOBConfFull.General.FilenameIOB, "QueueULog", false, redisMan); } } else diff --git a/IOB-WIN-FORM/Iob/Generic.Public.cs b/IOB-WIN-FORM/Iob/Generic.Public.cs index b9f091a5..5aa5bdbc 100644 --- a/IOB-WIN-FORM/Iob/Generic.Public.cs +++ b/IOB-WIN-FORM/Iob/Generic.Public.cs @@ -50,7 +50,9 @@ namespace IOB_WIN_FORM.Iob // init oggetto redis... redisMan = new RedisIobCache(IobConfNew.MapoMes.IpAddr, IobConfNew.General.FilenameIOB, $"{IobConfNew.General.IobType}", IobConfNew.General.MinDeltaSec); - //redisMan = new RedisIobCache(IOBConf.serverData.MPIP, IOBConf.codIOB, $"{IOBConf.tipoIob}", IOBConf.minDeltaSec); + + // init code + SetupQueue(); // initi oggetto TCMan tcMan = new TCMan(IobConfNew.TCDataConf.Lambda, IobConfNew.TCDataConf.MaxDelayFactor, IobConfNew.TCDataConf.MaxIncrPz); @@ -58,9 +60,6 @@ namespace IOB_WIN_FORM.Iob // salvo il form chiamante parentForm = caller; - // imposto le code! - QueueIN = new DataQueue(IOBConfFull.General.FilenameIOB, "QueueIN", IOBConfFull.General.EnabRedisQue); - lastConnectTry = DateTime.Now; lgInfo("Avvio preliminare AdapterGeneric"); @@ -3317,8 +3316,7 @@ namespace IOB_WIN_FORM.Iob // invio sendDataBlock(urlType.FLog, listaValori); // svuoto! - QueueFLog = new DataQueue(IOBConfFull.General.CodIOB, "QueueFLog", IOBConfFull.General.EnabRedisQue); - //QueueFLog = new ConcurrentQueue(); + QueueFLog = new DataQueue(IOBConfFull.General.FilenameIOB, "QueueFLog", IOBConfFull.General.EnabRedisQue, redisMan); } } // HO FINITO invio di FLog... @@ -3357,7 +3355,7 @@ namespace IOB_WIN_FORM.Iob // invio sendDataBlock(urlType.ULog, listaValori); // svuoto! - QueueULog = new DataQueue(IOBConfFull.General.CodIOB, "QueueULog", IOBConfFull.General.EnabRedisQue); + QueueULog = new DataQueue(IOBConfFull.General.FilenameIOB, "QueueULog", false, redisMan); } } } @@ -3420,8 +3418,7 @@ namespace IOB_WIN_FORM.Iob // invio sendDataBlock(urlType.SignIN, listaValori); // svuoto! - QueueIN = new DataQueue(IOBConfFull.General.CodIOB, "QueueIN", IOBConfFull.General.EnabRedisQue); - //QueueIN = new ConcurrentQueue(); + QueueIN = new DataQueue(IOBConfFull.General.FilenameIOB, "QueueIN", IOBConfFull.General.EnabRedisQue, redisMan); } } else diff --git a/IOB-WIN-FORM/Iob/PingWatchDog.cs b/IOB-WIN-FORM/Iob/PingWatchDog.cs index 865d5319..bb40ac23 100644 --- a/IOB-WIN-FORM/Iob/PingWatchDog.cs +++ b/IOB-WIN-FORM/Iob/PingWatchDog.cs @@ -40,7 +40,7 @@ namespace IOB_WIN_FORM.Iob bInOn = IOBConfFull.Special.PingConf.B_PowerOn; vetoCheckSec = IOBConfFull.Special.PingConf.VetoCheckSec; // fix coda ping - PingQueue = new DataQueue("000", "PingQueue", false); + PingQueue = new DataQueue(IOBConfFull.General.FilenameIOB, "PingQueue", false, redisMan); lgDebug($"L'adapter effettuera' PING di controllo all'indirizzo {IOBConfFull.Device.Connect.IpAddr} per forzare stato poweroff dopo {PoweroffTimeoutSec} sec"); } @@ -210,16 +210,6 @@ namespace IOB_WIN_FORM.Iob #region Protected Fields - /// - /// Dimensione coda di ping x valutazione - /// - protected int maxQueuePing = 11; - - /// - /// Coda degli esiti di ping x calcolo stato macchina - /// - protected DataQueue PingQueue = new DataQueue("000", "PingQueue", false); - protected int PoweroffTimeoutSec = 100; /// @@ -238,7 +228,7 @@ namespace IOB_WIN_FORM.Iob if (B_input == 0 && pingOk) { B_input = 1; - PingQueue = new DataQueue("000", "PingQueue", false); + PingQueue = new DataQueue(IOBConfFull.General.FilenameIOB, "PingQueue", false, redisMan); lgTrace($"PingQueue resetted on addTest"); } PingQueue.Enqueue($"{score}"); diff --git a/IOB-WIN-SHELLY/Iob/ShellyClient.cs b/IOB-WIN-SHELLY/Iob/ShellyClient.cs index 3e459062..bae4448e 100644 --- a/IOB-WIN-SHELLY/Iob/ShellyClient.cs +++ b/IOB-WIN-SHELLY/Iob/ShellyClient.cs @@ -35,6 +35,8 @@ namespace IOB_WIN_SHELLY.Iob public ShellyClient(AdapterFormNext caller, IobConfTree IobConfFull) : base(caller, IobConfFull) { lgInfo("Init Iob.ShellyClient"); + // imposto ping a 3 + maxQueuePing = 3; // imposto B_input = 0; // init datetime counters @@ -55,8 +57,6 @@ namespace IOB_WIN_SHELLY.Iob { int.TryParse(POWEROFF_TIMEOUT_SEC, out PoweroffTimeoutSec); } - // fix coda ping - PingQueue = new DataQueue("000", "PingQueue", false); var devData = IobConfFull.Device.Connect; Shelly1PmOptions options = new Shelly1PmOptions() @@ -97,7 +97,7 @@ namespace IOB_WIN_SHELLY.Iob switch (item.Value.memAddr) { case "ActEnergy": - outValDbl=lastShellyResp.Value.ActEnergy.Total; + outValDbl = lastShellyResp.Value.ActEnergy.Total; //outVal = lastShellyResp.Value.ActEnergy.Total.ToString("F3", CultureInfo.InvariantCulture); break; @@ -229,16 +229,6 @@ namespace IOB_WIN_SHELLY.Iob /// private ShellyResult lastShellyResp; - /// - /// Dimensione coda di ping x valutazione - /// - private int maxQueuePing = 3; - - /// - /// Coda degli esiti di ping x calcolo stato macchina - /// - private DataQueue PingQueue = new DataQueue("000", "PingQueue", false); - private int PoweroffTimeoutSec = 100; /// @@ -267,7 +257,7 @@ namespace IOB_WIN_SHELLY.Iob if (B_input == 0 && pingOk) { B_input = 1; - PingQueue = new DataQueue("000", "PingQueue", false); + PingQueue = new DataQueue(IOBConfFull.General.FilenameIOB, "PingQueue", false, redisMan); lgTrace($"PingQueue resetted on addTest"); } PingQueue.Enqueue($"{score}");