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