diff --git a/IOB-MAN/App.config b/IOB-MAN/App.config index 6c819836..ba662ffb 100644 --- a/IOB-MAN/App.config +++ b/IOB-MAN/App.config @@ -1,4 +1,4 @@ - + @@ -6,14 +6,54 @@ - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/IOB-MAN/App_Readme/README_SteamWare.txt b/IOB-MAN/App_Readme/README_SteamWare.txt new file mode 100644 index 00000000..bf60ed18 --- /dev/null +++ b/IOB-MAN/App_Readme/README_SteamWare.txt @@ -0,0 +1,12 @@ +--------------------------------------------------------------- +------- SteamWareLib SDK ------- +--------------------------------------------------------------- + +Libreria di utility base di SteamWare. + +Le dipendenze inserite sono necessarie al funzionamento dell'SDK. + +Sono inclusi a titolo di esempio vari files di conf: + * example-NLog.config + +Attenzione a configurare correttamente il file NLog.xml includendo il rule per la classe, vedere ad esempio il file example-NLog.config allegato. \ No newline at end of file diff --git a/IOB-MAN/App_Readme/SteamWare_demo/example-NLog.config b/IOB-MAN/App_Readme/SteamWare_demo/example-NLog.config new file mode 100644 index 00000000..a11a39e6 --- /dev/null +++ b/IOB-MAN/App_Readme/SteamWare_demo/example-NLog.config @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/IOB-MAN/App_Readme/SteamWare_demo/example-app.config b/IOB-MAN/App_Readme/SteamWare_demo/example-app.config new file mode 100644 index 00000000..fb421650 --- /dev/null +++ b/IOB-MAN/App_Readme/SteamWare_demo/example-app.config @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/IOB-MAN/App_Readme/SteamWare_demo/example-config-table.txt b/IOB-MAN/App_Readme/SteamWare_demo/example-config-table.txt new file mode 100644 index 00000000..dd0ab8ef --- /dev/null +++ b/IOB-MAN/App_Readme/SteamWare_demo/example-config-table.txt @@ -0,0 +1,30 @@ +# chiave valore valoreStd note +_adminEmail samuele@steamware.net,info@steamware.net samuele@steamware.net,info@steamware.net info@steamware.net +_allowForceUser true true abilita login forzato +_commonPages menu menu pagina comune +_emailPwd drmfsls16 drmfsls16 drmfsls16 +_emailUser steamwarebot@gmail.com steamwarebot@gmail.com steamwarebot@gmail.com +_enableSSL true true true +_fromEmail webmaster@admodelling.org webmaster@admodelling.org email mittente eventuali msg +_righeDataGrid 30 30 Num righe datagrid std +_righeDataGridAnagr 20 20 Num righe datagrid anagrafiche +_righeDataGridLong 30 30 Num righe datagrid long +_righeDataGridMed 15 15 Num righe datagrid med +_righeDataGridShort 10 10 Num righe datagrid short +_smtpCli smtp.gmail.com smtp.gmail.com smtp.gmail.com +_useAIMSmtp false false impiego client posta elettronica alternativo +_useAuthSmtp true true true +AuthCookieName admodellingAuth admodellingAuth Cookie applicativo +autoConfCmd true true Conferma automatica comandi barcode +baseUrl http://site_name http://iis02/site_name URL base del sito +cacheValSec 60 60 Validità cache dati in gestore Barcode +cookieDayExp 365 365 Periodo validità cookie +cookieUsed admodellingAuth admodellingAuth,CTrack_CodOpr,CTrack_CodPost Elenco dei cookie impiegati +enableCookie true true Abilitazione uso cookie +enableLogOut true false Abilita button logout COMPLETO in alto a sx +enablePlain true true Abilitazione decode plain +maxAuth 1000 1000 num auth minimo per NON consumare tokens +serializeSession true true Serializzazione valori in sessione (REDIS) +SiteName iis02/site_name iis02/site_name Nome sito +enableDumpDiag false false abilitazione dumb diagnostico x eccezioni di default +doShrinkFolder true true Imposta compressione area LOGS \ No newline at end of file diff --git a/IOB-MAN/App_Readme/SteamWare_demo/example-favicon.ico b/IOB-MAN/App_Readme/SteamWare_demo/example-favicon.ico new file mode 100644 index 00000000..4f0e0ad0 Binary files /dev/null and b/IOB-MAN/App_Readme/SteamWare_demo/example-favicon.ico differ diff --git a/IOB-MAN/IOB-MAN.csproj b/IOB-MAN/IOB-MAN.csproj index 9579edff..bf07826e 100644 --- a/IOB-MAN/IOB-MAN.csproj +++ b/IOB-MAN/IOB-MAN.csproj @@ -38,22 +38,101 @@ IobManIcon.ico + + ..\packages\AIM.1.0.3\lib\AegisImplicitMail.dll + + + ..\packages\AjaxControlToolkit.19.1.0\lib\net40\AjaxControlToolkit.dll + ..\packages\Costura.Fody.4.1.0\lib\net40\Costura.dll + + ..\packages\Crc32C.NET.1.0.5.0\lib\net20\Crc32C.NET.dll + + + ..\packages\DnsClient.1.2.0\lib\net45\DnsClient.dll + + + ..\packages\SharpZipLib.1.2.0\lib\net45\ICSharpCode.SharpZipLib.dll + + + ..\packages\MapoSDK.6.9.1912.1271\lib\net40\MapoSDK.dll + + + ..\packages\MongoDB.Bson.2.10.0\lib\net452\MongoDB.Bson.dll + + + ..\packages\MongoDB.Driver.2.10.0\lib\net452\MongoDB.Driver.dll + + + ..\packages\MongoDB.Driver.Core.2.10.0\lib\net452\MongoDB.Driver.Core.dll + + + ..\packages\MongoDB.Libmongocrypt.1.0.0\lib\net452\MongoDB.Libmongocrypt.dll + ..\packages\Newtonsoft.Json.12.0.3\lib\net45\Newtonsoft.Json.dll ..\packages\NLog.4.6.8\lib\net45\NLog.dll + + ..\packages\PDFsharp.1.50.5147\lib\net20\PdfSharp.dll + + + ..\packages\PDFsharp.1.50.5147\lib\net20\PdfSharp.Charting.dll + + + ..\packages\Pipelines.Sockets.Unofficial.2.1.1\lib\net461\Pipelines.Sockets.Unofficial.dll + + + ..\packages\SharpCompress.0.24.0\lib\net45\SharpCompress.dll + + + ..\packages\Snappy.NET.1.1.1.8\lib\net45\Snappy.NET.dll + + + ..\packages\StackExchange.Redis.2.0.601\lib\net461\StackExchange.Redis.dll + + + ..\packages\System.Buffers.4.5.0\lib\netstandard2.0\System.Buffers.dll + + + ..\packages\System.Diagnostics.PerformanceCounter.4.7.0\lib\net461\System.Diagnostics.PerformanceCounter.dll + + + ..\packages\System.IO.Pipelines.4.7.0\lib\netstandard2.0\System.IO.Pipelines.dll + + + ..\packages\System.Memory.4.5.3\lib\netstandard2.0\System.Memory.dll + + + + ..\packages\System.Numerics.Vectors.4.5.0\lib\net46\System.Numerics.Vectors.dll + + + ..\packages\System.Runtime.CompilerServices.Unsafe.4.7.0\lib\netstandard2.0\System.Runtime.CompilerServices.Unsafe.dll + + + ..\packages\System.Runtime.InteropServices.RuntimeInformation.4.3.0\lib\net45\System.Runtime.InteropServices.RuntimeInformation.dll + True + True + + + ..\packages\System.Threading.Channels.4.7.0\lib\netstandard2.0\System.Threading.Channels.dll + + + ..\packages\System.Threading.Tasks.Extensions.4.5.3\lib\netstandard2.0\System.Threading.Tasks.Extensions.dll + + @@ -78,7 +157,11 @@ + + + + Always @@ -94,6 +177,8 @@ True Resources.resx + + Always @@ -132,6 +217,10 @@ + + + + \ No newline at end of file diff --git a/IOB-MAN/packages.config b/IOB-MAN/packages.config index 1556b24e..157942e9 100644 --- a/IOB-MAN/packages.config +++ b/IOB-MAN/packages.config @@ -1,9 +1,36 @@  + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/IOB-UT/Enums.cs b/IOB-UT/Enums.cs new file mode 100644 index 00000000..bdc570ba --- /dev/null +++ b/IOB-UT/Enums.cs @@ -0,0 +1,319 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace IOB_UT +{ + + /// + /// Tipologie di DUMP memoria + /// + public enum dumpType + { + /// + /// Salvataggio all'avvio aree memoria (con sovrascrittura) + /// + STARTUP, + /// + /// Campionamento periodico + /// + SAMPLE + } + /// + /// Tipologia di adapters ammessi + /// + public enum tipoAdapter + { + /// + /// Adapter SIMULAZIONE + /// + SIMULA, + /// + /// adapter FANUC + /// + FANUC, + /// + /// adapter KAWASAKI e-controller + /// + KAWASAKI, + /// + /// Adapter non specificato + /// + ND, + /// + /// Adapter MTConnect + /// + MTConnect, + /// + /// Adapter OMRON + /// + OMRON, + /// + /// Adapter OSAI CNDEX (Cndex) + /// + OSAI_CNDEX, + /// + /// Adapter OSAI OPEN (ws) + /// + OSAI_OPEN, + /// + /// Adapter OSAI VB6 + /// + OSAI_VB6, + /// + /// Adapter SIEMENS + /// + SIEMENS, + /// + /// Adapter SIEMENS, interfaccia versione APROCHIM (filtro liquidi rettifiche) + /// + SIEMENS_APROCHIM, + /// + /// Adapter SIEMENS, interfaccia versione VIPA @2001 + /// + SIEMENS_AT2001, + /// + /// Adapter SIEMENS, interfaccia versione FAPE (punzonatrici) + /// + SIEMENS_FAPE, + /// + /// Adapter SIEMENS, interfaccia versione COMUR (dentatrice) + /// + SIEMENS_COMUR, + /// + /// Adapter SIEMENS, interfaccia versione INGENIA (Valvital, Automazione) + /// + SIEMENS_INGENIA, + /// + /// Adapter SIEMENS, interfaccia versione LASCO (Valvital, Pressa Bilancere) + /// + SIEMENS_LASCO, + /// + /// Adapter SIEMENS, interfaccia versione PRESSOIL + CEI (Valvital, Pressa Idraulica) + /// + SIEMENS_PRESSOIL_CEI, + /// + /// Adapter SIEMENS, interfaccia versione SAET (Valvital, forni / tempra) + /// + SIEMENS_SAET, + /// + /// Adapter SIEMENS, interfaccia versione Torri + /// + SIEMENS_TORRI, + /// + /// Metodi di WPS WebPageScraping (es x compressori Atlas Copco) + /// + WPS + } + /// + /// Tipo di ciclo da processare + /// + public enum gatherCycle + { + /// + /// Very High Frequency (solo x invii...) + /// + VHF, + /// + /// lettura dati ad alta frequenza + /// + HF, + /// + /// lettura dati standard + /// + MF, + /// + /// lettura dati bassa freq + /// + LF, + /// + /// lettura dati bassissima priorità (re-sync stato allarmi) + /// + VLF + } + + /// + /// StFlag8: set di 8 bit (1 word) contente semaforo di variabili + /// + [Flags] + public enum StFlag8 : int + { + NONE = 0, + B0 = 1 << 0, + B1 = 1 << 1, + B2 = 1 << 2, + B3 = 1 << 3, + B4 = 1 << 4, + B5 = 1 << 5, + B6 = 1 << 6, + B7 = 1 << 7 + } + /// + /// StFlag32: set di 32 bit (4 word) contente semaforo di variabili + /// + [Flags] + public enum StFlag32 : int + { + NONE = 0, + B00 = 1 << 0, + B01 = 1 << 1, + B02 = 1 << 2, + B03 = 1 << 3, + B04 = 1 << 4, + B05 = 1 << 5, + B06 = 1 << 6, + B07 = 1 << 7, + B08 = 1 << 8, + B09 = 1 << 9, + B10 = 1 << 10, + B11 = 1 << 11, + B12 = 1 << 12, + B13 = 1 << 13, + B14 = 1 << 14, + B15 = 1 << 15, + B16 = 1 << 16, + B17 = 1 << 17, + B18 = 1 << 18, + B19 = 1 << 19, + B20 = 1 << 20, + B21 = 1 << 21, + B22 = 1 << 22, + B23 = 1 << 23, + B24 = 1 << 24, + B25 = 1 << 25, + B26 = 1 << 26, + B27 = 1 << 27, + B28 = 1 << 28, + B29 = 1 << 29, + B30 = 1 << 30, + B31 = 1 << 31 + } + /// + /// Enumerazione tipi di semaforo + /// + public enum Semaforo + { + /// + /// Stato non definito + /// + ND, + /// + /// Verde + /// + SV, + /// + /// Giallo + /// + SG, + /// + /// Rosso + /// + SR, + /// + /// Grigio/Spento + /// + SS + } + /// + /// Enumerazione tipi di tipi di URL x invio + /// + public enum urlType + { + /// + /// Salvataggio FluxLog (valori estesi che non provocano calcoli di macchine a stati, eventi...) + /// + FLog, + /// + /// INPUT segnali in ingresso (standard base MAPO) + /// + SignIN + } + + /// + /// Elenco STATI CNC OSAI + /// + public enum CNC_STATUS_OSAI + { + IDLE = 1, + CYCLE, + HODA, + RUNH, + HRUN, + ERRO, + WAIT, + RESET, + EMERG, + INPUT + } + /// + /// Elenco MODI CNC + /// + public enum CNC_MODE + { + /// + /// Non definito + /// + ND = 0, + /// + /// AUTOMATICO + /// + AUTO, + /// + /// EDIT (MEMORY EDIT) + /// + EDIT, + /// + /// MEN (MEMORY OPERATION) + /// + MEN, + /// + /// MDI (MANUAL DATA INPUT) + /// + MDI, + /// + /// HANDLE/INC (MANUAL HANDLE / INCREMENTAL FEED) + /// + HANDLE_INC, + /// + /// HOME + /// + HOME, + /// + /// JOG (MANUAL CONTINUOUS FEED) + /// + JOG, + /// + /// JOG MAN + /// + JOG_MAN, + /// + /// JOG_INC + /// + JOG_INC, + /// + /// PROFILE + /// + PROFILE, + /// + /// SEMI + /// + SEMI, + /// + /// THND (TEACH IN HANDLE) + /// + THND, + /// + /// TJOG (TEACH IN JOG) + /// + TJOG, + /// + /// RMT (DNC OPERATION) + /// + RMT, + /// + /// REF (MANUAL REFERENCE POSITION RETURN) + /// + REF + } +} diff --git a/IOB-UT/IOB-UT.csproj b/IOB-UT/IOB-UT.csproj index bca7eb00..b968e371 100644 --- a/IOB-UT/IOB-UT.csproj +++ b/IOB-UT/IOB-UT.csproj @@ -100,8 +100,10 @@ Component + + diff --git a/IOB-UT/Objects.cs b/IOB-UT/Objects.cs new file mode 100644 index 00000000..1fe829cc --- /dev/null +++ b/IOB-UT/Objects.cs @@ -0,0 +1,510 @@ +using MapoSDK; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace IOB_UT +{ + + /// + /// Oggetto timing x archiviazione dati perfomances + /// + public class TimeRec + { + /// + /// Classe chiamante della funzione (es codice univoco IOB) + /// + public string classCall; + /// + /// Codice univoco chiamata: tipo R4 (read 4 byte), W2 (write 2 Byte) + /// + public string codCall; + /// + /// Num chiamate totale + /// + public int numCall; + /// + /// Tempo medio chiamata + /// + public double avgMsec + { + get + { + return totMsec.TotalMilliseconds / numCall; + } + } + /// + /// Totale Msec accumulati + /// + public TimeSpan totMsec; + /// + /// Classe record timing + /// + public TimeRec() + { + codCall = ""; + numCall = 0; + totMsec = new TimeSpan(0); + } + /// + /// Classe record timing + /// + /// + /// + /// + public TimeRec(string caller, string codice, long nTicks) + { + classCall = caller; + codCall = codice; + numCall = 1; + totMsec = new TimeSpan(nTicks); + } + } + + /// + /// Classe gestione valori campionati su periodo + /// + public class sampleVect + { + /// + /// Dimensione finestra di campionamento (secondi) + /// + protected int windSize; + /// + /// vettore valori temporali della serie + /// + protected List lTime; + /// + /// vettore valoti puntuali della serie + /// + protected List lVal; + /// + /// Inizializzo l'oggetto + /// + public sampleVect() + { + // init valori default... + windSize = baseUtils.CRI("countWindSize") > 0 ? baseUtils.CRI("countWindSize") : 60; + lTime = new List(); + lVal = new List(); + } + /// + /// Conteggio elementi + /// + protected int numElem + { + get + { + int answ = 0; + try + { + answ = lTime.Count; + } + catch + { } + return answ; + } + } + /// + /// Verifica ampiezza finestra valori First-Last + /// + protected double flWindSize + { + get + { + double answ = 0; + if (numElem > 1) + { + answ = lTime.Last().Subtract(lTime[0]).TotalSeconds; + } + return answ; + } + } + /// + /// Verifica ampiezza finestra valori Second-Last + /// + protected double slWindSize + { + get + { + double answ = 0; + if (numElem > 2) // altrimenti SE non ne ho almeno 3 NON posso avere secondo/ultimo... + { + + answ = lTime.Last().Subtract(lTime[1]).TotalSeconds; + } + return answ; + } + } + /// + /// Aggiunge un valore alla serie ed eventualmente elimina i valori superflui a garantirne una finestra temporale valida + /// + /// + /// + public void addValue(DateTime tempo, int valore) + { + lTime.Add(tempo); + lVal.Add(valore); + // verifico se siano da accorciare le serie... ovvero i 2 intervalli ENTRAMBI sono superiori al periodo minimo (in tal caso riduco.. + while (flWindSize > windSize && slWindSize > windSize) + { + // elimino i 2 valori + vecchi + lTime.RemoveAt(0); + lVal.RemoveAt(0); + // ora ricontrollo... + } + } + /// + /// Calcola il valore mediano... + /// + public double vcMedian + { + get + { + double answ = 0; + // restituisce la mediana SE valida, altrimenti null... + if (numElem > 2 && flWindSize > windSize) + { + try + { + // calcolo mediana! + //answ = Statistics.Median(lVal.ToArray()); + + // rif: https://blogs.msmvps.com/deborahk/linq-mean-median-and-mode/ + var sortedNumbers = lVal.OrderBy(n => n); + int numCount = lVal.Count; + int indice50 = lVal.Count / 2; + if ((numCount % 2) == 0) + { + answ = ((sortedNumbers.ElementAt(indice50) + sortedNumbers.ElementAt(indice50 - 1)) / 2); + } + else + { + answ = sortedNumbers.ElementAt(indice50); + } + } + catch + { } + } + return answ; + } + } + /// + /// Verifica se la vc sia valida (ovvero almeno 2 valori e intervallo > window richiesta) + /// + public bool vcValid + { + get + { + return (flWindSize > windSize && numElem > 1); + } + } + + } + /// + /// GEstione dati di timing + /// + public static class TimingData + { + public static List results = new List(); + + /// + /// aggiorno vettore aggiungendo risultato + /// + /// Codice chiamante + /// Codice da registrare (univoco con chiamante) + /// Tempo esecuzione in ticks + public static void addResult(string caller, string codice, long ticks) + { + if (results.Count == 0) + { + results.Add(new TimeRec(caller, codice, ticks)); + } + int indice = -1; + for (int i = 0; i < results.Count; i++) + { + // se il codice è quello cercato... + if (results[i].codCall == codice && results[i].classCall == caller) + { + indice = i; + } + } + // se c'è aggiorno... + if (indice >= 0) + { + results[indice].numCall++; + results[indice].totMsec = results[indice].totMsec.Add(new TimeSpan(ticks)); + } + // altrimenti aggiungo... + else + { + results.Add(new TimeRec(caller, codice, ticks)); + } + } + /// + /// Resetta i dati registrati (ad avvio adapter...) + /// + public static void resetData() + { + results = new List(); + } + } + /// + /// Gestione Endianness + /// + public static class Endian + { + /// + /// Scambia MSB/LSB per 16bit + /// + /// + /// + public static UInt16 SwapUInt16(UInt16 inValue) + { + return (UInt16)(((inValue & 0xff00) >> 8) | + ((inValue & 0x00ff) << 8)); + } + + /// + /// Scambia MSB/LSB per 32bit + /// + /// + /// + public static UInt32 SwapUInt32(UInt32 inValue) + { + return ((inValue & 0xff000000) >> 24) | + ((inValue & 0x00ff0000) >> 8) | + ((inValue & 0x0000ff00) << 8) | + ((inValue & 0x000000ff) << 24); + } + } + /// + /// Classe conf x item DynData + /// + public class DynDataItem + { + public string key { get; set; } = ""; + public string name { get; set; } = ""; + public string val { get; set; } = ""; + public string unit { get; set; } = ""; + public string func { get; set; } = ""; + public int sPeriod { get; set; } = 60; + /// + /// Valore effettivo da salvare + /// + public string actVal { get; set; } = ""; + /// + /// DataOra scadenza invio forzato + /// + public DateTime DTScad = DateTime.Now; + } + /// + /// Classe conf x decodifica stsatus + /// + public class StatusItem : DynDataItem + { + public Dictionary codeMapping; + } + /// + /// Classe conf server html + /// + public class srvData + { + public string baseUri { get; set; } = ""; + public string driverName { get; set; } = ""; + } + /// + /// Elenco oggetti del monitoraggio (DynData, Status) + /// + public class MonitoredItemsConf + { + public srvData SrvData { get; set; } + public List DynData { get; set; } + public List Status { get; set; } + } + /// + /// Configurazione per Eventi/Variabili + /// + public class EVData + { + /// + /// Unità di misura + /// + public string UM { get; set; } = "num"; + /// + /// Valore salvato + /// + public string Val { get; set; } = ""; + /// + /// DataOra scadenza invio forzato + /// + public DateTime DTScad = DateTime.Now; + } + /// + /// Configurazione per Variabili Casuali + /// + public class VCData + { + /// + /// Periodo di riferimento + /// + public int Period { get; set; } = 60; + /// + /// Tipologia di funzione da applicare + /// + public VC_func Funzione { get; set; } = VC_func.POINT; + /// + /// DataOra inizio periodo di elaborazione + /// + public DateTime DTStart; + /// + /// Array dati per calcolo + /// + public List dataArray; + } + + /// + /// informazioni di produzione + /// + public struct prodData + { + public string Operator; + + public bool Status; + public int AccTime; + public int Power; + public string FuncMode; + public bool EmrStop; + public string MessageCode; + public string MessageText; + + } + + + /// + /// Dato generico (per decodifica) + /// + public class otherData + { + public string codNum; + public string memAddr; + public string varName; + public string dataType; + public otherData() + { + codNum = ""; + memAddr = ""; + varName = ""; + dataType = ""; + } + public otherData(string _codNum, string _memAddr, string _varName, string _dataType) + { + codNum = _codNum; + memAddr = _memAddr; + varName = _varName; + dataType = _dataType; + } + } + /// + /// Classe che contiene tutte le NUOVE informaizoni da aggiornare sulla form + /// + public class newDisplayData + { + /// + /// Dati tipo IN (RAW) + /// + public string newInData { get; set; } = ""; + /// + /// Dati tipo Signal + /// + public string newSignalData { get; set; } = ""; + /// + /// Dati tipo FluxLog + /// + public string newFLogData { get; set; } = ""; + /// + /// Dati tipo UrlCall + /// + public string newUrlCallData { get; set; } = ""; + /// + /// Dati tipo LiveLog + /// + public string newLiveLogData { get; set; } = ""; + /// + /// Oggetto COUTNER generico (pezzi, portata...) + /// + public int counter { get; set; } = -9999; + /// + /// Bitmap attuale segnali letti + /// + public string currBitmap { get; set; } = ""; + /// + /// Stato semaforo IN verso PLC + /// + public Semaforo semIn { get; set; } = Semaforo.ND; + /// + /// Stato semaforo OUT verso MES + /// + public Semaforo semOut { get; set; } = Semaforo.ND; + /// + /// Verifica se contenga valori (NON default/empty) + /// + public bool hasData + { + get + { + bool answ = false; + // true se qualcosa NON E' come default + if (!string.IsNullOrWhiteSpace(newInData) || !string.IsNullOrWhiteSpace(newSignalData) || !string.IsNullOrWhiteSpace(newFLogData) || !string.IsNullOrWhiteSpace(newUrlCallData) || !string.IsNullOrWhiteSpace(newLiveLogData) || counter > -9999 || !string.IsNullOrWhiteSpace(currBitmap) || semIn != Semaforo.ND || semOut != Semaforo.ND) + { + answ = true; + } + return answ; + } + } + } + + /// + /// Rappresentazione dello stato corrente dell'IOB + /// + public class IobWinCurrentState + { + /// + /// Semaforo IN (IOB-PLC) + /// + public Semaforo SemIn { get; set; } = Semaforo.ND; + /// + /// Semaforo OUT (IOB-MPserver) + /// + public Semaforo SemOut { get; set; } = Semaforo.ND; + /// + /// Contatore IOB + /// + public float counterIOB { get; set; } = 0; + /// + /// Contatore Macchina + /// + public float counterMAC { get; set; } = 0; + /// + /// Lunghezza coda EVENTI in uscita + /// + public int queueEvLen { get; set; } = 0; + /// + /// Lunghezza coda FluxLog in uscita + /// + public int queueFLogLen { get; set; } = 0; + /// + /// DataOra ultima comunicazione IN (con PLC) + /// + public DateTime lastDataIn { get; set; } = DateTime.Now.AddYears(-1); + /// + /// DataOra ultima comunicazione OUT (con MP Server) + /// + public DateTime lastDataOut { get; set; } = DateTime.Now.AddYears(-1); + /// + /// Ultimo stato noto dei parametri in memoria letti da PLC + /// + public Dictionary currParams { get; set; } = null; + } +} diff --git a/IOB-UT/baseUtils.cs b/IOB-UT/baseUtils.cs index 9a3b6007..e14b0461 100644 --- a/IOB-UT/baseUtils.cs +++ b/IOB-UT/baseUtils.cs @@ -648,772 +648,4 @@ namespace IOB_UT } } - - /// - /// Oggetto timing x archiviazione dati perfomances - /// - public class TimeRec - { - /// - /// Classe chiamante della funzione (es codice univoco IOB) - /// - public string classCall; - /// - /// Codice univoco chiamata: tipo R4 (read 4 byte), W2 (write 2 Byte) - /// - public string codCall; - /// - /// Num chiamate totale - /// - public int numCall; - /// - /// Tempo medio chiamata - /// - public double avgMsec - { - get - { - return totMsec.TotalMilliseconds / numCall; - } - } - /// - /// Totale Msec accumulati - /// - public TimeSpan totMsec; - /// - /// Classe record timing - /// - public TimeRec() - { - codCall = ""; - numCall = 0; - totMsec = new TimeSpan(0); - } - /// - /// Classe record timing - /// - /// - /// - /// - public TimeRec(string caller, string codice, long nTicks) - { - classCall = caller; - codCall = codice; - numCall = 1; - totMsec = new TimeSpan(nTicks); - } - } - - /// - /// Classe gestione valori campionati su periodo - /// - public class sampleVect - { - /// - /// Dimensione finestra di campionamento (secondi) - /// - protected int windSize; - /// - /// vettore valori temporali della serie - /// - protected List lTime; - /// - /// vettore valoti puntuali della serie - /// - protected List lVal; - /// - /// Inizializzo l'oggetto - /// - public sampleVect() - { - // init valori default... - windSize = baseUtils.CRI("countWindSize") > 0 ? baseUtils.CRI("countWindSize") : 60; - lTime = new List(); - lVal = new List(); - } - /// - /// Conteggio elementi - /// - protected int numElem - { - get - { - int answ = 0; - try - { - answ = lTime.Count; - } - catch - { } - return answ; - } - } - /// - /// Verifica ampiezza finestra valori First-Last - /// - protected double flWindSize - { - get - { - double answ = 0; - if (numElem > 1) - { - answ = lTime.Last().Subtract(lTime[0]).TotalSeconds; - } - return answ; - } - } - /// - /// Verifica ampiezza finestra valori Second-Last - /// - protected double slWindSize - { - get - { - double answ = 0; - if (numElem > 2) // altrimenti SE non ne ho almeno 3 NON posso avere secondo/ultimo... - { - - answ = lTime.Last().Subtract(lTime[1]).TotalSeconds; - } - return answ; - } - } - /// - /// Aggiunge un valore alla serie ed eventualmente elimina i valori superflui a garantirne una finestra temporale valida - /// - /// - /// - public void addValue(DateTime tempo, int valore) - { - lTime.Add(tempo); - lVal.Add(valore); - // verifico se siano da accorciare le serie... ovvero i 2 intervalli ENTRAMBI sono superiori al periodo minimo (in tal caso riduco.. - while (flWindSize > windSize && slWindSize > windSize) - { - // elimino i 2 valori + vecchi - lTime.RemoveAt(0); - lVal.RemoveAt(0); - // ora ricontrollo... - } - } - /// - /// Calcola il valore mediano... - /// - public double vcMedian - { - get - { - double answ = 0; - // restituisce la mediana SE valida, altrimenti null... - if (numElem > 2 && flWindSize > windSize) - { - try - { - // calcolo mediana! - //answ = Statistics.Median(lVal.ToArray()); - - // rif: https://blogs.msmvps.com/deborahk/linq-mean-median-and-mode/ - var sortedNumbers = lVal.OrderBy(n => n); - int numCount = lVal.Count; - int indice50 = lVal.Count / 2; - if ((numCount % 2) == 0) - { - answ = ((sortedNumbers.ElementAt(indice50) + sortedNumbers.ElementAt(indice50 - 1)) / 2); - } - else - { - answ = sortedNumbers.ElementAt(indice50); - } - } - catch - { } - } - return answ; - } - } - /// - /// Verifica se la vc sia valida (ovvero almeno 2 valori e intervallo > window richiesta) - /// - public bool vcValid - { - get - { - return (flWindSize > windSize && numElem > 1); - } - } - - } - /// - /// GEstione dati di timing - /// - public static class TimingData - { - public static List results = new List(); - - /// - /// aggiorno vettore aggiungendo risultato - /// - /// Codice chiamante - /// Codice da registrare (univoco con chiamante) - /// Tempo esecuzione in ticks - public static void addResult(string caller, string codice, long ticks) - { - if (results.Count == 0) - { - results.Add(new TimeRec(caller, codice, ticks)); - } - int indice = -1; - for (int i = 0; i < results.Count; i++) - { - // se il codice è quello cercato... - if (results[i].codCall == codice && results[i].classCall == caller) - { - indice = i; - } - } - // se c'è aggiorno... - if (indice >= 0) - { - results[indice].numCall++; - results[indice].totMsec = results[indice].totMsec.Add(new TimeSpan(ticks)); - } - // altrimenti aggiungo... - else - { - results.Add(new TimeRec(caller, codice, ticks)); - } - } - /// - /// Resetta i dati registrati (ad avvio adapter...) - /// - public static void resetData() - { - results = new List(); - } - } - /// - /// Gestione Endianness - /// - public static class Endian - { - /// - /// Scambia MSB/LSB per 16bit - /// - /// - /// - public static UInt16 SwapUInt16(UInt16 inValue) - { - return (UInt16)(((inValue & 0xff00) >> 8) | - ((inValue & 0x00ff) << 8)); - } - - /// - /// Scambia MSB/LSB per 32bit - /// - /// - /// - public static UInt32 SwapUInt32(UInt32 inValue) - { - return ((inValue & 0xff000000) >> 24) | - ((inValue & 0x00ff0000) >> 8) | - ((inValue & 0x0000ff00) << 8) | - ((inValue & 0x000000ff) << 24); - } - } - /// - /// Tipologie di DUMP memoria - /// - public enum dumpType - { - /// - /// Salvataggio all'avvio aree memoria (con sovrascrittura) - /// - STARTUP, - /// - /// Campionamento periodico - /// - SAMPLE - } - /// - /// Tipologia di adapters ammessi - /// - public enum tipoAdapter - { - /// - /// Adapter SIMULAZIONE - /// - SIMULA, - /// - /// adapter FANUC - /// - FANUC, - /// - /// adapter KAWASAKI e-controller - /// - KAWASAKI, - /// - /// Adapter non specificato - /// - ND, - /// - /// Adapter MTConnect - /// - MTConnect, - /// - /// Adapter OMRON - /// - OMRON, - /// - /// Adapter OSAI CNDEX (Cndex) - /// - OSAI_CNDEX, - /// - /// Adapter OSAI OPEN (ws) - /// - OSAI_OPEN, - /// - /// Adapter OSAI VB6 - /// - OSAI_VB6, - /// - /// Adapter SIEMENS - /// - SIEMENS, - /// - /// Adapter SIEMENS, interfaccia versione APROCHIM (filtro liquidi rettifiche) - /// - SIEMENS_APROCHIM, - /// - /// Adapter SIEMENS, interfaccia versione VIPA @2001 - /// - SIEMENS_AT2001, - /// - /// Adapter SIEMENS, interfaccia versione FAPE (punzonatrici) - /// - SIEMENS_FAPE, - /// - /// Adapter SIEMENS, interfaccia versione COMUR (dentatrice) - /// - SIEMENS_COMUR, - /// - /// Adapter SIEMENS, interfaccia versione INGENIA (Valvital, Automazione) - /// - SIEMENS_INGENIA, - /// - /// Adapter SIEMENS, interfaccia versione LASCO (Valvital, Pressa Bilancere) - /// - SIEMENS_LASCO, - /// - /// Adapter SIEMENS, interfaccia versione PRESSOIL + CEI (Valvital, Pressa Idraulica) - /// - SIEMENS_PRESSOIL_CEI, - /// - /// Adapter SIEMENS, interfaccia versione SAET (Valvital, forni / tempra) - /// - SIEMENS_SAET, - /// - /// Adapter SIEMENS, interfaccia versione Torri - /// - SIEMENS_TORRI, - /// - /// Metodi di WPS WebPageScraping (es x compressori Atlas Copco) - /// - WPS - } - /// - /// Tipo di ciclo da processare - /// - public enum gatherCycle - { - /// - /// Very High Frequency (solo x invii...) - /// - VHF, - /// - /// lettura dati ad alta frequenza - /// - HF, - /// - /// lettura dati standard - /// - MF, - /// - /// lettura dati bassa freq - /// - LF, - /// - /// lettura dati bassissima priorità (re-sync stato allarmi) - /// - VLF - } - /// - /// Classe conf x item DynData - /// - public class DynDataItem - { - public string key { get; set; } = ""; - public string name { get; set; } = ""; - public string val { get; set; } = ""; - public string unit { get; set; } = ""; - public string func { get; set; } = ""; - public int sPeriod { get; set; } = 60; - /// - /// Valore effettivo da salvare - /// - public string actVal { get; set; } = ""; - /// - /// DataOra scadenza invio forzato - /// - public DateTime DTScad = DateTime.Now; - } - /// - /// Classe conf x decodifica stsatus - /// - public class StatusItem : DynDataItem - { - public Dictionary codeMapping; - } - /// - /// Classe conf server html - /// - public class srvData - { - public string baseUri { get; set; } = ""; - public string driverName { get; set; } = ""; - } - /// - /// Elenco oggetti del monitoraggio (DynData, Status) - /// - public class MonitoredItemsConf - { - public srvData SrvData { get; set; } - public List DynData { get; set; } - public List Status { get; set; } - } - /// - /// Configurazione per Eventi/Variabili - /// - public class EVData - { - /// - /// Unità di misura - /// - public string UM { get; set; } = "num"; - /// - /// Valore salvato - /// - public string Val { get; set; } = ""; - /// - /// DataOra scadenza invio forzato - /// - public DateTime DTScad = DateTime.Now; - } - /// - /// Configurazione per Variabili Casuali - /// - public class VCData - { - /// - /// Periodo di riferimento - /// - public int Period { get; set; } = 60; - /// - /// Tipologia di funzione da applicare - /// - public VC_func Funzione { get; set; } = VC_func.POINT; - /// - /// DataOra inizio periodo di elaborazione - /// - public DateTime DTStart; - /// - /// Array dati per calcolo - /// - public List dataArray; - } - - /// - /// informazioni di produzione - /// - public struct prodData - { - public string Operator; - - public bool Status; - public int AccTime; - public int Power; - public string FuncMode; - public bool EmrStop; - public string MessageCode; - public string MessageText; - - } - - - /// - /// Dato generico (per decodifica) - /// - public class otherData - { - public string codNum; - public string memAddr; - public string varName; - public string dataType; - public otherData() - { - codNum = ""; - memAddr = ""; - varName = ""; - dataType = ""; - } - public otherData(string _codNum, string _memAddr, string _varName, string _dataType) - { - codNum = _codNum; - memAddr = _memAddr; - varName = _varName; - dataType = _dataType; - } - } - /// - /// Classe che contiene tutte le NUOVE informaizoni da aggiornare sulla form - /// - public class newDisplayData - { - /// - /// Dati tipo IN (RAW) - /// - public string newInData { get; set; } = ""; - /// - /// Dati tipo Signal - /// - public string newSignalData { get; set; } = ""; - /// - /// Dati tipo FluxLog - /// - public string newFLogData { get; set; } = ""; - /// - /// Dati tipo UrlCall - /// - public string newUrlCallData { get; set; } = ""; - /// - /// Dati tipo LiveLog - /// - public string newLiveLogData { get; set; } = ""; - /// - /// Oggetto COUTNER generico (pezzi, portata...) - /// - public int counter { get; set; } = -9999; - /// - /// Bitmap attuale segnali letti - /// - public string currBitmap { get; set; } = ""; - /// - /// Stato semaforo IN verso PLC - /// - public Semaforo semIn { get; set; } = Semaforo.ND; - /// - /// Stato semaforo OUT verso MES - /// - public Semaforo semOut { get; set; } = Semaforo.ND; - /// - /// Verifica se contenga valori (NON default/empty) - /// - public bool hasData - { - get - { - bool answ = false; - // true se qualcosa NON E' come default - if (!string.IsNullOrWhiteSpace(newInData) || !string.IsNullOrWhiteSpace(newSignalData) || !string.IsNullOrWhiteSpace(newFLogData) || !string.IsNullOrWhiteSpace(newUrlCallData) || !string.IsNullOrWhiteSpace(newLiveLogData) || counter > -9999 || !string.IsNullOrWhiteSpace(currBitmap) || semIn != Semaforo.ND || semOut != Semaforo.ND) - { - answ = true; - } - return answ; - } - } - } - - /// - /// StFlag8: set di 8 bit (1 word) contente semaforo di variabili - /// - [Flags] - public enum StFlag8 : int - { - NONE = 0, - B0 = 1 << 0, - B1 = 1 << 1, - B2 = 1 << 2, - B3 = 1 << 3, - B4 = 1 << 4, - B5 = 1 << 5, - B6 = 1 << 6, - B7 = 1 << 7 - } - /// - /// StFlag32: set di 32 bit (4 word) contente semaforo di variabili - /// - [Flags] - public enum StFlag32 : int - { - NONE = 0, - B00 = 1 << 0, - B01 = 1 << 1, - B02 = 1 << 2, - B03 = 1 << 3, - B04 = 1 << 4, - B05 = 1 << 5, - B06 = 1 << 6, - B07 = 1 << 7, - B08 = 1 << 8, - B09 = 1 << 9, - B10 = 1 << 10, - B11 = 1 << 11, - B12 = 1 << 12, - B13 = 1 << 13, - B14 = 1 << 14, - B15 = 1 << 15, - B16 = 1 << 16, - B17 = 1 << 17, - B18 = 1 << 18, - B19 = 1 << 19, - B20 = 1 << 20, - B21 = 1 << 21, - B22 = 1 << 22, - B23 = 1 << 23, - B24 = 1 << 24, - B25 = 1 << 25, - B26 = 1 << 26, - B27 = 1 << 27, - B28 = 1 << 28, - B29 = 1 << 29, - B30 = 1 << 30, - B31 = 1 << 31 - } - /// - /// Enumerazione tipi di semaforo - /// - public enum Semaforo - { - /// - /// Stato non definito - /// - ND, - /// - /// Verde - /// - SV, - /// - /// Giallo - /// - SG, - /// - /// Rosso - /// - SR, - /// - /// Grigio/Spento - /// - SS - } - /// - /// Enumerazione tipi di tipi di URL x invio - /// - public enum urlType - { - /// - /// Salvataggio FluxLog (valori estesi che non provocano calcoli di macchine a stati, eventi...) - /// - FLog, - /// - /// INPUT segnali in ingresso (standard base MAPO) - /// - SignIN - } - - /// - /// Elenco STATI CNC OSAI - /// - public enum CNC_STATUS_OSAI - { - IDLE = 1, - CYCLE, - HODA, - RUNH, - HRUN, - ERRO, - WAIT, - RESET, - EMERG, - INPUT - } - /// - /// Elenco MODI CNC - /// - public enum CNC_MODE - { - /// - /// Non definito - /// - ND = 0, - /// - /// AUTOMATICO - /// - AUTO, - /// - /// EDIT (MEMORY EDIT) - /// - EDIT, - /// - /// MEN (MEMORY OPERATION) - /// - MEN, - /// - /// MDI (MANUAL DATA INPUT) - /// - MDI, - /// - /// HANDLE/INC (MANUAL HANDLE / INCREMENTAL FEED) - /// - HANDLE_INC, - /// - /// HOME - /// - HOME, - /// - /// JOG (MANUAL CONTINUOUS FEED) - /// - JOG, - /// - /// JOG MAN - /// - JOG_MAN, - /// - /// JOG_INC - /// - JOG_INC, - /// - /// PROFILE - /// - PROFILE, - /// - /// SEMI - /// - SEMI, - /// - /// THND (TEACH IN HANDLE) - /// - THND, - /// - /// TJOG (TEACH IN JOG) - /// - TJOG, - /// - /// RMT (DNC OPERATION) - /// - RMT, - /// - /// REF (MANUAL REFERENCE POSITION RETURN) - /// - REF - } } \ No newline at end of file diff --git a/IOB-WIN/IOB-WIN.csproj b/IOB-WIN/IOB-WIN.csproj index 91fd537f..21255258 100644 --- a/IOB-WIN/IOB-WIN.csproj +++ b/IOB-WIN/IOB-WIN.csproj @@ -113,6 +113,18 @@ ..\packages\S7netplus.0.1.9\lib\net40\S7.Net.dll + + ..\packages\ServiceStack.Common.4.0.62\lib\net40\ServiceStack.Common.dll + + + ..\packages\ServiceStack.Interfaces.4.0.62\lib\portable-wp80+sl5+net40+win8+wpa81+monotouch+monoandroid+xamarin.ios10\ServiceStack.Interfaces.dll + + + ..\packages\ServiceStack.Redis.4.0.62\lib\net40\ServiceStack.Redis.dll + + + ..\packages\ServiceStack.Text.4.0.62\lib\net40\ServiceStack.Text.dll + diff --git a/IOB-WIN/IobGeneric.cs b/IOB-WIN/IobGeneric.cs index a585bd82..a0f2366f 100644 --- a/IOB-WIN/IobGeneric.cs +++ b/IOB-WIN/IobGeneric.cs @@ -3389,71 +3389,80 @@ namespace IOB_WIN public bool forceSplitOdl() { bool fatto = false; - string fullUrl = ""; - string rawSplit = ""; - string IOB_MULTI_CNAME = ""; - string[] elencoMulti = null; - try + // eseguo SOLO SE sono online... + if (MPOnline && IobOnline) { - /*************************************************** - * Descrizione procedura (OK X SIMULATORI...) - * - * - chiamata su MP/IO - * - verifica che su DB sia abilitato AUTO ODL - * - il server inserisce un evento fine prod HW 1 minuto prima e inizio setup HW - * - viene duplicato e chiuso ODL corrente - * - viene fatto partire ODL nuovo ADESSO - * - num pezzi come ODL precedente (o da media 3 ODL precedenti) - * - conferme pezzi & co... gestione NULL (NON SERVONO si tratta di impianti SENZA gestione vera ODL) - * - reset contapezzi PLC locale... - * - * - * - * DA VALUTARE (x macchine tipo linea con + impianti... es valvital) SE - * - creare una gestione ALTERNATIVA sul server che preveda impianto LEADER e impianti follower (RIGIDAMENTE CONFIGURATI) - * - ogni volta che si fa setup LEADER --> si ripete su impianti FOLLOWER (eventi!!!) - * - viene fatto reset contapezzi sui follower (+ altre operazioni opzionali, ES imposstazione nome commessa, quantità, articolo...) - * - viene fatto reset + nuovo ODL (con stessi articoli e quantità) su follower, SENZA avere gestione x ODL di un codice esterno (quindi registra TUTTO ma NON RITORNERA' dati non avendo link verso esterno) - * - serve NUOVA TABELLA delle macchine LEADER | FOLLOWER (1:n) e gestione da MP/IO - * - * ***************************************************/ + string fullUrl = ""; + string rawSplit = ""; + string IOB_MULTI_CNAME = ""; + string[] elencoMulti = null; - if (isMulti) + try { - // devo chiamare cambio ODL x OGNI tavola: mi servono i parametri opzionali... - IOB_MULTI_CNAME = getOptPar("IOB_MULTI_CNAME"); - elencoMulti = IOB_MULTI_CNAME.Split(','); - } - // se normale splitto! - if (!isMulti) - { - // invio chiamata URL x reset ODL su macchina - rawSplit = callUrl(urlForceSplit, false); - fatto = (rawSplit == "OK") ? true : false; - } - // se multi gestisco il bit delle tavole... - else - { - foreach (string item in elencoMulti) + /*************************************************** + * Descrizione procedura (OK X SIMULATORI...) + * + * - chiamata su MP/IO + * - verifica che su DB sia abilitato AUTO ODL + * - il server inserisce un evento fine prod HW 1 minuto prima e inizio setup HW + * - viene duplicato e chiuso ODL corrente + * - viene fatto partire ODL nuovo ADESSO + * - num pezzi come ODL precedente (o da media 3 ODL precedenti) + * - conferme pezzi & co... gestione NULL (NON SERVONO si tratta di impianti SENZA gestione vera ODL) + * - reset contapezzi PLC locale... + * + * + * + * DA VALUTARE (x macchine tipo linea con + impianti... es valvital) SE + * - creare una gestione ALTERNATIVA sul server che preveda impianto LEADER e impianti follower (RIGIDAMENTE CONFIGURATI) + * - ogni volta che si fa setup LEADER --> si ripete su impianti FOLLOWER (eventi!!!) + * - viene fatto reset contapezzi sui follower (+ altre operazioni opzionali, ES imposstazione nome commessa, quantità, articolo...) + * - viene fatto reset + nuovo ODL (con stessi articoli e quantità) su follower, SENZA avere gestione x ODL di un codice esterno (quindi registra TUTTO ma NON RITORNERA' dati non avendo link verso esterno) + * - serve NUOVA TABELLA delle macchine LEADER | FOLLOWER (1:n) e gestione da MP/IO + * + * ***************************************************/ + + if (isMulti) { - // invio chiamata URL x reset ODL su macchina, ATTENZIONE scriviamo | al posto di "#" che in URL sarebbe filtrato... - fullUrl = $"{urlForceSplit}|{item}"; - rawSplit = callUrl(fullUrl, true); + // devo chiamare cambio ODL x OGNI tavola: mi servono i parametri opzionali... + IOB_MULTI_CNAME = getOptPar("IOB_MULTI_CNAME"); + elencoMulti = IOB_MULTI_CNAME.Split(','); + } + // se normale splitto! + if (!isMulti) + { + // invio chiamata URL x reset ODL su macchina + rawSplit = callUrl(urlForceSplit, false); + fatto = (rawSplit == "OK") ? true : false; + } + // se multi gestisco il bit delle tavole... + else + { + foreach (string item in elencoMulti) + { + // invio chiamata URL x reset ODL su macchina, ATTENZIONE scriviamo | al posto di "#" che in URL sarebbe filtrato... + fullUrl = $"{urlForceSplit}|{item}"; + rawSplit = callUrl(fullUrl, true); + } + fatto = (rawSplit == "OK") ? true : false; } - fatto = (rawSplit == "OK") ? true : false; - } + } + catch (Exception exc) + { + lgError($"Eccezione in forceSplitOdl{Environment.NewLine}{exc}"); + } + // se fatto --> resetto contapezzi!!! + if (fatto) + { + lastCountCNC = 0; + contapezzi = 0; + } } - catch (Exception exc) + else { - lgError($"Eccezione in forceSplitOdl{Environment.NewLine}{exc}"); - } - // se fatto --> resetto contapezzi!!! - if (fatto) - { - lastCountCNC = 0; - contapezzi = 0; + lgError("Richeisto forceSplitOdl ma MP/IOB offline --> NON eseguito"); } return fatto; } diff --git a/IOB-WIN/IobSimula.cs b/IOB-WIN/IobSimula.cs index 1571aba3..c4bf2327 100644 --- a/IOB-WIN/IobSimula.cs +++ b/IOB-WIN/IobSimula.cs @@ -416,7 +416,7 @@ namespace IOB_WIN DateTime.TryParse(rawDataInizio, out inizioOdl); if (DateTime.Now.Subtract(inizioOdl).TotalMinutes > minDurataODL) { - // invio reset ODL... + // invio reset ODL... forceSplitOdl(); } } diff --git a/IOB-WIN/MainForm.cs b/IOB-WIN/MainForm.cs index d55e118e..a70057a0 100644 --- a/IOB-WIN/MainForm.cs +++ b/IOB-WIN/MainForm.cs @@ -280,7 +280,7 @@ namespace IOB_WIN AutoUpdater.ShowRemindLaterButton = false; AutoUpdater.RunUpdateAsAdmin = utils.CRB("AUpdAsAdm"); AutoUpdater.ReportErrors = false; - AutoUpdater.DownloadPath = @"C:\Steawmare\src\"; + AutoUpdater.DownloadPath = @"C:\Steamware\src\"; AutoUpdater.ApplicationExitEvent += AutoUpdater_ApplicationExitEvent; AutoUpdater.Start(updateUrl); } diff --git a/IOB-WIN/packages.config b/IOB-WIN/packages.config index 93da5397..b9bf65c6 100644 --- a/IOB-WIN/packages.config +++ b/IOB-WIN/packages.config @@ -21,4 +21,8 @@ + + + + \ No newline at end of file