diff --git a/IOB-UT-NEXT/Enums.cs b/IOB-UT-NEXT/Enums.cs
index 52a04d7f..9099ec4f 100644
--- a/IOB-UT-NEXT/Enums.cs
+++ b/IOB-UT-NEXT/Enums.cs
@@ -324,6 +324,11 @@ namespace IOB_UT_NEXT
///
OSAI_VB6,
+ ///
+ /// Adapter tipo watchdog via ping (per impianti spenti e non rilevati)
+ ///
+ PingWatchdog,
+
///
/// Adapter SIEMENS
///
diff --git a/IOB-WIN-NEXT/AdapterForm.cs b/IOB-WIN-NEXT/AdapterForm.cs
index ece6dab5..e3510dc1 100644
--- a/IOB-WIN-NEXT/AdapterForm.cs
+++ b/IOB-WIN-NEXT/AdapterForm.cs
@@ -1222,6 +1222,11 @@ namespace IOB_WIN_NEXT
start.Enabled = true;
break;
+ case tipoAdapter.PingWatchdog:
+ iobObj = new IobPing(this, IOBConf);
+ start.Enabled = true;
+ break;
+
case tipoAdapter.OSAI_OPEN:
case tipoAdapter.OSAI_CNDEX:
case tipoAdapter.OSAI_VB6:
diff --git a/IOB-WIN-NEXT/DATA/CONF/MAIN.ini b/IOB-WIN-NEXT/DATA/CONF/MAIN.ini
index 735286f9..2dcbed0a 100644
--- a/IOB-WIN-NEXT/DATA/CONF/MAIN.ini
+++ b/IOB-WIN-NEXT/DATA/CONF/MAIN.ini
@@ -71,5 +71,7 @@ CLI_INST=SteamWareSim
;STARTLIST=OPC_UA
;STARTLIST=SIM_PIZ03
;STARTLIST=FOV062
-STARTLIST=FP_TR2
+STARTLIST=PING
+;STARTLIST=FP_TR2
+
MAXCNC=10
\ No newline at end of file
diff --git a/IOB-WIN-NEXT/DATA/CONF/PING.ini b/IOB-WIN-NEXT/DATA/CONF/PING.ini
new file mode 100644
index 00000000..3a79aecf
--- /dev/null
+++ b/IOB-WIN-NEXT/DATA/CONF/PING.ini
@@ -0,0 +1,39 @@
+;Configurazione IOB-WIN
+[IOB]
+CNCTYPE=PingWatchdog
+PING_MS_TIMEOUT=500
+
+[MACHINE]
+VENDOR=STEAMWARE
+MODEL=WATCHDOG
+
+[CNC]
+IP=10.74.83.112
+PORT=0000
+
+[SERVER]
+MPIP=http://10.74.82.218
+MPURL=/MP/IO
+CMDBASE=/IOB/input/
+CMDFLOG=/IOB/flog/
+CMDALIVE=/IOB
+CMDENABLED=/IOB/enabled/
+CMDADV1=?valore=
+CMDREBO=/sendReboot.aspx?idxMacchina=
+CMD_ODL_STARTED=/IOB/getCurrOdlStart/
+CMD_FORCLE_SPLIT_ODL=/IOB/forceSplitOdlFull/
+CMD_IDLE_TIME=/IOB/getIdlePeriod/
+
+[MEMORY]
+
+[BLINK]
+MAX_COUNTER_BLINK = 15
+BLINK_FILT=0
+
+[OPTPAR]
+AUTO_CHANGE_ODL=false
+POWEROFF_TIMEOUT_SEC=180
+
+
+[BRANCH]
+NAME=master
\ No newline at end of file
diff --git a/IOB-WIN-NEXT/IOB-WIN-NEXT.csproj b/IOB-WIN-NEXT/IOB-WIN-NEXT.csproj
index f42062ec..f1b385aa 100644
--- a/IOB-WIN-NEXT/IOB-WIN-NEXT.csproj
+++ b/IOB-WIN-NEXT/IOB-WIN-NEXT.csproj
@@ -184,6 +184,7 @@
+
@@ -409,6 +410,9 @@
Always
+
+ Always
+
Always
diff --git a/IOB-WIN-NEXT/IobGeneric.cs b/IOB-WIN-NEXT/IobGeneric.cs
index 6009ee23..17a18b0d 100644
--- a/IOB-WIN-NEXT/IobGeneric.cs
+++ b/IOB-WIN-NEXT/IobGeneric.cs
@@ -433,6 +433,7 @@ namespace IOB_WIN_NEXT
if (DemoOut)
{
answ = (QueueIN.Count + QueueFLog.Count >= nMaxSend);
+ IobOnline = answ;
}
else
{
@@ -3589,6 +3590,7 @@ namespace IOB_WIN_NEXT
}
}
currDispData.semIn = Semaforo.SR;
+ processDisconnectedTask();
}
raiseRefresh(currDispData);
}
@@ -4105,6 +4107,13 @@ namespace IOB_WIN_NEXT
public virtual void processContapezzi()
{ }
+ ///
+ /// Task periodici SE disconnesso
+ ///
+ public virtual void processDisconnectedTask()
+ {
+ }
+
///
/// Effettua processing del recupero dei valori dinamici:
/// es: speed (RPM, feedrate) degli assi, valori pressioni, temeprature
diff --git a/IOB-WIN-NEXT/IobPing.cs b/IOB-WIN-NEXT/IobPing.cs
new file mode 100644
index 00000000..2e9fe19e
--- /dev/null
+++ b/IOB-WIN-NEXT/IobPing.cs
@@ -0,0 +1,160 @@
+using IOB_UT_NEXT;
+using MapoSDK;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Net.NetworkInformation;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace IOB_WIN_NEXT
+{
+ public class IobPing : IobGeneric
+ {
+ #region Protected Fields
+
+ protected int PoweroffTimeoutSec = 100;
+
+ ///
+ /// Veto controllo status x log...
+ ///
+ protected DateTime vetoCheckStatus = DateTime.Now;
+
+ #endregion Protected Fields
+
+ #region Public Constructors
+
+ ///
+ /// Estende l'init della classe base
+ ///
+ ///
+ public IobPing(AdapterForm caller, IobConfiguration IOBConf) : base(caller, IOBConf)
+ {
+ lgInfo("NEW IobPing (WatchDog)");
+ // init datetime counters
+ DateTime adesso = DateTime.Now;
+ lastPzCountSend = adesso;
+ lastWarnODL = adesso;
+ vetoCheckStatus = adesso;
+ var POWEROFF_TIMEOUT_SEC = getOptPar("POWEROFF_TIMEOUT_SEC");
+ if (!string.IsNullOrEmpty(POWEROFF_TIMEOUT_SEC))
+ {
+ int.TryParse(POWEROFF_TIMEOUT_SEC, out PoweroffTimeoutSec);
+ }
+ lgInfo($"L'adapter effettuera' PING di controllo all'indirizzo {IOBConf.cncIpAddr} per forzare stato poweroff dopo {PoweroffTimeoutSec} sec");
+ }
+
+ #endregion Public Constructors
+
+ #region Public Methods
+
+ ///
+ /// metodo controllo ping lento, override AutoODL
+ ///
+ public override void processDisconnectedTask()
+ {
+ // effettuo check ping!
+ DateTime adesso = DateTime.Now;
+ if (adesso.Subtract(lastPING).TotalSeconds >= PoweroffTimeoutSec)
+ {
+ // invio poweroff!
+ newDisplayData currDispData = new newDisplayData();
+ readSemafori(ref currDispData);
+ // SOLO SE ho poweroff da inviare...
+ if (B_output == 0)
+ {
+ accodaSigIN(ref currDispData);
+ // reset last ping...
+ lastPING = DateTime.Now;
+ }
+ }
+ }
+
+ ///
+ /// Effettua lettura semafori principale
+ /// Parametri da aggiornare x display in form
+ ///
+ public override void readSemafori(ref newDisplayData currDispData)
+ {
+ byte[] MemBlock = new byte[2];
+ try
+ {
+ currDispData.semIn = Semaforo.SV;
+
+ // se passa il ping faccio il resto...
+ if (testPingMachine == IPStatus.Success)
+ {
+ // in primis salvo data ping...
+ lastPING = DateTime.Now;
+ connectionOk = true;
+ }
+ else
+ {
+ connectionOk = false;
+ }
+
+ if (connectionOk)
+ {
+ B_input = 1;
+ }
+ else
+ {
+ B_input = 0;
+ }
+ // annullo lettura bit signal IN pre/post x evitare invio automatico...
+ B_output = B_input;
+ B_previous = B_input;
+ }
+ catch
+ {
+ currDispData.semIn = Semaforo.SR;
+ }
+ }
+
+ /// Override connessione
+ ///
+ public override void tryConnect()
+ {
+ bool doLog = (verboseLog || periodicLog);
+ lgInfo("PING: tryConnect step 01");
+ if (!connectionOk)
+ {
+ // controllo che il ping sia stato tentato almeno pingTestSec fa...
+ if (DateTime.Now.Subtract(lastPING).TotalSeconds > utils.CRI("pingTestSec"))
+ {
+ if (doLog)
+ {
+ lgInfo("PING: ConnKO - tryConnect");
+ }
+ lgInfo("PING: tryConnect step 04");
+
+ // se passa il ping faccio il resto...
+ if (testPingMachine == IPStatus.Success)
+ {
+ // in primis salvo data ping...
+ lastPING = DateTime.Now;
+ connectionOk = true;
+ lgInfo("PING OK");
+ }
+ else
+ {
+ // loggo no risposta ping ...
+ connectionOk = false;
+ lgInfo("PING KO");
+ }
+ }
+ }
+ }
+
+ ///
+ /// Override disconnessione
+ ///
+ public override void tryDisconnect()
+ {
+ lgInfo("Richiesta disconnessione adapter PING!");
+ connectionOk = false;
+ }
+
+ #endregion Public Methods
+ }
+}
\ No newline at end of file