From 4a20a5ca757ca7d5cc7efab337a238f67a6454cc Mon Sep 17 00:00:00 2001 From: Samuele Locatelli Date: Fri, 9 Apr 2021 19:45:53 +0200 Subject: [PATCH 1/5] inizio modifica x gestire persistenza valori commessa x Valvital --- MP-TAB/SendParameters.aspx | 34 ++++------ MP-TAB/SendParameters.aspx.designer.cs | 64 +++++++++---------- MP-TAB/WebUserControls/mod_ODL.ascx.cs | 3 + .../mod_sendParameters.ascx.cs | 52 ++++++--------- MapoDb/DataLayer.cs | 33 +++++++++- MapoSDK/Enums.cs | 7 +- 6 files changed, 104 insertions(+), 89 deletions(-) diff --git a/MP-TAB/SendParameters.aspx b/MP-TAB/SendParameters.aspx index 42487249..0684ff64 100644 --- a/MP-TAB/SendParameters.aspx +++ b/MP-TAB/SendParameters.aspx @@ -4,31 +4,19 @@ <%@ Register Src="~/WebUserControls/mod_sendParameters.ascx" TagPrefix="uc1" TagName="mod_sendParameters" %> <%@ Register Src="~/WebUserControls/mod_dettMacchina.ascx" TagPrefix="uc1" TagName="mod_dettMacchina" %> - - -
-
-
- - - <%--
-
- Reg. SCARTI -
-
- Reg.CONTROLLI -
-
--%> -
-
- -
+
+
+
+ + +
+
+ +
+
-
- - - + \ No newline at end of file diff --git a/MP-TAB/SendParameters.aspx.designer.cs b/MP-TAB/SendParameters.aspx.designer.cs index c2822fd8..36a519bc 100644 --- a/MP-TAB/SendParameters.aspx.designer.cs +++ b/MP-TAB/SendParameters.aspx.designer.cs @@ -1,44 +1,44 @@ //------------------------------------------------------------------------------ -// -// Codice generato da uno strumento. +// +// This code was generated by a tool. // -// Le modifiche a questo file possono causare un comportamento non corretto e verranno perse se -// il codice viene rigenerato. -// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// //------------------------------------------------------------------------------ namespace MoonProTablet { - public partial class SendParameters - { + public partial class SendParameters + { - /// - /// Controllo mod_dettMacchina. - /// - /// - /// Campo generato automaticamente. - /// Per la modifica, spostare la dichiarazione di campo dal file di progettazione al file code-behind. - /// - protected global::MoonProTablet.WebUserControls.mod_dettMacchina mod_dettMacchina; + /// + /// mod_dettMacchina control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::MoonProTablet.WebUserControls.mod_dettMacchina mod_dettMacchina; - /// - /// Controllo mod_sendParameters. - /// - /// - /// Campo generato automaticamente. - /// Per la modifica, spostare la dichiarazione di campo dal file di progettazione al file code-behind. - /// - protected global::MoonProTablet.WebUserControls.mod_sendParameters mod_sendParameters; + /// + /// mod_sendParameters control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::MoonProTablet.WebUserControls.mod_sendParameters mod_sendParameters; - /// - /// Controllo mod_directLinks. - /// - /// - /// Campo generato automaticamente. - /// Per la modifica, spostare la dichiarazione di campo dal file di progettazione al file code-behind. - /// - protected global::MoonProTablet.WebUserControls.mod_directLinks mod_directLinks; - } + /// + /// mod_directLinks control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::MoonProTablet.WebUserControls.mod_directLinks mod_directLinks; + } } diff --git a/MP-TAB/WebUserControls/mod_ODL.ascx.cs b/MP-TAB/WebUserControls/mod_ODL.ascx.cs index 5dc90174..f4f3b072 100644 --- a/MP-TAB/WebUserControls/mod_ODL.ascx.cs +++ b/MP-TAB/WebUserControls/mod_ODL.ascx.cs @@ -857,6 +857,9 @@ namespace MoonProTablet.WebUserControls Response.Redirect("~/DettaglioMacchina.aspx"); } } + // invio task x end produzione... + DataLayerObj.addTask4Machine(idxMacchinaFix, taskType.endProd, ""); + // resetto ODL su redis... DataLayerObj.emptyCurrODL(idxMacchinaFix); // reset ODL!... diff --git a/MP-TAB/WebUserControls/mod_sendParameters.ascx.cs b/MP-TAB/WebUserControls/mod_sendParameters.ascx.cs index 5aba9a1c..f7497b3b 100644 --- a/MP-TAB/WebUserControls/mod_sendParameters.ascx.cs +++ b/MP-TAB/WebUserControls/mod_sendParameters.ascx.cs @@ -13,10 +13,29 @@ namespace MoonProTablet.WebUserControls { public partial class mod_sendParameters : BaseUserControl { + #region Protected Methods + + protected void grView_RowEditing(object sender, GridViewEditEventArgs e) + { + } + + protected void grView_RowUpdating(object sender, GridViewUpdateEventArgs e) + { + } + + protected void lbtReload_Click(object sender, EventArgs e) + { + grView.DataBind(); + } + protected void Page_Load(object sender, EventArgs e) { } + #endregion Protected Methods + + #region Public Methods + /// /// wrapper recupero parametri macchina /// @@ -53,38 +72,7 @@ namespace MoonProTablet.WebUserControls DataLayerObj.updateMachineParameter(idxMacchina, Original_uid, reqValue); } } - protected void lbtReload_Click(object sender, EventArgs e) - { - grView.DataBind(); - } - protected void grView_RowUpdating(object sender, GridViewUpdateEventArgs e) - { -#if false - var txtReqVal = grView.Rows[e.RowIndex].FindControl("txtReqValue") as TextBox; - string Original_uid = e.Keys[0].ToString(); - // recupero items... - List dcList = DataLayer.getCurrObjItems(idxMacchina); - // cerco quello da aggiornare - objItem trovato = dcList.Find(obj => obj.uid == Original_uid); - List list2Update = new List(); - // se trovato procedo - if (trovato != null) - { - // aggiorno valore richiesto + dt richiesta - trovato.reqValue = txtReqVal.Text.Trim(); - trovato.lastRequest = DateTime.Now; - list2Update.Add(trovato); - DataLayer.upsertCurrObjItems(idxMacchina, list2Update); - // accodo in task 2 exe la richiesta di processing - DataLayer.addTask4Machine(idxMacchina, taskType.setParameter, trovato.uid); - } -#endif - } - - protected void grView_RowEditing(object sender, GridViewEditEventArgs e) - { - - } + #endregion Public Methods } } \ No newline at end of file diff --git a/MapoDb/DataLayer.cs b/MapoDb/DataLayer.cs index 3d6e9cac..79c26bd4 100644 --- a/MapoDb/DataLayer.cs +++ b/MapoDb/DataLayer.cs @@ -786,6 +786,16 @@ namespace MapoDb return mHash(string.Format("PzCount:{0}", idxMacchina)); } + /// + /// Hash dati SAVED (EXE) TASK x la macchina specificata x poter ripristinare in caso di perdita valore WRITE + /// + /// + /// + public static string savedTaskHash(string idxMacchina) + { + return mHash(string.Format("SavedTask:{0}", idxMacchina)); + } + /// /// Hash dati STATUS x la macchina specificata. /// - dati ODL @@ -842,15 +852,36 @@ namespace MapoDb { bool answ = false; string currHash = exeTaskHash(idxMacchina); + string currSavedParHash = savedTaskHash(idxMacchina); + Dictionary currTask = new Dictionary(); try { // leggo task attuali... - var currTask = mTaskMacchina(idxMacchina); + currTask = mTaskMacchina(idxMacchina); currTask[taskKey.ToString()] = taskVal; answ = memLayer.ML.redSaveHashDict(currHash, currTask); logger.lg.scriviLog($"Task ADD - idxMacchina: {idxMacchina} | taskKey: {taskKey.ToString()} | taskVal: {taskVal}"); } catch { } + // verifico in base al tipo di task se fare backup... + switch (taskKey) + { + case taskType.setArt: + case taskType.setComm: + case taskType.setPzComm: + case taskType.setProg: + answ = memLayer.ML.redSaveHashDict(currSavedParHash, currTask); + break; + + case taskType.endProd: + // salvo un DICT vuoto x resettare + currTask = new Dictionary(); + answ = memLayer.ML.redSaveHashDict(currSavedParHash, currTask); + break; + + default: + break; + } return answ; } diff --git a/MapoSDK/Enums.cs b/MapoSDK/Enums.cs index 41535fca..63196da3 100644 --- a/MapoSDK/Enums.cs +++ b/MapoSDK/Enums.cs @@ -173,7 +173,12 @@ /// /// Richiesta invio watchdog a PLC /// - sendWatchDogMes2Plc + sendWatchDogMes2Plc, + + /// + /// Indica che è FINITA la produzione (e quindi cancello dati backup) + /// + endProd, } /// From ba168aad25ddd301435c18fc9166f9f53f22d0bb Mon Sep 17 00:00:00 2001 From: Samuele Locatelli Date: Sat, 10 Apr 2021 10:04:46 +0200 Subject: [PATCH 2/5] check su setObjItems e flogJson --> addCheckTask4Machine x resend PLC --- MP-IO/Controllers/IOBController.cs | 6 ++ MapoDb/DataLayer.cs | 133 ++++++++++++++++------------- 2 files changed, 81 insertions(+), 58 deletions(-) diff --git a/MP-IO/Controllers/IOBController.cs b/MP-IO/Controllers/IOBController.cs index 062413e3..35838081 100644 --- a/MP-IO/Controllers/IOBController.cs +++ b/MP-IO/Controllers/IOBController.cs @@ -280,6 +280,12 @@ namespace MP_IO.Controllers // aggiorno valore e data trovato.value = item.valore; trovato.lastRead = DateTime.Now; + // se fosse un valore WRITE e mi ha dato un valore vuoto --> mando un fix x riscrittura + if (trovato.writable && string.IsNullOrEmpty(item.valore)) + { + taskType currTask = (taskType)Enum.Parse(typeof(taskType), trovato.uid); + DataLayerObj.addCheckTask4Machine(id, currTask, item.valore); + } } // altrimenti AGGIUNGO (READ ONLY)... else diff --git a/MapoDb/DataLayer.cs b/MapoDb/DataLayer.cs index 79c26bd4..0983af42 100644 --- a/MapoDb/DataLayer.cs +++ b/MapoDb/DataLayer.cs @@ -819,6 +819,39 @@ namespace MapoDb return mHash($"VetoOdlMacc:{idxMacchina}"); } + /// + /// verifica se sia da reinviare un task alla macchina dall'elenco di quelli salvati (in modalità upsert) se non scaduti + /// + /// + /// + /// + /// + public bool addCheckTask4Machine(string idxMacchina, taskType taskKey, string taskVal) + { + bool answ = false; + string currHash = exeTaskHash(idxMacchina); + try + { + Dictionary savedTask = mSavedTaskMacchina(idxMacchina); + // cerco valore saved + string savedVal = savedTask[taskKey.ToString()]; + // se ho un valore != "" --> rimetto in coda di invio... + if (!string.IsNullOrEmpty(savedVal)) + { + // leggo task attuali... + Dictionary currTask = mTaskMacchina(idxMacchina); + // rimetto in task da eseguire... + currTask[taskKey.ToString()] = savedVal; + answ = memLayer.ML.redSaveHashDict(currHash, currTask); + } + } + catch + { } + // chiamo update come task di scrittura + + return answ; + } + /// /// Aggiunge un PARAMETRO OPZIONALE all'elenco di quelli salvati (in modalità upsert) /// @@ -854,6 +887,7 @@ namespace MapoDb string currHash = exeTaskHash(idxMacchina); string currSavedParHash = savedTaskHash(idxMacchina); Dictionary currTask = new Dictionary(); + Dictionary savedTask = new Dictionary(); try { // leggo task attuali... @@ -870,13 +904,16 @@ namespace MapoDb case taskType.setComm: case taskType.setPzComm: case taskType.setProg: - answ = memLayer.ML.redSaveHashDict(currSavedParHash, currTask); + // leggo task SALVATI attuali... + savedTask = mSavedTaskMacchina(idxMacchina); + savedTask[taskKey.ToString()] = taskVal; + answ = memLayer.ML.redSaveHashDict(currSavedParHash, savedTask); break; case taskType.endProd: // salvo un DICT vuoto x resettare - currTask = new Dictionary(); - answ = memLayer.ML.redSaveHashDict(currSavedParHash, currTask); + savedTask = new Dictionary(); + answ = memLayer.ML.redSaveHashDict(currSavedParHash, savedTask); break; default: @@ -1962,6 +1999,28 @@ namespace MapoDb return answ; } + /// + /// Restitusice elenco KVP dei TASK SALVATI (da passare a IOB-WIN) per l'impianto indicato + /// + /// + /// + public Dictionary mSavedTaskMacchina(string idxMacchina) + { + // hard coded dimensione vettore DatiMacchine + Dictionary answ = new Dictionary(); + // ORA recupero da memoria redis... + try + { + string currHash = savedTaskHash(idxMacchina); + answ = memLayer.ML.redGetHashDict(currHash); + } + catch (Exception exc) + { + logger.lg.scriviLog(string.Format("Errore in recupero dati SAVED TASK x Redis mSavedTaskMacchina - idxMacchina {2}:{0}{1}", Environment.NewLine, exc, idxMacchina)); + } + return answ; + } + /// /// Restitusice elenco KVP /// key: IdxMacchina @@ -2041,7 +2100,7 @@ namespace MapoDb } catch (Exception exc) { - logger.lg.scriviLog(string.Format("Errore in compilazione dati EXE TASK x Redis - idxMacchina {2}:{0}{1}", Environment.NewLine, exc, idxMacchina)); + logger.lg.scriviLog(string.Format("Errore in recupero dati EXE TASK x Redis mTaskMacchina - idxMacchina {2}:{0}{1}", Environment.NewLine, exc, idxMacchina)); } return answ; } @@ -3364,6 +3423,17 @@ namespace MapoDb { string serVal = JsonConvert.SerializeObject(currValues); memLayer.ML.setRSV(currParametersHash(idxMacchina), serVal); + + // controllo se ha valori write... + foreach (var item in currValues) + { + // se fosse un valore WRITE e mi ha dato un valore vuoto --> mando un fix x riscrittura + if (item.writable && string.IsNullOrEmpty(item.value)) + { + taskType currTask = (taskType)Enum.Parse(typeof(taskType), item.uid); + addCheckTask4Machine(idxMacchina, currTask, item.value); + } + } } return answ; } @@ -3498,57 +3568,4 @@ namespace MapoDb #endregion Public Methods } -} - -#if false - -/// -/// Elenco task ammessi (x IOB-WIN da eseguire...) -/// -public enum taskType { - /// - /// Task nullo / fake - /// - nihil, - /// - /// Rimanda a PLC eventuale segnale NON in setup (MA NON RESETTA) - /// - fixStopSetup, - /// - /// Indica al PLC di forzare il reset del contapezzi - /// - forceResetPzCount, - /// - /// Indica al PLC di forzare il NUOVO valore di contapezzi (impostato come value) - /// - forceSetPzCount, - /// - /// Imposta Articolo su PLC - /// - setArt, - /// - /// Imposta Commessa su PLC - /// - setComm, - /// - /// Set Programma CNC su PLC - /// - setProg, - /// - /// Indica al PLC iniziato setup (e secondo casi ferma contapezzi /resetta) - /// - startSetup, - /// - /// Indica al PLC finito setup (e secondo casi ferma contapezzi /resetta) - /// - stopSetup, - /// - /// Richiesta invio watchdog a PLC - /// - sendWatchDogMes2Plc -} -public enum tipoSelettore { - articoli -} - -#endif \ No newline at end of file +} \ No newline at end of file From 895eafd8ac79a31a7626bcfd5cdf335aa82e6618 Mon Sep 17 00:00:00 2001 From: Samuele Locatelli Date: Sat, 10 Apr 2021 10:21:30 +0200 Subject: [PATCH 3/5] new rel --- Jenkinsfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Jenkinsfile b/Jenkinsfile index 654328a5..9ce500e0 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -13,7 +13,7 @@ pipeline { steps { /* calcolo numero versione... diverso x branch MASTER/DEVELOP */ script { - withEnv(['NEXT_BUILD_NUMBER=1410']) { + withEnv(['NEXT_BUILD_NUMBER=1411']) { // env.versionNumber = VersionNumber(versionNumberString : '6.13.${BUILD_DATE_FORMATTED, "yyMM"}.${BUILDS_ALL_TIME}', projectStartDate : '2006-01-01', skipFailedBuilds: true) env.versionNumber = VersionNumber(versionNumberString : '6.13.${BUILD_DATE_FORMATTED, "yyMM"}.${BUILDS_ALL_TIME}', projectStartDate : '2006-01-01', skipFailedBuilds: true, overrideBuildsAllTime: '${NEXT_BUILD_NUMBER}') env.APP_NAME = 'MAPO' From 10c664c2d31c1ea0c272477a10292796147dd31b Mon Sep 17 00:00:00 2001 From: Samuele Locatelli Date: Sat, 10 Apr 2021 10:26:18 +0200 Subject: [PATCH 4/5] ulteriuore controllo variazione valore saved --- MapoDb/DataLayer.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/MapoDb/DataLayer.cs b/MapoDb/DataLayer.cs index 0983af42..800333df 100644 --- a/MapoDb/DataLayer.cs +++ b/MapoDb/DataLayer.cs @@ -836,7 +836,7 @@ namespace MapoDb // cerco valore saved string savedVal = savedTask[taskKey.ToString()]; // se ho un valore != "" --> rimetto in coda di invio... - if (!string.IsNullOrEmpty(savedVal)) + if (!string.IsNullOrEmpty(savedVal) && (savedVal != taskVal)) { // leggo task attuali... Dictionary currTask = mTaskMacchina(idxMacchina); From fedd0264b8e5201fe9402cf92084fd0d47b6188c Mon Sep 17 00:00:00 2001 From: Samuele Locatelli Date: Sat, 10 Apr 2021 10:34:34 +0200 Subject: [PATCH 5/5] Aggiunto log x gestione reissue task --- MapoDb/DataLayer.cs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/MapoDb/DataLayer.cs b/MapoDb/DataLayer.cs index 800333df..b20e56fd 100644 --- a/MapoDb/DataLayer.cs +++ b/MapoDb/DataLayer.cs @@ -830,6 +830,7 @@ namespace MapoDb { bool answ = false; string currHash = exeTaskHash(idxMacchina); + logger.lg.scriviLog($"addCheckTask4Machine idxMacchina: {idxMacchina} | taskKey: {taskKey} | taskVal: {taskVal}"); try { Dictionary savedTask = mSavedTaskMacchina(idxMacchina); @@ -843,6 +844,7 @@ namespace MapoDb // rimetto in task da eseguire... currTask[taskKey.ToString()] = savedVal; answ = memLayer.ML.redSaveHashDict(currHash, currTask); + logger.lg.scriviLog($"re-issued task4machine: idxMacchina: {idxMacchina} | taskKey: {taskKey} | savedVal: {savedVal}"); } } catch @@ -894,7 +896,7 @@ namespace MapoDb currTask = mTaskMacchina(idxMacchina); currTask[taskKey.ToString()] = taskVal; answ = memLayer.ML.redSaveHashDict(currHash, currTask); - logger.lg.scriviLog($"Task ADD - idxMacchina: {idxMacchina} | taskKey: {taskKey.ToString()} | taskVal: {taskVal}"); + logger.lg.scriviLog($"Task ADD - idxMacchina: {idxMacchina} | taskKey: {taskKey} | taskVal: {taskVal}"); } catch { } // verifico in base al tipo di task se fare backup...