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