diff --git a/IOB-WIN-FORM/Iob/Generic.Protected.cs b/IOB-WIN-FORM/Iob/Generic.Protected.cs index 2bb1c900..27835e2d 100644 --- a/IOB-WIN-FORM/Iob/Generic.Protected.cs +++ b/IOB-WIN-FORM/Iob/Generic.Protected.cs @@ -149,7 +149,7 @@ namespace IOB_WIN_FORM.Iob /// /// DataOra x veto all'invio dataItem /// - protected DateTime dtVetoSenDataItem= DateTime.Now; + protected DateTime dtVetoSenDataItem = DateTime.Now; /// /// Boolean x indicare contapezzi abilitato a livello di conf applicazione @@ -698,6 +698,13 @@ namespace IOB_WIN_FORM.Iob /// protected Dictionary RecipeReplRules { get; set; } = new Dictionary(); + /// + /// Chiave ultima condition registrata redis (da aggiungere eventuale ID specifico condition) + /// + protected string redKeyLastCondition + { + get => redisMan.redHash($"IOB:CurrData:{IOBConfFull.General.FilenameIOB}:Condition"); + } protected string redKeyLogfileAct { get => redisMan.redHash($"IOB:CurrData:{IOBConfFull.General.FilenameIOB}:LogFile:Act"); diff --git a/IOB-WIN-MTC/Iob/MTConn.cs b/IOB-WIN-MTC/Iob/MTConn.cs index d1b48070..e49d7e78 100644 --- a/IOB-WIN-MTC/Iob/MTConn.cs +++ b/IOB-WIN-MTC/Iob/MTConn.cs @@ -1104,8 +1104,18 @@ namespace IOB_WIN_MTC.Iob { if (enableCliRestart) { - lgInfo($"Timeout per mancata comunicazione da oltre {MaxSecReload} sec --> disconnessione adapter MTConnect!"); - tryDisconnect(); + if (checkAdapterAlive()) + { + lgInfo($"Mancanza innovazioni da oltre {MaxSecReload} sec | Alive Test Success | NON riavviamo, impostato lastCurrent"); + lastCurrent = adesso; + } + else + { + + lgInfo($"Timeout per mancata comunicazione da oltre {MaxSecReload} sec | Alive Test Failed | --> disconnessione adapter MTConnect!"); + tryDisconnect(); + } + } else { @@ -1241,6 +1251,43 @@ namespace IOB_WIN_MTC.Iob } } + /// + /// Verifica stato Alive per adapter: + /// - test ping + /// - test probe + /// + /// + private bool checkAdapterAlive() + { + bool isPingOk = testPingMachine == IPStatus.Success; + // test probe! + bool probeOk = TestProbe(mtcUrlCall, true); + return isPingOk && probeOk; + } + + /// + /// URL completo x chiamate MTC + /// + private string mtcUrlCall + { + + get + { + return $"{IOBConfFull.Device.Connect.IpAddr}:{mtcPort}"; + } + } + + private short mtcPort + { + + get + { + short port = 5000; + short.TryParse(IOBConfFull.Device.Connect.Port, out port); + return port; + } + } + /// /// Vera connessione ad MTC /// @@ -1252,27 +1299,13 @@ namespace IOB_WIN_MTC.Iob // reset memoria dataItem.. dataItemMem = new Dictionary(); // predisposizione conf oggetto di comunicazione MTC - short port = 5000; - short.TryParse(IOBConfFull.Device.Connect.Port, out port); - string callUrl = $"{IOBConfFull.Device.Connect.IpAddr}:{port}"; + string callUrl = mtcUrlCall; // test probe! try { - lgInfo($"Test Probe MTC Client: {callUrl}"); - var prbClient = new MTConnectHttpProbeClient(callUrl); - //var prbClient = new MTConnectHttpProbeClient(cIobConf.cncIpAddr, port); - prbClient.Timeout = mtcParams.reqTOutMs; - var prbDoc = prbClient.Get(); - // se valido loggo! - if (prbDoc != null) - { - // anche se non del tutto vero... - connectionOk = true; - lgInfo($"Effettuata correttamente PROBE per device MTC all'URL {callUrl}"); - lgInfo($"---------------- Elenco Devices ----------------"); - // loggo devices principali... - logProbeDevices(prbDoc.Devices.ToList()); - } + + // anche se non del tutto vero... + connectionOk = TestProbe(callUrl, true); } catch (Exception exc) { @@ -1284,7 +1317,7 @@ namespace IOB_WIN_MTC.Iob try { lgInfo($"Chiamata apertura MTC Client: {callUrl}"); - MTC_ref = new MTConnectHttpClient(IOBConfFull.Device.Connect.IpAddr, port); + MTC_ref = new MTConnectHttpClient(IOBConfFull.Device.Connect.IpAddr, mtcPort); //MTC_ref = new MTConnectHttpClient(callUrl); // sample interval MTC_ref.Interval = mtcParams.clientSampleIntMs; @@ -1327,6 +1360,40 @@ namespace IOB_WIN_MTC.Iob isConnecting = false; } + /// + /// Test di chiamata metodo PROBE con log info + /// + /// + private bool TestProbe(string callUrl, bool doLogDevices) + { + bool testOk = false; + lgInfo($"Test Probe MTC Client: {callUrl}"); + try + { + var prbClient = new MTConnectHttpProbeClient(callUrl); + //var prbClient = new MTConnectHttpProbeClient(cIobConf.cncIpAddr, port); + prbClient.Timeout = mtcParams.reqTOutMs; + var prbDoc = prbClient.Get(); + // se valido loggo! + if (prbDoc != null) + { + testOk = true; + lgInfo($"Effettuata correttamente PROBE per device MTC all'URL {callUrl}"); + if (doLogDevices) + { + lgInfo($"---------------- Elenco Devices ----------------"); + // loggo devices principali... + logProbeDevices(prbDoc.Devices.ToList()); + } + } + } + catch (Exception exc) + { + lgError($"Eccezione durante TestProbe:{Environment.NewLine}{exc}"); + } + return testOk; + } + /// /// Formatta un dataitem da uno stream SAMPLE /// @@ -1814,17 +1881,29 @@ namespace IOB_WIN_MTC.Iob // verifico veto... if (!doVeto) { - // verifico se salvare - bool changed = checkSaveCondition(observ, fullMsg); - if (changed || forceSend) + // verifico se sia variato valore e dataora da ultimo salvataggio redis... + string redKey = $"{redKeyLastCondition}:{observ.DataItemId}"; + string redisLastCond = redisMan.getRSV(redKey); + string currCond = $"{observ.Timestamp}|{fullMsg}"; + if (currCond.Equals(redisLastCond)) { - // accodare ed invia nella coda ALARMS (che POI salva in document - // MongoDB anche ultimi x minuti di FluxLog...) - accodaAlarmLog(sVal, qEncodeFLog(time2, descr, fullMsg)); + lgInfo($"Verifca condition | nessuna variazione da ultima registata | {redisLastCond}"); } else { - lgTrace(sVal); + redisMan.setRSV(redKey, currCond); + // verifico se salvare + bool changed = checkSaveCondition(observ, fullMsg); + if (changed || forceSend) + { + // accodare ed invia nella coda ALARMS (che POI salva in document + // MongoDB anche ultimi x minuti di FluxLog...) + accodaAlarmLog(sVal, qEncodeFLog(time2, descr, fullMsg)); + } + else + { + lgTrace(sVal); + } } } else